parser: clean and factorize services in parser_prod
authorJean Privat <jean@pryen.org>
Wed, 9 Apr 2014 15:05:02 +0000 (11:05 -0400)
committerJean Privat <jean@pryen.org>
Wed, 9 Apr 2014 15:05:02 +0000 (11:05 -0400)
Mainly, generalize cloned services in the class ANodes
Also rationalize the generated nit code.

The diff seems big because some reindentation

Signed-off-by: Jean Privat <jean@pryen.org>

src/parser/Makefile
src/parser/parser_nodes.nit
src/parser/xss/prods.xss

index e7d1fa8..23d31c6 100644 (file)
@@ -29,7 +29,7 @@ parser.nit: .nit.sablecc3 xss/*.xss
        ${SABLECC3ALTGEN} -c .nit.sablecc3.dump -t xss/main.xss -p usermodule parser_nodes .nit.sablecc3
        mv -f -- parser.nit .parser-nofact.nit
        ./fact_parser.pl .parser-nofact.nit > parser.nit
-       perl -np -i.orig -e 's/([ \[])P([A-Z])/\1A\2/g;' -e 's/"{"/"\\{"/g;' parser.nit parser_abs.nit parser_prod.nit lexer.nit
+       perl -np -i.orig -e 's/([ (\[])P([A-Z])/\1A\2/g;' -e 's/"{"/"\\{"/g;' parser.nit parser_abs.nit parser_prod.nit lexer.nit
 
 clean:
        rm -f -- .nit.sablecc3 .nit.sablecc3.dump .parser-nofact.nit || true
index 295aaf2..fbd2f77 100644 (file)
@@ -132,6 +132,40 @@ class ANodes[E: ANode]
                assert e.parent == parent
                e.parent = null
        end
+
+       # Used in parent contructor to fill elements
+       private fun unsafe_add_all(nodes: Collection[Object])
+       do
+               var parent = self.parent
+               for n in nodes do
+                       assert n isa E
+                       add n
+                       n.parent = parent
+               end
+       end
+
+       private fun replace_child(old_child: ANode, new_child: nullable ANode): Bool
+       do
+               var parent = self.parent
+               for i in [0..length[ do
+                       if self[i] == old_child then
+                               if new_child != null then
+                                       assert new_child isa E
+                                       self[i] = new_child
+                                       new_child.parent = parent
+                               else
+                                       self.remove_at(i)
+                               end
+                               return true
+                       end
+               end
+               return false
+       end
+
+       private fun visit_all(v: Visitor)
+       do
+               for n in self do v.enter_visit(n)
+       end
 end
 
 # Ancestor of all tokens
index a1d34a1..8a5edcb 100644 (file)
@@ -58,115 +58,82 @@ $ template make_prods()
 $ set baseprod = {//prod/@ename}
 $ foreach {//alt}
 redef class @ename
-    private init empty_init do end
+       private init empty_init do end
 
 $ if {count(elem)!=0}
-    init init_${translate(@ename,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} (
+       init init_${translate(@ename,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} (
 $ foreach {elem}
 $   if {@is_list}
-            n_@{name}: Collection[Object][-sep ','-] # Should be Collection[@etype]
+               n_@{name}: Collection[Object][-sep ','-] # Should be Collection[@etype]
 $   else
-            n_@{name}: nullable @etype[-sep ','-]
+               n_@{name}: nullable @etype[-sep ','-]
 $   end
 $ end
-    )
+       )
 $ else
-    init init_${translate(@ename,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}
+       init init_${translate(@ename,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}
 $ end
-    do
-        empty_init
+       do
+               empty_init
 $ foreach {elem}
 $   if @is_list
-       for n in n_@{name} do
-               assert n isa @{etype}
-               _n_@{name}.add(n)
-               n.parent = self
-       end
+               _n_@{name}.unsafe_add_all(n_@{name})
 $   else
 $   if {@modifier}
-        _n_@name = n_@{name}
-       if n_@{name} != null then
-               n_@{name}.parent = self
-       end
+               _n_@name = n_@{name}
+               if n_@{name} != null then n_@{name}.parent = self
 $   else
-        _n_@name = n_@{name}.as(not null)
-       n_@{name}.parent = self
+               _n_@name = n_@{name}.as(not null)
+               n_@{name}.parent = self
 $   end
 $   end
 $ end
-    end
+       end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
-    do
+       redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+       do
 $ foreach {elem}
 $   if @is_list
-        for i in [0.._n_@{name}.length[ do
-            if _n_@{name}[i] == old_child then
-                if new_child != null then
-                   assert new_child isa @etype
-                    _n_@{name}[i] = new_child
-                    new_child.parent = self
-                else
-                    _n_@{name}.remove_at(i)
-                end
-                return
-            end
-        end
+               if _n_@{name}.replace_child(old_child, new_child) then return
 $   else
-        if _n_@{name} == old_child then
-            if new_child != null then
-                new_child.parent = self
-               assert new_child isa @etype
-                _n_@{name} = new_child
-           else
+               if _n_@{name} == old_child then
 $   if @modifier
-               _n_@{name} = null
+                       n_@{name} = new_child.as(nullable @etype)
 $   else
-               abort
+                       n_@{name} = new_child.as(@etype)
 $   end
-            end
-            return
-       end
+                       return
+               end
 $   end
 $ end foreach
-    end
+       end
 
 $   foreach {elem}
 $     if @is_list
 $     else
-               redef fun n_@{name}=(node)
-               do
-                       _n_@{name} = node
+       redef fun n_@{name}=(node)
+       do
+               _n_@{name} = node
 $       if @modifier
-                       if node != null then
-                               node.parent = self
-                       end
+               if node != null then node.parent = self
 $       else
-                       node.parent = self
+               node.parent = self
 $       end
-               end
+       end
 $     end
 $   end foreach
 
 
-    redef fun visit_all(v: Visitor)
-    do
+       redef fun visit_all(v: Visitor)
+       do
 $   foreach {elem}
 $     if @is_list
-            for n in _n_@{name} do
-                v.enter_visit(n)
-           end
+               _n_@{name}.visit_all(v)
 $     else
-$       if @modifier
-        if _n_@{name} != null then
-            v.enter_visit(_n_@{name}.as(not null))
-        end
-$       else
-        v.enter_visit(_n_@{name})
-$       end
+               v.enter_visit(_n_@{name})
 $     end
 $   end foreach
-    end
+       end
 end
 $ end foreach