syntax: add 'loop' construction
[nit.git] / src / parser / parser_prod.nit
index d9929e7..885fa97 100644 (file)
@@ -42,18 +42,10 @@ redef class Token
 end
 
 redef class Prod
-       # The first token of the production node
-       readable writable var _first_token: nullable Token
-
-       # The last token of the production node
-       readable writable var _last_token: nullable Token
-
        redef fun replace_with(n: ANode)
         do
                 super
                 assert n isa Prod
-                n.first_token = first_token
-                n.last_token = last_token
                 n.location = location
         end
 end
@@ -1270,19 +1262,10 @@ redef class AAttrPropdef
         _n_visibility = n
        n.parent = self
     end
-    redef fun n_kwattr=(n)
-    do
-        _n_kwattr = n
-        if n != null then
-           n.parent = self
-        end
-    end
     redef fun n_kwvar=(n)
     do
         _n_kwvar = n
-        if n != null then
-           n.parent = self
-        end
+       n.parent = self
     end
     redef fun n_id=(n)
     do
@@ -1312,7 +1295,6 @@ redef class AAttrPropdef
             n_writable: nullable AAble,
             n_kwredef: nullable TKwredef,
             n_visibility: nullable AVisibility,
-            n_kwattr: nullable TKwattr,
             n_kwvar: nullable TKwvar,
             n_id: nullable TAttrid,
             n_type: nullable AType,
@@ -1338,14 +1320,8 @@ redef class AAttrPropdef
        end
         _n_visibility = n_visibility.as(not null)
        n_visibility.parent = self
-        _n_kwattr = n_kwattr
-       if n_kwattr != null then
-               n_kwattr.parent = self
-       end
-        _n_kwvar = n_kwvar
-       if n_kwvar != null then
-               n_kwvar.parent = self
-       end
+        _n_kwvar = n_kwvar.as(not null)
+       n_kwvar.parent = self
         _n_id = n_id.as(not null)
        n_id.parent = self
         _n_type = n_type
@@ -1410,23 +1386,13 @@ redef class AAttrPropdef
             end
             return
        end
-        if _n_kwattr == old_child then
-            if new_child != null then
-                new_child.parent = self
-               assert new_child isa TKwattr
-                _n_kwattr = new_child
-           else
-               _n_kwattr = null
-            end
-            return
-       end
         if _n_kwvar == old_child then
             if new_child != null then
                 new_child.parent = self
                assert new_child isa TKwvar
                 _n_kwvar = new_child
            else
-               _n_kwvar = null
+               abort
             end
             return
        end
@@ -1477,12 +1443,7 @@ redef class AAttrPropdef
             v.enter_visit(_n_kwredef.as(not null))
         end
         v.enter_visit(_n_visibility)
-        if _n_kwattr != null then
-            v.enter_visit(_n_kwattr.as(not null))
-        end
-        if _n_kwvar != null then
-            v.enter_visit(_n_kwvar.as(not null))
-        end
+        v.enter_visit(_n_kwvar)
         v.enter_visit(_n_id)
         if _n_type != null then
             v.enter_visit(_n_type.as(not null))
@@ -1507,12 +1468,7 @@ redef class AAttrPropdef
             v.enter_visit(_n_kwredef.as(not null))
         end
         v.enter_visit(_n_visibility)
-        if _n_kwattr != null then
-            v.enter_visit(_n_kwattr.as(not null))
-        end
-        if _n_kwvar != null then
-            v.enter_visit(_n_kwvar.as(not null))
-        end
+        v.enter_visit(_n_kwvar)
         v.enter_visit(_n_id)
         if _n_type != null then
             v.enter_visit(_n_type.as(not null))
@@ -3875,11 +3831,6 @@ redef class AParam
     end
 end
 redef class AClosureDecl
-    redef fun n_kwwith=(n)
-    do
-        _n_kwwith = n
-       n.parent = self
-    end
     redef fun n_kwbreak=(n)
     do
         _n_kwbreak = n
@@ -3887,6 +3838,11 @@ redef class AClosureDecl
            n.parent = self
         end
     end
+    redef fun n_bang=(n)
+    do
+        _n_bang = n
+       n.parent = self
+    end
     redef fun n_id=(n)
     do
         _n_id = n
@@ -3908,20 +3864,20 @@ redef class AClosureDecl
     private init empty_init do end
 
     init init_aclosuredecl (
-            n_kwwith: nullable TKwwith,
             n_kwbreak: nullable TKwbreak,
+            n_bang: nullable TBang,
             n_id: nullable TId,
             n_signature: nullable ASignature,
             n_expr: nullable AExpr
     )
     do
         empty_init
-        _n_kwwith = n_kwwith.as(not null)
-       n_kwwith.parent = self
         _n_kwbreak = n_kwbreak
        if n_kwbreak != null then
                n_kwbreak.parent = self
        end
+        _n_bang = n_bang.as(not null)
+       n_bang.parent = self
         _n_id = n_id.as(not null)
        n_id.parent = self
         _n_signature = n_signature.as(not null)
@@ -3934,23 +3890,23 @@ redef class AClosureDecl
 
     redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
-        if _n_kwwith == old_child then
+        if _n_kwbreak == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa TKwwith
-                _n_kwwith = new_child
+               assert new_child isa TKwbreak
+                _n_kwbreak = new_child
            else
-               abort
+               _n_kwbreak = null
             end
             return
        end
-        if _n_kwbreak == old_child then
+        if _n_bang == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa TKwbreak
-                _n_kwbreak = new_child
+               assert new_child isa TBang
+                _n_bang = new_child
            else
-               _n_kwbreak = null
+               abort
             end
             return
        end
@@ -3988,10 +3944,10 @@ redef class AClosureDecl
 
     redef fun visit_all(v: Visitor)
     do
-        v.enter_visit(_n_kwwith)
         if _n_kwbreak != null then
             v.enter_visit(_n_kwbreak.as(not null))
         end
+        v.enter_visit(_n_bang)
         v.enter_visit(_n_id)
         v.enter_visit(_n_signature)
         if _n_expr != null then
@@ -4001,10 +3957,10 @@ redef class AClosureDecl
 
     redef fun visit_all_reverse(v: Visitor)
     do
-        v.enter_visit(_n_kwwith)
         if _n_kwbreak != null then
             v.enter_visit(_n_kwbreak.as(not null))
         end
+        v.enter_visit(_n_bang)
         v.enter_visit(_n_id)
         v.enter_visit(_n_signature)
         if _n_expr != null then
@@ -4372,7 +4328,9 @@ redef class AReturnExpr
     redef fun n_kwreturn=(n)
     do
         _n_kwreturn = n
-       n.parent = self
+        if n != null then
+           n.parent = self
+        end
     end
     redef fun n_expr=(n)
     do
@@ -4390,8 +4348,10 @@ redef class AReturnExpr
     )
     do
         empty_init
-        _n_kwreturn = n_kwreturn.as(not null)
-       n_kwreturn.parent = self
+        _n_kwreturn = n_kwreturn
+       if n_kwreturn != null then
+               n_kwreturn.parent = self
+       end
         _n_expr = n_expr
        if n_expr != null then
                n_expr.parent = self
@@ -4406,7 +4366,7 @@ redef class AReturnExpr
                assert new_child isa TKwreturn
                 _n_kwreturn = new_child
            else
-               abort
+               _n_kwreturn = null
             end
             return
        end
@@ -4424,7 +4384,9 @@ redef class AReturnExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.enter_visit(_n_kwreturn)
+        if _n_kwreturn != null then
+            v.enter_visit(_n_kwreturn.as(not null))
+        end
         if _n_expr != null then
             v.enter_visit(_n_expr.as(not null))
         end
@@ -4432,7 +4394,9 @@ redef class AReturnExpr
 
     redef fun visit_all_reverse(v: Visitor)
     do
-        v.enter_visit(_n_kwreturn)
+        if _n_kwreturn != null then
+            v.enter_visit(_n_kwreturn.as(not null))
+        end
         if _n_expr != null then
             v.enter_visit(_n_expr.as(not null))
         end
@@ -4582,7 +4546,9 @@ redef class AContinueExpr
     redef fun n_kwcontinue=(n)
     do
         _n_kwcontinue = n
-       n.parent = self
+        if n != null then
+           n.parent = self
+        end
     end
     redef fun n_label=(n)
     do
@@ -4608,8 +4574,10 @@ redef class AContinueExpr
     )
     do
         empty_init
-        _n_kwcontinue = n_kwcontinue.as(not null)
-       n_kwcontinue.parent = self
+        _n_kwcontinue = n_kwcontinue
+       if n_kwcontinue != null then
+               n_kwcontinue.parent = self
+       end
         _n_label = n_label
        if n_label != null then
                n_label.parent = self
@@ -4628,7 +4596,7 @@ redef class AContinueExpr
                assert new_child isa TKwcontinue
                 _n_kwcontinue = new_child
            else
-               abort
+               _n_kwcontinue = null
             end
             return
        end
@@ -4656,7 +4624,9 @@ redef class AContinueExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.enter_visit(_n_kwcontinue)
+        if _n_kwcontinue != null then
+            v.enter_visit(_n_kwcontinue.as(not null))
+        end
         if _n_label != null then
             v.enter_visit(_n_label.as(not null))
         end
@@ -4667,7 +4637,9 @@ redef class AContinueExpr
 
     redef fun visit_all_reverse(v: Visitor)
     do
-        v.enter_visit(_n_kwcontinue)
+        if _n_kwcontinue != null then
+            v.enter_visit(_n_kwcontinue.as(not null))
+        end
         if _n_label != null then
             v.enter_visit(_n_label.as(not null))
         end
@@ -5172,6 +5144,104 @@ redef class AWhileExpr
         end
     end
 end
+redef class ALoopExpr
+    redef fun n_kwloop=(n)
+    do
+        _n_kwloop = n
+       n.parent = self
+    end
+    redef fun n_block=(n)
+    do
+        _n_block = n
+        if n != null then
+           n.parent = self
+        end
+    end
+    redef fun n_label=(n)
+    do
+        _n_label = n
+        if n != null then
+           n.parent = self
+        end
+    end
+
+    private init empty_init do end
+
+    init init_aloopexpr (
+            n_kwloop: nullable TKwloop,
+            n_block: nullable AExpr,
+            n_label: nullable ALabel
+    )
+    do
+        empty_init
+        _n_kwloop = n_kwloop.as(not null)
+       n_kwloop.parent = self
+        _n_block = n_block
+       if n_block != null then
+               n_block.parent = self
+       end
+        _n_label = n_label
+       if n_label != null then
+               n_label.parent = self
+       end
+    end
+
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+    do
+        if _n_kwloop == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TKwloop
+                _n_kwloop = new_child
+           else
+               abort
+            end
+            return
+       end
+        if _n_block == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExpr
+                _n_block = new_child
+           else
+               _n_block = null
+            end
+            return
+       end
+        if _n_label == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa ALabel
+                _n_label = new_child
+           else
+               _n_label = null
+            end
+            return
+       end
+    end
+
+    redef fun visit_all(v: Visitor)
+    do
+        v.enter_visit(_n_kwloop)
+        if _n_block != null then
+            v.enter_visit(_n_block.as(not null))
+        end
+        if _n_label != null then
+            v.enter_visit(_n_label.as(not null))
+        end
+    end
+
+    redef fun visit_all_reverse(v: Visitor)
+    do
+        v.enter_visit(_n_kwloop)
+        if _n_block != null then
+            v.enter_visit(_n_block.as(not null))
+        end
+        if _n_label != null then
+            v.enter_visit(_n_label.as(not null))
+        end
+    end
+end
 redef class AForExpr
     redef fun n_kwfor=(n)
     do
@@ -9436,15 +9506,22 @@ redef class AMinusAssignOp
     end
 end
 redef class AClosureDef
-    redef fun n_kwwith=(n)
+    redef fun n_bang=(n)
     do
-        _n_kwwith = n
+        _n_bang = n
+       n.parent = self
+    end
+    redef fun n_id=(n)
+    do
+        _n_id = n
        n.parent = self
     end
     redef fun n_kwdo=(n)
     do
         _n_kwdo = n
-       n.parent = self
+        if n != null then
+           n.parent = self
+        end
     end
     redef fun n_expr=(n)
     do
@@ -9464,23 +9541,28 @@ redef class AClosureDef
     private init empty_init do end
 
     init init_aclosuredef (
-            n_kwwith: nullable TKwwith,
-            n_id: Collection[Object], # Should be Collection[TId]
+            n_bang: nullable TBang,
+            n_id: nullable AClosureId,
+            n_ids: Collection[Object], # Should be Collection[TId]
             n_kwdo: nullable TKwdo,
             n_expr: nullable AExpr,
             n_label: nullable ALabel
     )
     do
         empty_init
-        _n_kwwith = n_kwwith.as(not null)
-       n_kwwith.parent = self
-       for n in n_id do
+        _n_bang = n_bang.as(not null)
+       n_bang.parent = self
+        _n_id = n_id.as(not null)
+       n_id.parent = self
+       for n in n_ids do
                assert n isa TId
-               _n_id.add(n)
+               _n_ids.add(n)
                n.parent = self
        end
-        _n_kwdo = n_kwdo.as(not null)
-       n_kwdo.parent = self
+        _n_kwdo = n_kwdo
+       if n_kwdo != null then
+               n_kwdo.parent = self
+       end
         _n_expr = n_expr
        if n_expr != null then
                n_expr.parent = self
@@ -9493,24 +9575,34 @@ redef class AClosureDef
 
     redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
-        if _n_kwwith == old_child then
+        if _n_bang == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa TKwwith
-                _n_kwwith = new_child
+               assert new_child isa TBang
+                _n_bang = new_child
            else
                abort
             end
             return
        end
-        for i in [0.._n_id.length[ do
-            if _n_id[i] == old_child then
+        if _n_id == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AClosureId
+                _n_id = new_child
+           else
+               abort
+            end
+            return
+       end
+        for i in [0.._n_ids.length[ do
+            if _n_ids[i] == old_child then
                 if new_child != null then
                    assert new_child isa TId
-                    _n_id[i] = new_child
+                    _n_ids[i] = new_child
                     new_child.parent = self
                 else
-                    _n_id.remove_at(i)
+                    _n_ids.remove_at(i)
                 end
                 return
             end
@@ -9521,7 +9613,7 @@ redef class AClosureDef
                assert new_child isa TKwdo
                 _n_kwdo = new_child
            else
-               abort
+               _n_kwdo = null
             end
             return
        end
@@ -9549,11 +9641,14 @@ redef class AClosureDef
 
     redef fun visit_all(v: Visitor)
     do
-        v.enter_visit(_n_kwwith)
-            for n in _n_id do
+        v.enter_visit(_n_bang)
+        v.enter_visit(_n_id)
+            for n in _n_ids do
                 v.enter_visit(n)
            end
-        v.enter_visit(_n_kwdo)
+        if _n_kwdo != null then
+            v.enter_visit(_n_kwdo.as(not null))
+        end
         if _n_expr != null then
             v.enter_visit(_n_expr.as(not null))
         end
@@ -9564,15 +9659,18 @@ redef class AClosureDef
 
     redef fun visit_all_reverse(v: Visitor)
     do
-        v.enter_visit(_n_kwwith)
+        v.enter_visit(_n_bang)
+        v.enter_visit(_n_id)
        do
-           var i = _n_id.length
+           var i = _n_ids.length
             while i >= 0 do
-                v.enter_visit(_n_id[i])
+                v.enter_visit(_n_ids[i])
                i = i - 1
            end
        end
-        v.enter_visit(_n_kwdo)
+        if _n_kwdo != null then
+            v.enter_visit(_n_kwdo.as(not null))
+        end
         if _n_expr != null then
             v.enter_visit(_n_expr.as(not null))
         end
@@ -9581,6 +9679,90 @@ redef class AClosureDef
         end
     end
 end
+redef class ASimpleClosureId
+    redef fun n_id=(n)
+    do
+        _n_id = n
+       n.parent = self
+    end
+
+    private init empty_init do end
+
+    init init_asimpleclosureid (
+            n_id: nullable TId
+    )
+    do
+        empty_init
+        _n_id = n_id.as(not null)
+       n_id.parent = self
+    end
+
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+    do
+        if _n_id == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TId
+                _n_id = new_child
+           else
+               abort
+            end
+            return
+       end
+    end
+
+    redef fun visit_all(v: Visitor)
+    do
+        v.enter_visit(_n_id)
+    end
+
+    redef fun visit_all_reverse(v: Visitor)
+    do
+        v.enter_visit(_n_id)
+    end
+end
+redef class ABreakClosureId
+    redef fun n_kwbreak=(n)
+    do
+        _n_kwbreak = n
+       n.parent = self
+    end
+
+    private init empty_init do end
+
+    init init_abreakclosureid (
+            n_kwbreak: nullable TKwbreak
+    )
+    do
+        empty_init
+        _n_kwbreak = n_kwbreak.as(not null)
+       n_kwbreak.parent = self
+    end
+
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+    do
+        if _n_kwbreak == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TKwbreak
+                _n_kwbreak = new_child
+           else
+               abort
+            end
+            return
+       end
+    end
+
+    redef fun visit_all(v: Visitor)
+    do
+        v.enter_visit(_n_kwbreak)
+    end
+
+    redef fun visit_all_reverse(v: Visitor)
+    do
+        v.enter_visit(_n_kwbreak)
+    end
+end
 redef class AQualified
     redef fun n_classid=(n)
     do