From: Jean Privat Date: Wed, 18 Jun 2014 01:51:35 +0000 (-0400) Subject: grammar: accept annonymous label X-Git-Tag: v0.6.7~52^2~8 X-Git-Url: http://nitlanguage.org grammar: accept annonymous label 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 --- diff --git a/src/parser/nit.sablecc3xx b/src/parser/nit.sablecc3xx index 5d97179..c72928b 100644 --- a/src/parser/nit.sablecc3xx +++ b/src/parser/nit.sablecc3xx @@ -411,9 +411,9 @@ stmt~withelse~noexpr~nopar {-> 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)} - | {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} @@ -426,11 +426,7 @@ stmt~withelse~noexpr~nopar {-> expr} | {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)} - ; +label= kwlabel id?; vardecl~withelse{-> expr} = kwvar id annotations? typing_o {-> New expr.vardecl(kwvar, id, typing_o.type, Null, Null, annotations)} @@ -794,14 +790,14 @@ param = id type? dotdotdot? annotations? type = kwnullable? [id]:classid [types]:type* annotations?; -label = kwlabel id; +label = kwlabel id?; expr = {block} expr* kwend? | {vardecl} kwvar id type? assign? expr? annotations? | {return} kwreturn? expr? - | {break} kwbreak label? expr? + | {break} kwbreak label? | {abort} kwabort - | {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 diff --git a/src/parser/parser_nodes.nit b/src/parser/parser_nodes.nit index 5cdf527..768597f 100644 --- a/src/parser/parser_nodes.nit +++ b/src/parser/parser_nodes.nit @@ -1399,9 +1399,9 @@ class ALabel 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 init do end end