1 # This file is part of NIT ( http://www.nitlanguage.org ).
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
7 # http://www.apache.org/licenses/LICENSE-2.0
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.
15 # Bootstraping the nitcc parser
17 # Instead of commiting a generated parser on each version,
18 # this program just generate the nitcc_parser using the API of `grammar`
22 # - no generated file commited
23 # - easier to modify and bootstrap
27 # - somewhat dublicate the ful grammar of nitcc
28 # - need an ad-hoc lexer (nitcc_lexer0.nit)
30 module nitcc_parser_gen
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"))
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
])
80 p_gr
.new_alt
("gr", t_kw
, t_id
, t_semi
, p_lex
, p_par
)
82 p_lex
.new_alt
("lex", t_kw
, p_exprs
)
84 p_exprs
.new_alt
("exprs_many", p_exprs
, p_expr
)
85 p_exprs
.new_alt0
("exprs_none")
87 p_expr
.new_alt
("expr", t_id
, t_eq
, p_re
, t_semi
)
89 p_re
.new_alt
("re_alter", p_re
, t_pipe
, p_re1
)
90 p_re
.new_alt
("re_re2", p_re1
)
92 p_re1
.new_alt
("re_minus", p_re1
, t_minus
, p_re2
)
93 p_re1
.new_alt
("re_re1", p_re2
)
95 p_re2
.new_alt
("re_conc", p_re2
, p_re3
)
96 p_re2
.new_alt
("re_re3", p_re3
)
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
)
108 p_par
.new_alt
("par", t_kw
, p_ign
, p_prods
)
110 p_ign
.new_alt0
("ign_none")
111 p_ign
.new_alt
("ign", t_kw
, t_id
, t_semi
)
113 p_prods
.new_alt
("prods_many", p_prods
, p_prod
)
114 p_prods
.new_alt0
("prods_none")
116 p_prod
.new_alt
("prod", t_id
, p_ptrans_o
, t_eq
, p_alts
, t_semi
)
118 p_ptrans_o
.new_alt
("ptrans", t_ocur
, t_arrow
, t_id
, t_ccur
)
119 p_ptrans_o
.new_alt0
("ptrans_none")
121 p_alts
.new_alt
("alts_many", p_alts
, t_pipe
, p_alt
)
122 p_alts
.new_alt
("alts_one", p_alt
)
124 p_alt
.new_alt
("alt", p_altid_o
, p_elems
)
126 p_altid_o
.new_alt0
("altid_o_none")
127 p_altid_o
.new_alt
("altid_o_one", p_altid
)
129 p_altid
.new_alt
("altid", t_ocur
, t_id
, t_colo
, t_ccur
)
131 p_elems
.new_alt
("elems_many", p_elems
, p_elem
)
132 p_elems
.new_alt0
("elems_none")
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
)
143 print
"LR automaton: {a.states.length} states (see nitcc0.lr.dot)"
144 a
.to_dot
("nitcc0.lr.dot")
146 a
.gen_to_nit
("nitcc_parser.nit", "nitcc")
148 var f
= new OFStream.open
("nitcc_lexer.nit")
149 f
.write
("import nitcc_lexer0\n")