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