X-Git-Url: http://nitlanguage.org diff --git a/src/parser/xss/prods.xss b/src/parser/xss/prods.xss index c6ebc43..1d04163 100644 --- a/src/parser/xss/prods.xss +++ b/src/parser/xss/prods.xss @@ -1,45 +1,63 @@ -/* This file is part of NIT ( http://www.nitlanguage.org ). - * - * Copyright 2008 Jean Privat - * Based on algorithms developped for ( http://www.sablecc.org/ ). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +$ // This file is part of NIT ( http://www.nitlanguage.org ). +$ // +$ // Copyright 2008 Jean Privat +$ // Based on algorithms developped for ( http://www.sablecc.org/ ). +$ // +$ // Licensed under the Apache License, Version 2.0 (the "License"); +$ // you may not use this file except in compliance with the License. +$ // You may obtain a copy of the License at +$ // +$ // http://www.apache.org/licenses/LICENSE-2.0 +$ // +$ // Unless required by applicable law or agreed to in writing, software +$ // distributed under the License is distributed on an "AS IS" BASIS, +$ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +$ // See the License for the specific language governing permissions and +$ // limitations under the License. $ 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 writable attr _n_@name: List[@etype] = null + var n_@name: List[@etype] = new List[@etype] $ else - readable writable attr _n_@name: @etype = null +$ if @modifier + 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 + 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 end $ end class Start -special Prod - readable writable attr _n_base: $baseprod - readable writable attr _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 @@ -47,133 +65,85 @@ $ template make_prods() $ set baseprod = {//prod/@ename} $ foreach {//alt} redef class @ename -$ foreach {elem} -$ if @is_list -$ else - redef meth n_@name=(n: @etype) - do - _n_@name = n - if n != null then - n.parent = self - end - end -$ end -$ 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}: Array[Object] [-sep ','-] # Should be Array[@etype] + n_@{name}: Collection[Object][-sep ','-] # Should be Collection[@etype] $ else - n_@{name}: @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 - _n_@{name} = new List[@{etype}] - 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 $ else - _n_@name = n_@{name} - if n_@{name} != null then + _n_@name = n_@{name}.as(not null) n_@{name}.parent = self - end +$ end $ end $ end - end + end - redef meth replace_child(old_child: PNode, new_child: PNode) - do - assert old_child != null + 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 - _n_@{name} = null - end - return - end + if _n_@{name} == old_child then +$ if @modifier + n_@{name} = new_child.as(nullable @etype) +$ else + n_@{name} = new_child.as(@etype) +$ end + return + end $ end $ end foreach - end + end - redef meth visit_all(v: Visitor) - do $ foreach {elem} $ if @is_list - for n in _n_@{name} do - v.visit(n) - end $ else - if _n_@{name} != null then - v.visit(_n_@{name}) - end + redef fun n_@{name}=(node) + do + _n_@{name} = node +$ if @modifier + if node != null then node.parent = self +$ else + node.parent = self +$ end + end $ end $ end foreach - end - redef meth visit_all_reverse(v: Visitor) - do + + redef fun visit_all(v: Visitor) + do $ foreach {elem} $ if @is_list - do - var i = _n_@{name}.length - while i >= 0 do - v.visit(_n_@{name}[i]) - i = i - 1 - end - end + n_@{name}.visit_all(v) $ else - if _n_@{name} != null then - v.visit(_n_@{name}) - end + v.enter_visit(_n_@{name}) $ end $ end foreach - end + end end $ end foreach redef class Start - init( - n_base: $baseprod, - n_eof: EOF) + redef fun replace_child(old_child: PNode, new_child: nullable PNode) do - _n_base = n_base - _n_eof = n_eof - end - - redef meth replace_child(old_child: PNode, new_child: PNode) - do - assert old_child != null if _n_base == old_child then if new_child == null then else @@ -186,18 +156,12 @@ redef class Start end end - redef meth visit_all(v: Visitor) - do - if _n_base != null then - v.visit(_n_base) - end - end - - redef meth visit_all_reverse(v: Visitor) + redef fun visit_all(v: Visitor) do if _n_base != null then - v.visit(_n_base) + v.enter_visit(_n_base.as(not null)) end + v.enter_visit(_n_eof) end end $ end template