-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathparser.mly
68 lines (57 loc) · 1.33 KB
/
parser.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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
%token UNDERSCORE "_"
%token KEYWORD_FUN "fun"
%token KEYWORD_LET "let"
%token KEYWORD_TYPE "Type"
%token <string> NAME
%token COLON ":"
%token COLON_EQUALS ":="
%token EQUALS_GREATER "=>"
%token HYPHEN_GREATER "->"
%token SEMICOLON ";"
%token LPAREN "("
%token RPAREN ")"
%token END
%start <Surface.tm> main
%%
let main :=
| t = tm; END;
{ t }
let tm :=
| "let"; p = pattern; ps = list(param); t1 = option(":"; t1 = tm; { t1 }); ":=";
t2 = tm; ";"; t3 = tm;
{ Surface.Let (p, ps, t1, t2, t3) }
| t1 = app_tm; ":"; t2 = tm;
{ Surface.Ann (t1, t2) }
| t1 = app_tm; "->"; t2 = tm;
{ Surface.Fun_arrow (t1, t2) }
| "fun"; ps = nonempty_list(param); "->"; t = tm;
{ Surface.Fun_type (ps, t) }
| "fun"; ps = nonempty_list(param); t1 = option(":"; t1 = tm; { t1 }); "=>"; t2 = tm;
{ Surface.Fun_lit (ps, t1, t2) }
| app_tm
let app_tm :=
| t = atomic_tm; ts = nonempty_list(atomic_tm);
{ Surface.Fun_app (t, ts) }
| atomic_tm
let atomic_tm :=
| n = NAME;
{ Surface.Name n }
| "Type";
{ Surface.Univ }
| "("; t = tm; ")";
{ t }
let pattern :=
| "_";
{ None }
| n = NAME;
{ Some n }
let param :=
| "("; p = pattern; ":"; t = tm; ")";
{ p, Some t }
| p = pattern;
{ p, None }
let nonempty_sequence(T) :=
| t = T; option(";");
{ [ t ] }
| t = T; ";"; ts = nonempty_sequence(T);
{ t :: ts }