%{ #include #include "syntree.h" #define YYDEBUG 1 extern int yylex(); extern int yyerror(char* s); int table[26]; %} %left '=' %left '<' '>' %left '+' '-' %left '*' '/' %union { int num; char chr; nodeType* ptr; } %token PRINT WHILE FOR %token NUM %token ID %type expr stmt stmt_list %% S : stmt_list { interpret($1, table); freeNode($1); } ; stmt : PRINT '(' expr ')' ';' { $$ = unOp(PRINT, $3); } | WHILE '(' expr ')' stmt { $$ = binOp(WHILE, $3, $5); } | FOR '(' expr ';' expr ';' expr ')' stmt { $$ = binOp(';', $3, binOp(WHILE, $5, binOp(';', $9, $7))); } | expr ';' { $$ = $1; } | '{' stmt_list '}' { $$ = $2; } ; stmt_list : stmt_list stmt { $$ = binOp(';', $1, $2); } | stmt { $$ = $1; } ; expr : expr '+' expr { $$ = binOp('+', $1, $3); } | expr '-' expr { $$ = binOp('-', $1, $3); } | expr '*' expr { $$ = binOp('*', $1, $3); } | expr '/' expr { $$ = binOp('/', $1, $3); } | expr '<' expr { $$ = binOp('<', $1, $3); } | expr '>' expr { $$ = binOp('>', $1, $3); } | ID '=' expr { $$ = binOp('=', id($1 - 'a'), $3); } | '(' expr ')' { $$ = $2; } | NUM { $$ = con($1); } | ID { $$ = id($1 - 'a'); } ; %% int main() { yydebug = 0; yyparse(); return 0; }