grammar: accept annonymous label
authorJean Privat <jean@pryen.org>
Wed, 18 Jun 2014 01:51:35 +0000 (21:51 -0400)
committerJean Privat <jean@pryen.org>
Wed, 16 Jul 2014 20:56:48 +0000 (16:56 -0400)
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>

src/parser/nit.sablecc3xx
src/parser/parser_nodes.nit

index 5d97179..c72928b 100644 (file)
@@ -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
index 5cdf527..768597f 100644 (file)
@@ -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