Merge: doc: fixed some typos and other misc. corrections
[nit.git] / src / parser / xss / parser.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_parser()
19
20 redef class Parser
21         redef fun build_reduce_table
22         do
23                 var reduce_table = new Array[ReduceAction].with_capacity(${count(rules/rule)})
24 $ foreach {rules/rule}
25                 reduce_table.add new ReduceAction@index(@leftside)
26 $ end foreach
27                 return reduce_table
28         end
29 end
30
31 $ foreach {rules/rule}
32 private class ReduceAction@index
33         super ReduceAction
34         redef fun action(p: Parser)
35         do
36                                         var node_list: nullable Object = null
37 $   foreach {action}
38 $   choose
39 $     when {@cmd='POP'}
40                                         var ${translate(@result,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} = p.pop
41 $     end
42 $     when {@cmd='FETCHLIST'}
43                                         var ${translate(@result,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} = ${translate(@from,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}
44                                         assert ${translate(@result,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} isa Array[Object]
45 $     end
46 $     when {@cmd='FETCHNODE'}
47                                         var ${translate(@result,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} = ${translate(@from,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}
48                                         assert ${translate(@result,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} isa nullable @etype
49 $     end
50 $     when {@cmd='ADDNODE'}
51                                         if ${translate(@node,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} != null then
52                                                 ${translate(@tolist,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}.add(${translate(@node,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")})
53                                         end
54 $     end
55 $     when {@cmd='ADDLIST'}
56                                         ${translate(@tolist,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} = concat(${translate(@tolist,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}, ${translate(@fromlist,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")})
57 $     end
58 $     when {@cmd='MAKELIST'}
59                                         var ${translate(@result,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} = new Array[Object]
60 $     end
61 $     when {@cmd='MAKENODE'}
62 $      if {count(arg)!=0}
63                                         var ${translate(@result,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}: nullable @etype = new @etype.init_${translate(@etype,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}(
64 $       foreach {arg}
65 $           if @null
66                                                 null[-sep ','-]
67 $           else
68                                                 ${translate(.,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}[-sep ','-]
69 $           end
70 $       end foreach
71                                         )
72 $      else
73                                         var ${translate(@result,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}: nullable @etype = new @etype.init_${translate(@etype,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}
74 $      end
75 $     end
76 $     when {@cmd='RETURNNODE'}
77 $       if @null
78                                         node_list = null
79 $       else
80                                         node_list = ${translate(@node,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}
81 $       end
82 $     end
83 $     when {@cmd='RETURNLIST'}
84                                         node_list = ${translate(@list,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}
85 $     end
86 $   end choose
87 $   end foreach
88                                         p.push(p.go_to(_goto), node_list)
89         end
90 end
91 $ end foreach
92 $ end template
93
94 $ template make_parser_table()
95 $ foreach {parser_data/action_table/row}
96 static int parser_action_row${position()}[] = {
97         ${count(action)},
98 $   foreach {action}
99         @from, @action, @to[-sep ','-]
100 $   end foreach
101 };
102 $ end foreach
103
104 const int* const parser_action_table[] = {
105 $ foreach {parser_data/action_table/row}
106         parser_action_row${position()}[-sep ','-]
107 $ end foreach
108 };
109
110 $ foreach {parser_data/goto_table/row}
111 static int parser_goto_row${position()}[] = {
112         ${count(goto)},
113 $   foreach {goto}
114         @from, @to[-sep ','-]
115 $   end foreach
116 };
117 $ end foreach
118
119 const int* const parser_goto_table[] = {
120 $ foreach {parser_data/goto_table/row}
121         parser_goto_row${position()}[-sep ','-]
122 $ end foreach
123 };
124 $ end template