-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparser_prog.mly
53 lines (46 loc) · 1.63 KB
/
parser_prog.mly
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
%%
import_req(kind,typ):
| VAL x=ID y=option(preceded(AS,ID)) COLON t=typ
{ let var = match y with
| None -> locate x $startpos(x) $endpos(x)
| Some y -> locate y $startpos(y) $endpos(y)
in RequireVal(var, t) }
| TYPE x=ID y=option(preceded(AS,ID)) DBLCOLON k=kind
{ let var = match y with
| None -> locate x $startpos(x) $endpos(x)
| Some y -> locate y $startpos(y) $endpos(y)
in RequireTyp(var, locate k $startpos(k) $endpos(k))
}
| TYPE x=ID y=option(preceded(AS,ID)) DBLCOLON k=kind EQ t=typ
{ let var = match y with
| None -> locate x $startpos(x) $endpos(x)
| Some y -> locate y $startpos(y) $endpos(y)
in RequireTyp(var, locate (Single(t, k)) $startpos(k) $endpos(t))
}
export_req(kind,typ):
| TYPE x=ID y=option(preceded(AS,ID)) DBLCOLON k=kind
{ let var = match y with
| None -> locate x $startpos(x) $endpos(x)
| Some y -> locate y $startpos(y) $endpos(y)
in ExportTyp(var, locate k $startpos(k) $endpos(k))
}
| TYPE x=ID y=option(preceded(AS,ID)) DBLCOLON k=kind EQ t=typ
{ let var = match y with
| None -> locate x $startpos(x) $endpos(x)
| Some y -> locate y $startpos(y) $endpos(y)
in ExportTyp(var, locate (Single(t, k)) $startpos(k) $endpos(t))
}
req(kind,typ):
| EXPORT LBRACE l=list(export_req(kind,typ)) RBRACE
{ List.rev l }
| IMPORT LBRACE l=list(import_req(kind,typ)) RBRACE
{ List.rev l }
header(kind,typ):
| l=list(req(kind,typ))
{ List.flatten (List.rev l) }
header_expr(kind,typ):
| h=header(kind,typ) EOF { h }
main_header_expr:
| h=header_expr(kind,typ) { h }
prog:
| h=header(kind,typ) t=main_term_expr { { reqs = h ; code = t } }