Often, a single label is needed, for aborting some neested loops for
instance. But the programmer was forced to still gives a name to a
label. This yielded to crasy or useless names,
The proposal is to allow anonymous label.
Eg. in the following, the break breaks the x loop
~~~
for x in xs do
for y in ys do
stuff
if something then break label
end
stuff
end label
~~~
Note: by the way, valued breaks and continues are removed.
Signed-off-by: Jean Privat <jean@pryen.org>
= {vardecl} vardecl~withelse {-> vardecl~withelse.expr}
| {assign} assignment~withelse~nopar {-> assignment~withelse~nopar.expr}
| {return} kwreturn expr_final~withelse? {-> New expr.return(kwreturn, expr_final~withelse.expr)}
= {vardecl} vardecl~withelse {-> vardecl~withelse.expr}
| {assign} assignment~withelse~nopar {-> assignment~withelse~nopar.expr}
| {return} kwreturn expr_final~withelse? {-> New expr.return(kwreturn, expr_final~withelse.expr)}
- | {break} kwbreak label? expr_final~withelse? {-> New expr.break(kwbreak, label, expr_final~withelse.expr)}
+ | {break} kwbreak label? {-> New expr.break(kwbreak, label)}
| {abort} kwabort {-> New expr.abort(kwabort)}
| {abort} kwabort {-> New expr.abort(kwabort)}
- | {continue} kwcontinue label? expr_final~withelse? {-> New expr.continue(kwcontinue, label, expr_final~withelse.expr)}
+ | {continue} kwcontinue label? {-> New expr.continue(kwcontinue, label)}
| {do} do~withelse {-> do~withelse.expr}
!noexpr | {if} if~withelse {-> if~withelse.expr}
| {while} while~withelse {-> while~withelse.expr}
| {do} do~withelse {-> do~withelse.expr}
!noexpr | {if} if~withelse {-> if~withelse.expr}
| {while} while~withelse {-> while~withelse.expr}
| {debug_type_is} kwdebug kwtype type column expr_final~withelse {-> New expr.debug_type(kwdebug, kwtype, expr_final~withelse.expr, type) }
;
| {debug_type_is} kwdebug kwtype type column expr_final~withelse {-> New expr.debug_type(kwdebug, kwtype, expr_final~withelse.expr, type) }
;
-label= kwlabel id;
-
-assign_continue~withelse{-> expr}
- = expr_final~withelse {-> New expr.continue(Null, Null, expr_final~withelse.expr)}
- ;
vardecl~withelse{-> expr}
= kwvar id annotations? typing_o {-> New expr.vardecl(kwvar, id, typing_o.type, Null, Null, annotations)}
vardecl~withelse{-> expr}
= kwvar id annotations? typing_o {-> New expr.vardecl(kwvar, id, typing_o.type, Null, Null, annotations)}
type = kwnullable? [id]:classid [types]:type* annotations?;
type = kwnullable? [id]:classid [types]:type* annotations?;
expr = {block} expr* kwend?
| {vardecl} kwvar id type? assign? expr? annotations?
| {return} kwreturn? expr?
expr = {block} expr* kwend?
| {vardecl} kwvar id type? assign? expr? annotations?
| {return} kwreturn? expr?
- | {break} kwbreak label? expr?
+ | {break} kwbreak label?
- | {continue} kwcontinue? label? expr?
+ | {continue} kwcontinue? label?
| {do} kwdo [block]:expr? label?
| {if} kwif expr [then]:expr? [else]:expr?
| {ifexpr} kwif expr kwthen [then]:expr kwelse [else]:expr
| {do} kwdo [block]:expr? label?
| {if} kwif expr [then]:expr? [else]:expr?
| {ifexpr} kwif expr kwthen [then]:expr kwelse [else]:expr
var _n_kwlabel: TKwlabel
fun n_kwlabel: TKwlabel do return _n_kwlabel
fun n_kwlabel=(n_kwlabel: TKwlabel) do _n_kwlabel = n_kwlabel
var _n_kwlabel: TKwlabel
fun n_kwlabel: TKwlabel do return _n_kwlabel
fun n_kwlabel=(n_kwlabel: TKwlabel) do _n_kwlabel = n_kwlabel
- var _n_id: TId
- fun n_id: TId do return _n_id
- fun n_id=(n_id: TId) do _n_id = n_id
+ var _n_id: nullable TId
+ fun n_id: nullable TId do return _n_id
+ fun n_id=(n_id: nullable TId) do _n_id = n_id