nitcc: better name of generated classes to avoid name conflicts
[nit.git] / contrib / nitcc / src / nitcc_parser_gen.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 # Bootstraping the nitcc parser
16 #
17 # Instead of commiting a generated parser on each version,
18 # this program just generate the nitcc_parser using the API of `grammar`
19 #
20 # Pros:
21 #
22 # - no generated file commited
23 # - easier to modify and bootstrap
24 #
25 # Cons:
26 #
27 # - somewhat dublicate the ful grammar of nitcc
28 # - need an ad-hoc lexer (nitcc_lexer0.nit)
29 #
30 module nitcc_parser_gen
31
32 import grammar
33
34 var g = new Gram
35 var p_gr = new Production("grammar")
36 var p_lex = new Production("lexer")
37 var p_exprs = new Production("exprs")
38 var p_expr = new Production("expression")
39 var p_re = new Production("re")
40 var p_re1 = new Production("re1")
41 var p_re2 = new Production("re2")
42 var p_re3 = new Production("re3")
43 var p_par = new Production("parser")
44 var p_ign = new Production("ignored")
45 var p_prods = new Production("prods")
46 var p_prod = new Production("production")
47 var p_ptrans_o = new Production("ptrans_o")
48 var p_alts = new Production("alts")
49 var p_alt = new Production("alternative")
50 var p_altid_o = new Production("altid_o")
51 var p_altid = new Production("altident")
52 var p_elems = new Production("elems")
53 var p_elem = new Production("elem")
54 g.prods.add_all([p_gr, p_re, p_re1, p_re2, p_re3, p_lex, p_exprs, p_expr, p_par, p_ign, p_prods, p_prod, p_ptrans_o, p_alts, p_alt, p_altid_o, p_altid, p_elems, p_elem])
55 g.prods.add(new Production("atrans"))
56 g.prods.add(new Production("elemid"))
57 g.prods.add(new Production("nelem"))
58
59 var t_opar = new Token("opar")
60 var t_cpar = new Token("cpar")
61 var t_ocur = new Token("ocur")
62 var t_ccur = new Token("ccur")
63 var t_pipe = new Token("pipe")
64 var t_star = new Token("star")
65 var t_ques = new Token("ques")
66 var t_plus = new Token("plus")
67 var t_minus = new Token("minus")
68 var t_colo = new Token("colo")
69 var t_semi = new Token("semi")
70 var t_dot = new Token("dot")
71 var t_eq = new Token("eq")
72 var t_arrow = new Token("arrow")
73 var t_str = new Token("str")
74 var t_id = new Token("id")
75 var t_kw = new Token("kw")
76 var t_any = new Token("any")
77 var t_ch_dec = new Token("ch_dec")
78 g.tokens.add_all([t_opar, t_cpar, t_ocur, t_ccur, t_pipe, t_star, t_ques, t_plus, t_minus, t_colo, t_semi, t_dot, t_eq, t_arrow, t_str, t_id, t_kw, t_any, t_ch_dec])
79
80 p_gr.new_alt("gr", t_kw, t_id, t_semi, p_lex, p_par)
81
82 p_lex.new_alt("lex", t_kw, p_exprs)
83
84 p_exprs.new_alt("exprs_many", p_exprs, p_expr)
85 p_exprs.new_alt0("exprs_none")
86
87 p_expr.new_alt("expr", t_id, t_eq, p_re, t_semi)
88
89 p_re.new_alt("re_alter", p_re, t_pipe, p_re1)
90 p_re.new_alt("re_re2", p_re1)
91
92 p_re1.new_alt("re_minus", p_re1, t_minus, p_re2)
93 p_re1.new_alt("re_re1", p_re2)
94
95 p_re2.new_alt("re_conc", p_re2, p_re3)
96 p_re2.new_alt("re_re3", p_re3)
97
98 p_re3.new_alt("re_star", p_re3, t_star)
99 p_re3.new_alt("re_ques", p_re3, t_ques)
100 p_re3.new_alt("re_plus", p_re3, t_plus)
101 p_re3.new_alt("re_par", t_opar, p_re, t_cpar)
102 p_re3.new_alt("re_str", t_str)
103 p_re3.new_alt("re_ch_dec", t_ch_dec)
104 p_re3.new_alt("re_class", t_str, t_dot, t_dot, t_str)
105 p_re3.new_alt("re_any", t_any)
106 p_re3.new_alt("re_id", t_id)
107
108 p_par.new_alt("par", t_kw, p_ign, p_prods)
109
110 p_ign.new_alt0("ign_none")
111 p_ign.new_alt("ign", t_kw, t_id, t_semi)
112
113 p_prods.new_alt("prods_many", p_prods, p_prod)
114 p_prods.new_alt0("prods_none")
115
116 p_prod.new_alt("prod", t_id, p_ptrans_o, t_eq, p_alts, t_semi)
117
118 p_ptrans_o.new_alt("ptrans", t_ocur, t_arrow, t_id, t_ccur)
119 p_ptrans_o.new_alt0("ptrans_none")
120
121 p_alts.new_alt("alts_many", p_alts, t_pipe, p_alt)
122 p_alts.new_alt("alts_one", p_alt)
123
124 p_alt.new_alt("alt", p_altid_o, p_elems)
125
126 p_altid_o.new_alt0("altid_o_none")
127 p_altid_o.new_alt("altid_o_one", p_altid)
128
129 p_altid.new_alt("altid", t_ocur, t_id, t_colo, t_ccur)
130
131 p_elems.new_alt("elems_many", p_elems, p_elem)
132 p_elems.new_alt0("elems_none")
133
134 p_elem.new_alt("elem_id", t_id)
135 p_elem.new_alt("elem_str", t_str)
136 p_elem.new_alt("elem_par", t_opar, p_alts, t_cpar)
137 p_elem.new_alt("elem_star", p_elem, t_star)
138 p_elem.new_alt("elem_ques", p_elem, t_ques)
139 p_elem.new_alt("elem_plus", p_elem, t_plus)
140
141 var a = g.lr0
142
143 print "LR automaton: {a.states.length} states (see nitcc0.lr.dot)"
144 a.to_dot("nitcc0.lr.dot")
145
146 a.gen_to_nit("nitcc_parser.nit", "nitcc")
147
148 var f = new OFStream.open("nitcc_lexer.nit")
149 f.write("import nitcc_lexer0\n")
150 f.close