-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgrammar.sablecc
72 lines (59 loc) · 1.51 KB
/
grammar.sablecc
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
Grammar minilang;
Lexer
int = ('0'..'9')+ ;
blank = ' ' | #10 | #13 | #9;
id = ('a'..'z')+;
str = '"' (Any - '"')* '"';
Parser
Ignored blank;
prog = defs? stmts;
def = 'def' id '(' params? ')' '{' stmts '}' ;
defs = def | defs def;
params =
{multiple:} params ',' param |
{single:} param ;
param = 'int' id ;
stmts = stmt | stmts stmt;
cond =
{eq:} [left:]expr '==' [right:]expr |
{ne:} [left:]expr '!=' [right:]expr |
{lte:} [left:]expr '<=' [right:]expr |
{gte:} [left:]expr '>=' [right:]expr |
{lt:} [left:]expr '<' [right:]expr |
{gt:} [left:]expr '>' [right:]expr;
stmt =
{if:} 'if' '(' cond ')' '{' stmts '}' else |
{while:} 'while' '(' cond ')' '{' stmts '}' |
{print:} 'print' '(' [expr:]expr ')' ';' |
{print_str:} 'print' '(' str ')' ';' |
{decl:} 'int' id ';' |
{return:} 'return' [expr:]expr? ';' |
{assign:} id '=' [expr:]expr ';' |
{call:} call ';' ;
call =
id '(' arguments? ')' ;
arguments =
{multiple:} arguments ',' [expr:]expr |
{single:} [expr:]expr ;
else =
{none:} |
{elseif:} 'else' 'if' '(' cond ')' '{' stmts '}' else |
{else:} 'else' '{' stmts '}';
expr =
expr_2 {->};
expr_2 {->expr} =
{mod:} [left:]expr_2 '%' [right:]expr_3 |
{mul:} [left:]expr_2 '*' [right:]expr_3 |
{div:} [left:]expr_2 '/' [right:]expr_3 |
expr_3 {->};
expr_3 {->expr} =
{add:} [left:]expr_3 '+' [right:]expr_4 |
{sub:} [left:]expr_3 '-' [right:]expr_4 |
expr_4 {->};
expr_4 {->expr} =
{call:} call |
{neg:} '-' expr_4 |
{par:} '(' expr ')' |
{var:} id |
{read:} 'read' '(' ')' |
{int:} int;