-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparser.mly
More file actions
99 lines (95 loc) · 3.54 KB
/
Copy pathparser.mly
File metadata and controls
99 lines (95 loc) · 3.54 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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
%token<string> IDENTIFIER
%token<int> NUMBER
%token COMMA SEMI
%token FUNC LOCAL RETURN
%token IF ELSE FOR WHILE
%token LPAREN RPAREN LBRACE RBRACE
%token PLUS MINUS MULT DIV
%token LE LT GE GT NE EQ OR AND
%token ASSIGN
%token TRUE FALSE
%token EOF
%left OR
%left AND
%left LT LE GT GE EQ NE
%left PLUS MINUS
%left MULT DIV
%start program
%type<Ast.program> program
%%
program
: eds = list(external_definition); EOF
{ eds }
;
external_definition
: FUNC; fn = IDENTIFIER; LPAREN; params = separated_list(COMMA, IDENTIFIER); RPAREN; body = block
{ Ast.Function_definition (fn, params, body) }
| LOCAL; vn = IDENTIFIER; ASSIGN; e = expression; SEMI
{ Ast.Variable_definition (vn, Some e) }
| LOCAL; vn = IDENTIFIER; SEMI
{ Ast.Variable_definition (vn, None) }
;
block
: LBRACE; stmts = list(statement); RBRACE
{ stmts }
;
statement
: IF; LPAREN; condition = expression; RPAREN; stmt = statement
{ Ast.If_statement (condition, stmt, None) }
| IF; LPAREN; condition = expression; RPAREN; stmt1 = statement; ELSE; stmt2 = statement
{ Ast.If_statement (condition, stmt1, Some stmt2) }
| FOR; LPAREN; init_stmt = statement; condition = expression; SEMI; prop_stmt = statement; RPAREN; stmt = statement
{ Ast.For_statement (init_stmt, condition, prop_stmt, stmt) }
| WHILE; LPAREN; condition = expression; RPAREN; stmt = statement
{ Ast.While_statement (condition, stmt) }
| stmts = block
{ Ast.Block_statement (stmts) }
| LOCAL; vn = IDENTIFIER; ASSIGN; e = expression; SEMI
{ Ast.Local_variable_definition_statement(vn, Some e) }
| LOCAL; vn = IDENTIFIER; SEMI
{ Ast.Local_variable_definition_statement(vn, None) }
| vn = IDENTIFIER; ASSIGN; e = expression; SEMI
{ Ast.Assign_statement (vn, e) }
| fn = IDENTIFIER; LPAREN; args = separated_list(COMMA, expression); RPAREN; SEMI
{ Ast.Function_call_statement (fn, args) }
| RETURN; e = expression; SEMI
{ Ast.Return_statement (Some e) }
| RETURN; SEMI
{ Ast.Return_statement (None) }
;
expression
: id = IDENTIFIER
{ Ast.Variable_expression (id) }
| n = NUMBER
{ Ast.Number_expression (n) }
| TRUE
{ Ast.Boolean_expression (true) }
| FALSE
{ Ast.Boolean_expression (false) }
| fn = IDENTIFIER; LPAREN; args = separated_list(COMMA, expression); RPAREN
{ Ast.Function_call_expression (fn, args) }
| lhs = expression; PLUS; rhs = expression
{ Ast.Binary_operation_expression (lhs, Ast.Plus, rhs) }
| lhs = expression; MINUS; rhs = expression
{ Ast.Binary_operation_expression (lhs, Ast.Minus, rhs) }
| lhs = expression; MULT; rhs = expression
{ Ast.Binary_operation_expression (lhs, Ast.Mult, rhs) }
| lhs = expression; DIV; rhs = expression
{ Ast.Binary_operation_expression (lhs, Ast.Div, rhs) }
| lhs = expression; LT; rhs = expression
{ Ast.Binary_operation_expression (lhs, Ast.Lt, rhs) }
| lhs = expression; LE; rhs = expression
{ Ast.Binary_operation_expression (lhs, Ast.Le, rhs) }
| lhs = expression; GT; rhs = expression
{ Ast.Binary_operation_expression (lhs, Ast.Gt, rhs) }
| lhs = expression; GE; rhs = expression
{ Ast.Binary_operation_expression (lhs, Ast.Ge, rhs) }
| lhs = expression; EQ; rhs = expression
{ Ast.Binary_operation_expression (lhs, Ast.Eq, rhs) }
| lhs = expression; NE; rhs = expression
{ Ast.Binary_operation_expression (lhs, Ast.Ne, rhs) }
| lhs = expression; AND; rhs = expression
{ Ast.Binary_operation_expression (lhs, Ast.And, rhs) }
| lhs = expression; OR; rhs = expression
{ Ast.Binary_operation_expression (lhs, Ast.Or, rhs) }
;