Add production rules that seem to work
This commit is contained in:
parent
8d8f3f8c10
commit
51b20b280d
69
parser.y
69
parser.y
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <set>
|
||||
#include "parser.hpp"
|
||||
|
||||
%}
|
||||
|
@ -51,25 +52,87 @@ void yyerror(const char* s) {
|
|||
std::cout << s << std::endl;
|
||||
}
|
||||
|
||||
std::set<std::string> varset;
|
||||
|
||||
%}
|
||||
|
||||
%%
|
||||
|
||||
program
|
||||
: program stmt
|
||||
: stmts
|
||||
;
|
||||
|
||||
stmts
|
||||
: stmts stmt
|
||||
| stmt
|
||||
;
|
||||
|
||||
stmt
|
||||
: expr NEWLINE;
|
||||
: expr NEWLINE
|
||||
| if
|
||||
| while
|
||||
| BREAK NEWLINE
|
||||
;
|
||||
|
||||
expr
|
||||
: assign
|
||||
| INTEGER
|
||||
| eq
|
||||
;
|
||||
|
||||
while
|
||||
: WHILE expr COLON NEWLINE block
|
||||
;
|
||||
|
||||
if
|
||||
: IF expr COLON NEWLINE block ifend
|
||||
| IF expr COLON NEWLINE block
|
||||
;
|
||||
|
||||
ifend
|
||||
: ELIF expr COLON NEWLINE block ifend
|
||||
| ELIF expr COLON NEWLINE block
|
||||
| ELSE COLON NEWLINE block
|
||||
|
||||
block
|
||||
: INDENT stmts DEDENT
|
||||
;
|
||||
|
||||
assign
|
||||
: IDENTIFIER ASSIGN expr
|
||||
;
|
||||
|
||||
eq
|
||||
: eq EQ rel
|
||||
| eq NEQ rel
|
||||
| rel
|
||||
;
|
||||
|
||||
rel
|
||||
: rel LT sum
|
||||
| rel LTE sum
|
||||
| rel GT sum
|
||||
| rel GTE sum
|
||||
| sum
|
||||
;
|
||||
|
||||
sum
|
||||
: sum PLUS factor
|
||||
| sum MINUS factor
|
||||
| factor
|
||||
;
|
||||
|
||||
factor
|
||||
: factor TIMES term
|
||||
| factor DIVIDEDBY term
|
||||
| term
|
||||
;
|
||||
|
||||
term
|
||||
: IDENTIFIER
|
||||
| FLOAT
|
||||
| INTEGER
|
||||
| BOOLEAN
|
||||
| LPAREN expr RPAREN
|
||||
;
|
||||
|
||||
%%
|
||||
|
|
Loading…
Reference in New Issue
Block a user