1 $ // This file is part of NIT ( http://www.nitlanguage.org ).
3 $ // Copyright 2008 Jean Privat <jean@pryen.org>
4 $ // Based on algorithms developped for ( http://www.sablecc.org/ ).
6 $ // Licensed under the Apache License, Version 2.0 (the "License");
7 $ // you may not use this file except in compliance with the License.
8 $ // You may obtain a copy of the License at
10 $ // http://www.apache.org/licenses/LICENSE-2.0
12 $ // Unless required by applicable law or agreed to in writing, software
13 $ // distributed under the License is distributed on an "AS IS" BASIS,
14 $ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 $ // See the License for the specific language governing permissions and
16 $ // limitations under the License.
18 $ template make_abs_prods()
19 $ set baseprod = {//prod/@ename}
22 class @ename super Prod end
30 var n_@name: List[@etype] = new List[@etype]
33 var _n_@name: nullable @etype = null
34 fun n_@name: nullable @etype do return _n_@name
35 fun n_@name=(n_@name: nullable @etype) do _n_@name = n_@name
37 var _n_@name: @etype = null
38 fun n_@name: @etype do return _n_@name
39 fun n_@name=(n_@name: @etype) do _n_@name = n_@name
48 var _n_base: nullable $baseprod
49 fun n_base: nullable $baseprod do return _n_base
50 fun n_base=(n_base: nullable $baseprod_ do _n_base = n_base
52 fun n_eof: EOF do return _n_eof
53 fun n_eof=(n_eof: EOF) do _n_eof = n_eof
55 n_base: nullable $baseprod,
64 $ template make_prods()
65 $ set baseprod = {//prod/@ename}
69 init init_${translate(@ename,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} (
72 n_@{name}: Collection[Object][-sep ','-] # Should be Collection[@etype]
74 n_@{name}: nullable @etype[-sep ','-]
79 init init_${translate(@ename,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}
84 self.n_@{name}.unsafe_add_all(n_@{name})
88 if n_@{name} != null then n_@{name}.parent = self
90 _n_@name = n_@{name}.as(not null)
91 n_@{name}.parent = self
97 redef fun replace_child(old_child: PNode, new_child: nullable PNode)
101 if n_@{name}.replace_child(old_child, new_child) then return
103 if _n_@{name} == old_child then
105 n_@{name} = new_child.as(nullable @etype)
107 n_@{name} = new_child.as(@etype)
118 redef fun n_@{name}=(node)
122 if node != null then node.parent = self
131 redef fun visit_all(v: Visitor)
135 n_@{name}.visit_all(v)
137 v.enter_visit(_n_@{name})
145 redef fun replace_child(old_child: PNode, new_child: nullable PNode)
147 if _n_base == old_child then
148 if new_child == null then
150 new_child.parent = self
151 assert new_child isa $baseprod
154 old_child.parent = null
159 redef fun visit_all(v: Visitor)
161 if _n_base != null then
162 v.enter_visit(_n_base.as(not null))
164 v.enter_visit(_n_eof)