139 lines
1.6 KiB
Plaintext
139 lines
1.6 KiB
Plaintext
%{
|
|
|
|
#include <string>
|
|
#include <iostream>
|
|
#include <set>
|
|
#include "parser.hpp"
|
|
|
|
%}
|
|
|
|
%token INDENT
|
|
%token DEDENT
|
|
%token NEWLINE
|
|
%token AND
|
|
%token BREAK
|
|
%token DEF
|
|
%token ELIF
|
|
%token ELSE
|
|
%token FOR
|
|
%token IF
|
|
%token NOT
|
|
%token OR
|
|
%token RETURN
|
|
%token WHILE
|
|
%token BOOLEAN
|
|
%token FLOAT
|
|
%token INTEGER
|
|
%token IDENTIFIER
|
|
%token ASSIGN
|
|
%token PLUS
|
|
%token MINUS
|
|
%token TIMES
|
|
%token DIVIDEDBY
|
|
%token EQ
|
|
%token NEQ
|
|
%token GT
|
|
%token GTE
|
|
%token LT
|
|
%token LTE
|
|
%token LPAREN
|
|
%token RPAREN
|
|
%token COMMA
|
|
%token COLON
|
|
|
|
%define api.value.type { const char* }
|
|
%define api.pure full
|
|
%define api.push-pull push
|
|
%start program
|
|
|
|
%{
|
|
|
|
void yyerror(const char* s) {
|
|
std::cout << s << std::endl;
|
|
}
|
|
|
|
std::set<std::string> varset;
|
|
|
|
%}
|
|
|
|
%%
|
|
|
|
program
|
|
: stmts
|
|
;
|
|
|
|
stmts
|
|
: stmts stmt
|
|
| stmt
|
|
;
|
|
|
|
stmt
|
|
: expr NEWLINE
|
|
| if
|
|
| while
|
|
| BREAK NEWLINE
|
|
;
|
|
|
|
expr
|
|
: assign
|
|
| 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
|
|
;
|
|
|
|
%%
|