f20f2141aaf84ef3a88f9a9d4845134c9727d432
[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 super Prod end
23 $ end
24
25 $ foreach {//alt}
26 class @ename
27         super ${../@ename}
28 $ foreach {elem}
29 $   if @is_list
30     readable var _n_@name: List[@etype] = new List[@etype]
31 $   else
32 $   if @modifier
33     readable var _n_@name: nullable @etype = null
34 $   else
35     readable var _n_@name: @etype
36 $   end
37 $   end
38 $ end
39 end
40 $ end
41
42 class Start
43         super Prod
44     readable var _n_base: nullable $baseprod
45     readable var _n_eof: EOF
46     init(
47         n_base: nullable $baseprod,
48         n_eof: EOF)
49     do
50         _n_base = n_base
51         _n_eof = n_eof
52     end
53
54 end
55 $ end template
56
57 $ template make_prods()
58 $ set baseprod = {//prod/@ename}
59 $ foreach {//alt}
60 redef class @ename
61 $ if {count(elem)!=0}
62         init init_${translate(@ename,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} (
63 $ foreach {elem}
64 $   if {@is_list}
65                 n_@{name}: Collection[Object][-sep ','-] # Should be Collection[@etype]
66 $   else
67                 n_@{name}: nullable @etype[-sep ','-]
68 $   end
69 $ end
70         )
71 $ else
72         init init_${translate(@ename,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}
73 $ end
74         do
75 $ foreach {elem}
76 $   if @is_list
77                 _n_@{name}.unsafe_add_all(n_@{name})
78 $   else
79 $   if {@modifier}
80                 _n_@name = n_@{name}
81                 if n_@{name} != null then n_@{name}.parent = self
82 $   else
83                 _n_@name = n_@{name}.as(not null)
84                 n_@{name}.parent = self
85 $   end
86 $   end
87 $ end
88         end
89
90         redef fun replace_child(old_child: PNode, new_child: nullable PNode)
91         do
92 $ foreach {elem}
93 $   if @is_list
94                 if _n_@{name}.replace_child(old_child, new_child) then return
95 $   else
96                 if _n_@{name} == old_child then
97 $   if @modifier
98                         n_@{name} = new_child.as(nullable @etype)
99 $   else
100                         n_@{name} = new_child.as(@etype)
101 $   end
102                         return
103                 end
104 $   end
105 $ end foreach
106         end
107
108 $   foreach {elem}
109 $     if @is_list
110 $     else
111         redef fun n_@{name}=(node)
112         do
113                 _n_@{name} = node
114 $       if @modifier
115                 if node != null then node.parent = self
116 $       else
117                 node.parent = self
118 $       end
119         end
120 $     end
121 $   end foreach
122
123
124         redef fun visit_all(v: Visitor)
125         do
126 $   foreach {elem}
127 $     if @is_list
128                 _n_@{name}.visit_all(v)
129 $     else
130                 v.enter_visit(_n_@{name})
131 $     end
132 $   end foreach
133         end
134 end
135 $ end foreach
136
137 redef class Start
138     redef fun replace_child(old_child: PNode, new_child: nullable PNode)
139     do
140         if _n_base == old_child then
141             if new_child == null then
142             else
143                 new_child.parent = self
144                 assert new_child isa $baseprod
145                 _n_base = new_child
146             end
147             old_child.parent = null
148             return
149         end
150     end
151
152     redef fun visit_all(v: Visitor)
153     do
154         if _n_base != null then
155             v.enter_visit(_n_base.as(not null))
156         end
157         v.enter_visit(_n_eof)
158     end
159 end
160 $ end template