-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathParser.fsy
153 lines (115 loc) · 5.42 KB
/
Parser.fsy
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
%{
open TinyML
open FSharp.Common.Parsing.LexYacc
open TinyML.Ast
let parse_error_rich = Some (fun ctx -> raise (ParseErrorContextException ctx))
%}
%token <System.Int32> INT
%token <System.Double> FLOAT
%token <System.Char> CHAR
%token <System.String> STRING ID
%token IF THEN ELSE FUN ARROW LET REC IN
TRUE FALSE
BRA KET
PLUS MINUS STAR SLASH PERCENT
PLUS_FLOAT MINUS_FLOAT STAR_FLOAT SLASH_FLOAT
LT GT LEQ GEQ EQ NEQ
LT_FLOAT GT_FLOAT LEQ_FLOAT GEQ_FLOAT EQ_FLOAT NEQ_FLOAT
AND OR NOT NEG NEG_FLOAT
COLON SEMICOLON2 COMMA
%token EOF
%nonassoc THEN ELSE
%left COMMA
%right ARROW
%left OR
%left AND
%left EQ LT GT LEQ GEQ NEQ
%left PLUS MINUS
%left PLUS_FLOAT MINUS_FLOAT STAR_FLOAT SLASH_FLOAT
%left STAR SLASH MOD
%left APP
%nonassoc NOT
%nonassoc NEG
%nonassoc NEG_FLOAT
%type < TinyML.Ast.expr > program
%type < TinyML.Ast.interactive > interactive
%start program
%start interactive
%%
program:
expr EOF { $1 }
interactive:
expr SEMICOLON2 { IExpr $1 }
| binding SEMICOLON2 { IBinding $1 }
expr:
expr_tuple_atom { $1 }
| BRA expr_tuple_atoms KET { Tuple $2 }
binding:
| LET ID EQ expr { (false, $2, None, $4) }
| LET ID parms EQ expr { (false, $2, None, fold_params $3 $5) }
| LET ID COLON ty EQ expr { (false, $2, Some $4, $6) }
| LET ID parms COLON ty EQ expr { (false, $2, Some $5, fold_params $3 $7) }
| LET REC ID EQ expr { (true, $3, None, $5) }
| LET REC ID parms EQ expr { (true, $3, None, fold_params $4 $6 )}
| LET REC ID parms COLON ty EQ expr { (true, $3, Some $6, fold_params $4 $8) }
| LET REC ID COLON ty EQ expr { (true, $3, Some $5, $7) }
parms:
ID { [$1, None] }
| BRA ID COLON ty KET { [$2, Some $4]}
| ID parms { ($1, None) :: $2 }
| BRA ID COLON ty KET parms { ($2, Some $4) :: $6}
expr_app_atom:
INT { Lit (LInt $1) }
| FLOAT { Lit (LFloat $1) }
| STRING { Lit (LString $1) }
| CHAR { Lit (LChar $1) }
| TRUE { Lit (LBool true) }
| FALSE { Lit (LBool false) }
| BRA KET { Lit LUnit }
| ID { Var $1 }
| BRA expr KET { $2 }
expr_tuple_atom:
expr_app_atom { $1 }
| expr_tuple_atom expr_app_atom %prec APP { App ($1, $2) }
| FUN ID ARROW expr { Lambda ($2, None, $4) }
| FUN BRA ID COLON ty KET ARROW expr { Lambda ($3, Some $5, $8) }
| binding IN expr { LetIn ($1, $3) }
| NOT expr_tuple_atom { UnOp ("not", $2) }
| NEG expr_tuple_atom { UnOp ("neg", $2) }
| NEG_FLOAT expr_tuple_atom { UnOp ("neg.", $2) }
| expr_tuple_atom PLUS expr_tuple_atom { BinOp ($1, "+", $3) }
| expr_tuple_atom MINUS expr_tuple_atom { BinOp ($1, "-", $3) }
| expr_tuple_atom STAR expr_tuple_atom { BinOp ($1, "*", $3) }
| expr_tuple_atom SLASH expr_tuple_atom { BinOp ($1, "/", $3) }
| expr_tuple_atom PERCENT expr_tuple_atom { BinOp ($1, "%", $3) }
| expr_tuple_atom PLUS_FLOAT expr_tuple_atom { BinOp ($1, "+.", $3) }
| expr_tuple_atom MINUS_FLOAT expr_tuple_atom { BinOp ($1, "-.", $3) }
| expr_tuple_atom STAR_FLOAT expr_tuple_atom { BinOp ($1, "*.", $3) }
| expr_tuple_atom SLASH_FLOAT expr_tuple_atom { BinOp ($1, "/.", $3) }
| expr_tuple_atom EQ expr_tuple_atom { BinOp ($1, "=", $3) }
| expr_tuple_atom NEQ expr_tuple_atom { BinOp ($1, "<>", $3) }
| expr_tuple_atom LT expr_tuple_atom { BinOp ($1, "<", $3) }
| expr_tuple_atom GT expr_tuple_atom { BinOp ($1, ">", $3) }
| expr_tuple_atom LEQ expr_tuple_atom { BinOp ($1, "<=", $3) }
| expr_tuple_atom GEQ expr_tuple_atom { BinOp ($1, ">=", $3) }
| expr_tuple_atom EQ_FLOAT expr_tuple_atom { BinOp ($1, "=.", $3) }
| expr_tuple_atom NEQ_FLOAT expr_tuple_atom { BinOp ($1, "<>.", $3) }
| expr_tuple_atom LT_FLOAT expr_tuple_atom { BinOp ($1, "<.", $3) }
| expr_tuple_atom GT_FLOAT expr_tuple_atom { BinOp ($1, ">.", $3) }
| expr_tuple_atom LEQ_FLOAT expr_tuple_atom { BinOp ($1, "<=.", $3) }
| expr_tuple_atom GEQ_FLOAT expr_tuple_atom { BinOp ($1, ">=.", $3) }
| expr_tuple_atom AND expr_tuple_atom { BinOp ($1, "and", $3) }
| expr_tuple_atom OR expr_tuple_atom { BinOp ($1, "or", $3) }
| IF expr THEN expr { IfThenElse ($2, $4, None) }
| IF expr THEN expr ELSE expr { IfThenElse ($2, $4, Some $6) }
expr_tuple_atoms:
expr_tuple_atom { [$1] }
| expr_tuple_atom COMMA expr_tuple_atoms { $1 :: $3 }
ty:
ID { TyName $1 }
| ty ARROW ty { TyArrow ($1, $3) }
| ty_tuple { TyTuple $1 }
| BRA ty KET { $2 }
ty_tuple:
ty { [$1] }
| ty STAR ty_tuple { $1 :: $3 }