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