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