-
Notifications
You must be signed in to change notification settings - Fork 0
/
Parser.y
55 lines (41 loc) · 1.32 KB
/
Parser.y
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
{
module Parser (parser) where
import Types
import Lexer
}
%name parser
%tokentype { Token }
%error { parseError }
%token
while { While _ }
do { Do _ }
'[' { BracketOpen _ }
']' { BracketClose _ }
'(' { ParensOpen _ }
')' { ParensClose _ }
';' { Semicolon _ }
':=' { Assign _ }
sym { Sym _ $$ }
var { Var _ $$ }
int { Int _ $$ }
'<' { TLT _ }
'>' { TGT _ }
'&&' { TAND _ }
%%
program : statements { Program $1 }
statements : {- empty -} { [] }
| statements statement { $2 : $1 }
statement : var ':=' expr ';' { Sass $1 $3 }
| var ':=' expr { Sass $1 $3 }
| while exprb do '(' statements ')' { Swhile $2 $5 }
expr : expr1 { $1 }
| expr sym expr1 { Aop $2 $1 $3 }
expr1 : var { Variable $1 }
| '(' expr ')' { $2 }
exprb : exprb1 '&&' exprb { Band $1 $3 }
| exprb1 { $1 }
exprb1 : expr '<' expr { Bleq $1 $3 }
{
parseError :: [Token] -> a
parseError _ = error "Parse error"
}