-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparser.mly
More file actions
67 lines (55 loc) · 1.1 KB
/
Copy pathparser.mly
File metadata and controls
67 lines (55 loc) · 1.1 KB
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
%{
open Ast
%}
%token EOF
%token <int> INT
%token <string> ID
%token LPAREN RPAREN
%token PLUS MINUS STAR EQUALS LTE
%token TRUE FALSE
%token IF THEN ELSE
%token LET IN
%token FUN ARROW
%token REC
%nonassoc ELSE IN ARROW
%left LTE
%left PLUS MINUS
%left STAR
%start program
%type <Ast.expr> program expr unary app primary
%%
program:
| e = expr; EOF { e }
;
expr:
| e1 = expr; op = bin_op; e2 = expr { EBinOp(op, e1, e2) }
| IF; e1 = expr; THEN; e2 = expr; ELSE; e3 = expr { EIf(e1, e2, e3) }
| FUN; x = ID; ARROW; e = expr { EFun(x, e) }
| LET; x = ID; EQUALS; e1 = expr; IN; e2 = expr { ELet(x, e1, e2) }
| LET; REC; x = ID; EQUALS; e1 = expr; IN; e2 = expr { ELet(x, ERec(x, e1), e2) }
| e = unary { e }
;
%inline bin_op:
| PLUS { Add }
| MINUS { Sub }
| STAR { Mul }
| LTE { Lte }
;
unary:
| op = un_op; e = unary { EUnOp(op, e) }
| e = app { e }
;
%inline un_op:
| MINUS { Neg }
;
app:
| e1 = app; e2 = primary { EApp(e1, e2) }
| e = primary { e }
;
primary:
| i = INT { EInt i }
| id = ID { EVar id }
| TRUE { EBool true }
| FALSE { EBool false }
| LPAREN; e = expr; RPAREN { e }
;