%{ #include #include #include #include #include "chatzidimitriou_syntax.cpp.h" void yyerror(char *); extern int yylex(); extern char *yytext; extern FILE *yyin; %} %token BYTE 1 %token DELETE 2 %token ELSE 3 %token FALSE 4 %token IF 5 %token INT 6 %token NEW 7 %token NULL 8 %token PROC 9 %token REFERENCE 10 %token RETURN 11 %token WHILE 12 %token WITH 13 %token TRUE 14 %token EQUAL 15 %token NOTEQUAL 16 %token GREQUAL 17 %token LEEQUAL 18 %token OR_OP 19 %token AND_OP 20 %token UINT_CONST 21 %token CHAR_CONST 22 %token STRING_CONST 23 %token IDENTIFIER 24 %token GENERIC_ERROR 25 %right '+' %right '-' %left '*' '/' '%' %left '+' '-' %nonassoc EQUAL NOTEQUAL '>' '<' GREQUAL LEEQUAL %right '!' %left AND_OP %left OR_OP %% program: func-def; func_def: identifier '(' func_par_list1 ')' ':' r_type local_defs comp_statement; func_par_list1: | func_par_list; func_par_list: id ':' type | id ':' 'reference' type; type: 'int' | 'byte' | type '[' ']'; r-type: type | 'proc'; local_defs: | local_defs local_def; local_def: func-def | var-def; var-def: id ':' type ';'; stmt: ';' | lvalue ':=' expr ';' | compound-stmt | func-call ';' | 'if' '(' cond ')' stmt else1 | 'while' '(' cond ')' stmt | 'return' expr ';' | 'new' lvalue 'with' expr ';' | 'delete' lvalue ';' ; else1: | 'else' stmt; compound-stm: '{' stmt '}'; func-call: id '(' expr-list ')'; expr-list: expr | expr ',' expr-list; expr: 'null' | id | '(' expr ')' | func-call | unary_op expr | expr operand expr ; lvalue: id | expr '[' expr ']'; cond: 'true' | 'false' | '(' cond ')' | '!' cond | expr rel_op; rel_op: EQUAL | NOTEQUAL | '<' | '>' | GREQUAL | LEEQUAL; operand: '+'|'-'|'*'|'/'; unary_op: '+' | '-'; %% int main(int argc, char *argv[]) { if(yyparse() != 0){ printf ("Error!"); exit(1); } else { printf ("Successful!"); } return EXIT_SUCCESS; }