syntax: 'meth' -> 'fun', 'attr' -> 'var'
[nit.git] / src / parser / xss / prods.xss
1 /* This file is part of NIT ( http://www.nitlanguage.org ).
2  *
3  * Copyright 2008 Jean Privat <jean@pryen.org>
4  * Based on algorithms developped for ( http://www.sablecc.org/ ).
5  *
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
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  */
18
19 $ template make_abs_prods()
20 $ set baseprod = {//prod/@ename}
21
22 $ foreach {//prod}
23 class @ename special Prod end
24 $ end
25
26 $ foreach {//alt}
27 class @ename
28 special ${../@ename}
29 $ foreach {elem}
30 $   if @is_list
31     readable writable var _n_@name: List[@etype] = new List[@etype]
32 $   else
33 $   if @modifier
34     readable writable var _n_@name: nullable @etype = null
35 $   else
36     readable writable var _n_@name: @etype
37 $   end
38 $   end
39 $ end
40 end
41 $ end
42
43 class Start
44 special Prod
45     readable writable var _n_base: nullable $baseprod 
46     readable writable var _n_eof: EOF 
47 end
48 $ end template
49
50 $ template make_prods()
51 $ set baseprod = {//prod/@ename}
52 $ foreach {//alt}
53 redef class @ename
54 $ foreach {elem}
55 $   if @is_list
56 $   else
57     redef fun n_@name=(n)
58     do
59         _n_@name = n
60 $   if @modifier
61         if n != null then
62             n.parent = self
63         end
64 $   else
65         n.parent = self
66 $   end
67     end
68 $   end
69 $ end
70
71     private init empty_init do end
72
73 $ if {count(elem)!=0}
74     init init_${translate(@ename,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} (
75 $ foreach {elem}
76 $   if {@is_list}
77             n_@{name}: Collection[Object] [-sep ','-] # Should be Collection[@etype]
78 $   else
79             n_@{name}: nullable @etype [-sep ','-]
80 $   end
81 $ end
82     )
83 $ else
84     init init_${translate(@ename,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}
85 $ end
86     do
87         empty_init
88 $ foreach {elem}
89 $   if @is_list
90         for n in n_@{name} do
91                 assert n isa @{etype}
92                 _n_@{name}.add(n)
93                 n.parent = self
94         end
95 $   else
96 $   if {@modifier}
97         _n_@name = n_@{name}
98         if n_@{name} != null then
99                 n_@{name}.parent = self
100         end
101 $   else
102         _n_@name = n_@{name}.as(not null)
103         n_@{name}.parent = self
104 $   end
105 $   end
106 $ end
107     end
108
109     redef fun replace_child(old_child: PNode, new_child: nullable PNode)
110     do
111 $ foreach {elem}
112 $   if @is_list
113         for i in [0.._n_@{name}.length[ do
114             if _n_@{name}[i] == old_child then
115                 if new_child != null then
116                     assert new_child isa @etype
117                     _n_@{name}[i] = new_child
118                     new_child.parent = self
119                 else
120                     _n_@{name}.remove_at(i)
121                 end
122                 return
123             end
124         end
125 $   else
126         if _n_@{name} == old_child then
127             if new_child != null then
128                 new_child.parent = self
129                 assert new_child isa @etype
130                 _n_@{name} = new_child
131             else
132 $   if @modifier
133                 _n_@{name} = null
134 $   else
135                 abort
136 $   end
137             end
138             return
139         end
140 $   end
141 $ end foreach
142     end
143
144     redef fun visit_all(v: Visitor)
145     do
146 $   foreach {elem}
147 $     if @is_list
148             for n in _n_@{name} do
149                 v.visit(n)
150             end
151 $     else
152 $       if @modifier
153         if _n_@{name} != null then
154             v.visit(_n_@{name}.as(not null))
155         end
156 $       else
157         v.visit(_n_@{name})
158 $       end
159 $     end
160 $   end foreach
161     end
162
163     redef fun visit_all_reverse(v: Visitor)
164     do
165 $   foreach {elem}
166 $     if @is_list
167         do
168             var i = _n_@{name}.length
169             while i >= 0 do
170                 v.visit(_n_@{name}[i])
171                 i = i - 1
172             end
173         end
174 $     else
175 $       if @modifier
176         if _n_@{name} != null then
177             v.visit(_n_@{name}.as(not null))
178         end
179 $       else
180         v.visit(_n_@{name})
181 $       end
182 $     end
183 $   end foreach
184     end
185 end
186 $ end foreach
187
188 redef class Start
189     init(
190         n_base: nullable $baseprod,
191         n_eof: EOF)
192     do
193         _n_base = n_base
194         _n_eof = n_eof
195     end
196
197     redef fun replace_child(old_child: PNode, new_child: nullable PNode)
198     do
199         if _n_base == old_child then
200             if new_child == null then
201             else
202                 new_child.parent = self
203                 assert new_child isa $baseprod
204                 _n_base = new_child
205             end
206             old_child.parent = null
207             return
208         end
209     end
210
211     redef fun visit_all(v: Visitor)
212     do
213         if _n_base != null then
214             v.visit(_n_base.as(not null))
215         end
216     end
217
218     redef fun visit_all_reverse(v: Visitor)
219     do
220         if _n_base != null then
221             v.visit(_n_base.as(not null))
222         end
223     end
224 end
225 $ end template