/
dcv.peg
34 lines (26 loc) · 861 Bytes
/
dcv.peg
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
# Grammar
Stmt <- SPACE Expr EOL { printf("%d\n", pop()); }
/ (!EOL .)* EOL { printf("error\n"); }
Expr <- ID { var= yytext[0] } ASSIGN Sum { vars[var - 'a']= top(); }
/ Sum
Sum <- Product ( PLUS Product { int r= pop(), l= pop(); push(l + r); }
/ MINUS Product { int r= pop(), l= pop(); push(l - r); }
)*
Product <- Value ( TIMES Value { int r= pop(), l= pop(); push(l * r); }
/ DIVIDE Value { int r= pop(), l= pop(); push(l / r); }
)*
Value <- NUMBER { push(atoi(yytext)); }
/ < ID > !ASSIGN { push(vars[yytext[0] - 'a']); }
/ OPEN Expr CLOSE
# Lexemes
NUMBER <- < [0-9]+ > SPACE
ID <- < [a-z] > SPACE
ASSIGN <- '=' SPACE
PLUS <- '+' SPACE
MINUS <- '-' SPACE
TIMES <- '*' SPACE
DIVIDE <- '/' SPACE
OPEN <- '(' SPACE
CLOSE <- ')' SPACE
SPACE <- [ \t]*
EOL <- '\n' / '\r\n' / '\r' / ';'