-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparser.mly
83 lines (70 loc) · 1.61 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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
%token <int> INDEX
%token <string> FREE
%token <string> GLOBAL
%token LPAREN
%token RPAREN
%token LAMBDA
%token PI
%token DOT
%token COLON
%token COMMA
%token EOF
%token STAR
%token BOX
%token DEFINITION
%token END
%token AS
%start <Syntax.prog> prog
%%
prog: l = list(toplevel); EOF { l } ;
toplevel:
| t = theorem { t }
| a = axiom { a }
;
theorem:
| DEFINITION; n = GLOBAL; LPAREN; p = typed_parameter_list; RPAREN; AS; e1 = expression; COLON; e2 = expression; END
{ let t: Syntax.theorem = {
name = n;
parameter_list = p;
proposition = e2;
proof = e1
} in Syntax.Theorem (t) }
;
axiom:
| DEFINITION; n = GLOBAL; LPAREN; p = typed_parameter_list; RPAREN; COLON; e1 = expression; END
{ let a: Syntax.axiom = {
name = n;
parameter_list = p;
proposition = e1;
} in Syntax.Axiom (a) }
;
typed_parameter_list:
p = separated_list(COMMA, typed_parameter) { p } ;
typed_parameter:
n = FREE; COLON; e = expression { (n, e) };
expression:
| LAMBDA; e1 = expression; DOT; e2 = expression
{ Syntax.Lambda (e1, e2) }
| PI; e1 = expression; DOT; e2 = expression
{ Syntax.Pi (e1, e2) }
| a = application
{ a }
| n = GLOBAL; LPAREN; a = argument_list; RPAREN
{ Syntax.Instance (n, a) }
;
argument_list:
args = separated_list(COMMA, expression) { args } ;
application:
| e = simple
{ e }
| e1 = application; e2 = simple
{ Syntax.Application (e1, e2) }
;
simple:
| LPAREN; e = expression; RPAREN
{ e }
| x = FREE { Syntax.Free x }
| i = INDEX { Syntax.Index i }
| STAR { Syntax.Star }
| BOX { Syntax.Box }
;