Import Upstream version 20180207
[hcoop/debian/mlton.git] / mlyacc / src / yacc.grm
1 (* Modified by Vesa Karvonen on 2007-12-18.
2 * Create line directives in output.
3 *)
4 (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *)
5
6 (* parser for the ML parser generator *)
7
8 open Hdr
9 %%
10
11 %name Mlyacc
12 %eop EOF
13 %noshift EOF
14 %right ARROW
15 %left ASTERISK
16 %pos pos
17
18 %term ARROW | ASTERISK | BLOCK | BAR | CHANGE | COLON |
19 COMMA | DELIMITER | EOF | FOR |
20 HEADER of string | ID of string*Header.pos | IDDOT of string |
21 PERCENT_HEADER | INT of string | KEYWORD | LBRACE | LPAREN |
22 NAME | NODEFAULT | NONTERM | NOSHIFT | OF |
23 PERCENT_EOP | PERCENT_PURE | PERCENT_POS | PERCENT_ARG |
24 PERCENT_TOKEN_SIG_INFO |
25 PREC of Header.prec | PREC_TAG | PREFER |
26 PROG of string | RBRACE | RPAREN | SUBST | START |
27 TERM | TYVAR of string | VERBOSE | VALUE |
28 UNKNOWN of string | BOGUS_VALUE
29
30 %nonterm
31 BEGIN of string * Hdr.declData * (Hdr.rule list) |
32 CONSTR_LIST of (Hdr.symbol * Hdr.ty option) list |
33 ID_LIST of Hdr.symbol list |
34 LABEL of string |
35 MPC_DECL of Hdr.declData |
36 MPC_DECLS of Hdr.declData |
37 QUAL_ID of string |
38 RECORD_LIST of string |
39 RHS_LIST of {rhs:Hdr.symbol list,code:{text:string, pos:Header.pos},
40 prec:Hdr.symbol option} list |
41 G_RULE of Hdr.rule list |
42 G_RULE_LIST of Hdr.rule list |
43 G_RULE_PREC of Hdr.symbol option |
44 SUBST_DECL of (Hdr.symbol list * Hdr.symbol list) list |
45 SUBST_DEC of (Hdr.symbol list * Hdr.symbol list) |
46 CHANGE_DECL of (Hdr.symbol list * Hdr.symbol list) list |
47 CHANGE_DEC of (Hdr.symbol list * Hdr.symbol list) |
48 TY of string
49 %header (
50 functor MlyaccLrValsFun(structure Hdr : HEADER
51 where type prec = Header.prec
52 structure Token : TOKEN)
53 )
54 %arg (inputSource) : Hdr.inputSource
55 %%
56
57 BEGIN : HEADER MPC_DECLS DELIMITER G_RULE_LIST
58 (HEADER,MPC_DECLS,rev G_RULE_LIST)
59
60 MPC_DECLS : MPC_DECLS MPC_DECL
61 (join_decls(MPC_DECLS,MPC_DECL,inputSource,MPC_DECLleft))
62
63 MPC_DECLS: (DECL {prec=nil,nonterm=NONE,term=NONE,eop=nil,control=nil,
64 keyword=nil,change=nil,
65 value=nil})
66
67 MPC_DECL: TERM CONSTR_LIST
68 (DECL { prec=nil,nonterm=NONE,
69 term = SOME CONSTR_LIST, eop =nil,control=nil,
70 change=nil,keyword=nil,
71 value=nil})
72
73 | NONTERM CONSTR_LIST
74 (DECL { prec=nil,control=nil,nonterm= SOME CONSTR_LIST,
75 term = NONE, eop=nil,change=nil,keyword=nil,
76 value=nil})
77
78 | PREC ID_LIST
79 (DECL {prec= [(PREC,ID_LIST)],control=nil,
80 nonterm=NONE,term=NONE,eop=nil,change=nil,
81 keyword=nil,value=nil})
82
83 | START ID
84 (DECL {prec=nil,control=[START_SYM (symbolMake ID)],nonterm=NONE,
85 term = NONE, eop = nil,change=nil,keyword=nil,
86 value=nil})
87
88 | PERCENT_EOP ID_LIST
89 (DECL {prec=nil,control=nil,nonterm=NONE,term=NONE,
90 eop=ID_LIST, change=nil,keyword=nil,
91 value=nil})
92
93 | KEYWORD ID_LIST
94 (DECL {prec=nil,control=nil,nonterm=NONE,term=NONE,eop=nil,
95 change=nil,keyword=ID_LIST,
96 value=nil})
97
98 | PREFER ID_LIST
99 (DECL {prec=nil,control=nil,nonterm=NONE,term=NONE,eop=nil,
100 change=map (fn i=>([],[i])) ID_LIST,keyword=nil,
101 value=nil})
102
103 | CHANGE CHANGE_DECL
104 (DECL {prec=nil,control=nil,nonterm=NONE,term=NONE,eop=nil,
105 change=CHANGE_DECL,keyword=nil,
106 value=nil})
107 | SUBST SUBST_DECL
108 (DECL {prec=nil,control=nil,nonterm=NONE,term=NONE,eop=nil,
109 change=SUBST_DECL,keyword=nil,
110 value=nil})
111 | NOSHIFT ID_LIST
112 (DECL {prec=nil,control=[NSHIFT ID_LIST],nonterm=NONE,term=NONE,
113 eop=nil,change=nil,keyword=nil,
114 value=nil})
115 | PERCENT_HEADER PROG
116 (DECL {prec=nil,control=[FUNCTOR PROG],nonterm=NONE,term=NONE,
117 eop=nil,change=nil,keyword=nil,
118 value=nil})
119 | PERCENT_TOKEN_SIG_INFO PROG
120 (DECL {prec=nil,control=[TOKEN_SIG_INFO PROG],
121 nonterm=NONE,term=NONE,
122 eop=nil,change=nil,keyword=nil,
123 value=nil})
124 | NAME ID
125 (DECL {prec=nil,control=[PARSER_NAME (symbolMake ID)],
126 nonterm=NONE,term=NONE,
127 eop=nil,change=nil,keyword=nil, value=nil})
128
129 | PERCENT_ARG PROG COLON TY
130 (DECL {prec=nil,control=[PARSE_ARG(PROG,TY)],nonterm=NONE,
131 term=NONE,eop=nil,change=nil,keyword=nil,
132 value=nil})
133
134 | VERBOSE
135 (DECL {prec=nil,control=[Hdr.VERBOSE],
136 nonterm=NONE,term=NONE,eop=nil,
137 change=nil,keyword=nil,
138 value=nil})
139 | NODEFAULT
140 (DECL {prec=nil,control=[Hdr.NODEFAULT],
141 nonterm=NONE,term=NONE,eop=nil,
142 change=nil,keyword=nil,
143 value=nil})
144 | PERCENT_PURE
145 (DECL {prec=nil,control=[Hdr.PURE],
146 nonterm=NONE,term=NONE,eop=nil,
147 change=nil,keyword=nil,
148 value=nil})
149 | PERCENT_POS TY
150 (DECL {prec=nil,control=[Hdr.POS TY],
151 nonterm=NONE,term=NONE,eop=nil,
152 change=nil,keyword=nil,
153 value=nil})
154 | VALUE ID PROG
155 (DECL {prec=nil,control=nil,
156 nonterm=NONE,term=NONE,eop=nil,
157 change=nil,keyword=nil,
158 value=[(symbolMake ID,PROG)]})
159
160 CHANGE_DECL : CHANGE_DEC BAR CHANGE_DECL
161 (CHANGE_DEC :: CHANGE_DECL)
162 | CHANGE_DEC
163 ([CHANGE_DEC])
164
165 CHANGE_DEC : ID_LIST ARROW ID_LIST
166 (ID_LIST1, ID_LIST2)
167
168 SUBST_DECL : SUBST_DEC BAR SUBST_DECL
169 (SUBST_DEC :: SUBST_DECL)
170 | SUBST_DEC
171 ([SUBST_DEC])
172
173 SUBST_DEC: ID FOR ID
174 ([symbolMake ID2],[symbolMake ID1])
175
176 CONSTR_LIST : CONSTR_LIST BAR ID OF TY
177 ((symbolMake ID,SOME (tyMake TY))::CONSTR_LIST)
178
179 | CONSTR_LIST BAR ID
180 ((symbolMake ID,NONE)::CONSTR_LIST)
181
182 | ID OF TY ([(symbolMake ID,SOME (tyMake TY))])
183
184 | ID ([(symbolMake ID,NONE)])
185
186 G_RULE : ID COLON RHS_LIST
187 (map (fn {rhs,code,prec} =>
188 Hdr.RULE {lhs=symbolMake ID,rhs=rhs,
189 code=code,prec=prec})
190 RHS_LIST)
191
192 G_RULE_LIST: G_RULE_LIST G_RULE (G_RULE@G_RULE_LIST)
193 | G_RULE (G_RULE)
194
195 ID_LIST : ID ID_LIST (symbolMake ID :: ID_LIST)
196 | (nil)
197
198 RHS_LIST : ID_LIST G_RULE_PREC PROG
199 ([{rhs=ID_LIST,code={text=PROG,pos=PROGleft},prec=G_RULE_PREC}])
200
201 | RHS_LIST BAR ID_LIST G_RULE_PREC PROG
202 ({rhs=ID_LIST,code={text=PROG,pos=PROGleft},prec=G_RULE_PREC}::RHS_LIST)
203
204 TY : TYVAR
205 (TYVAR)
206 | LBRACE RECORD_LIST RBRACE
207 ("{ "^RECORD_LIST^" } ")
208 | LBRACE RBRACE
209 ("{}")
210 | PROG
211 (" ( "^PROG^" ) ")
212 | TY QUAL_ID
213 (TY^" "^QUAL_ID)
214 | QUAL_ID
215 (QUAL_ID)
216 | TY ASTERISK TY
217 (TY1^"*"^TY2)
218 | TY ARROW TY
219 (TY1 ^ " -> " ^ TY2)
220
221 RECORD_LIST : RECORD_LIST COMMA LABEL COLON TY
222 (RECORD_LIST^","^LABEL^":"^TY)
223 | LABEL COLON TY
224 (LABEL^":"^TY)
225
226 QUAL_ID : ID ((fn (a,_) => a) ID)
227 | IDDOT QUAL_ID (IDDOT^QUAL_ID)
228
229 LABEL : ID ((fn (a,_) => a) ID)
230 | INT (INT)
231
232 G_RULE_PREC : PREC_TAG ID (SOME (symbolMake ID))
233
234 G_RULE_PREC : (NONE)