X-Git-Url: http://nitlanguage.org diff --git a/src/parser/xss/prods.xss b/src/parser/xss/prods.xss index ef484d0..1d04163 100644 --- a/src/parser/xss/prods.xss +++ b/src/parser/xss/prods.xss @@ -19,20 +19,24 @@ $ template make_abs_prods() $ set baseprod = {//prod/@ename} $ foreach {//prod} -class @ename special Prod end +class @ename super Prod end $ end $ foreach {//alt} class @ename -special ${../@ename} + super ${../@ename} $ foreach {elem} $ if @is_list - readable var _n_@name: List[@etype] = new List[@etype] + var n_@name: List[@etype] = new List[@etype] $ else $ if @modifier - readable var _n_@name: nullable @etype = null + var _n_@name: nullable @etype = null + fun n_@name: nullable @etype do return _n_@name + fun n_@name=(n_@name: nullable @etype) do _n_@name = n_@name $ else - readable var _n_@name: @etype + var _n_@name: @etype = null + fun n_@name: @etype do return _n_@name + fun n_@name=(n_@name: @etype) do _n_@name = n_@name $ end $ end $ end @@ -40,9 +44,20 @@ end $ end class Start -special Prod - readable var _n_base: nullable $baseprod - readable var _n_eof: EOF + super Prod + var _n_base: nullable $baseprod + fun n_base: nullable $baseprod do return _n_base + fun n_base=(n_base: nullable $baseprod_ do _n_base = n_base + var _n_eof: EOF + fun n_eof: EOF do return _n_eof + fun n_eof=(n_eof: EOF) do _n_eof = n_eof + init( + n_base: nullable $baseprod, + n_eof: EOF) + do + _n_base = n_base + _n_eof = n_eof + end end $ end template @@ -50,109 +65,83 @@ $ template make_prods() $ set baseprod = {//prod/@ename} $ foreach {//alt} redef class @ename - 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 $ foreach {elem} $ if @is_list - for n in n_@{name} do - assert n isa @{etype} - _n_@{name}.add(n) - n.parent = self - end + self.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 - redef fun visit_all(v: Visitor) - do $ foreach {elem} $ if @is_list - for n in _n_@{name} do - v.enter_visit(n) - end $ else + redef fun n_@{name}=(node) + do + _n_@{name} = node $ if @modifier - if _n_@{name} != null then - v.enter_visit(_n_@{name}.as(not null)) - end + if node != null then node.parent = self $ else - v.enter_visit(_n_@{name}) + node.parent = self $ end + end $ end $ end foreach - end + + + redef fun visit_all(v: Visitor) + do +$ foreach {elem} +$ if @is_list + n_@{name}.visit_all(v) +$ else + v.enter_visit(_n_@{name}) +$ end +$ end foreach + end end $ end foreach redef class Start - init( - n_base: nullable $baseprod, - n_eof: EOF) - do - _n_base = n_base - _n_eof = n_eof - end - redef fun replace_child(old_child: PNode, new_child: nullable PNode) do if _n_base == old_child then