%{ #include #include #include #include "lex.yy.c" extern int yylval; int symcount=0; int strcount=0; int mytreecount=0; int temp; char mys[80]; struct { char op; int lefttable, left,righttable,right; } mytree[5000]; typedef int YYSTYPE; %} %token GE %token LE %token READ %token ID %token EQEQ %token ASSIGN %token NUM %token PRINT %token IF %token DO %token NEWLINE %token THEN %token STR %token ELSE %token WHILE %token ENDIF %token ENDWHILE %left '+' '-' '<' '>' GE LE EQEQ %left '*' '/' %left UMINUS %start stmtlist %% stmtlist: stmtlist stmt { $$ = myinsert(';',1,$1,1,$2); } | stmt { $$= $1;} ; stmt: ID ASSIGN expr ';' { $$ =myinsert('=',0,$1,1,$3); } | PRINT expr ';' { $$ = myinsert('P',1,$2,0,0); } | PRINT STR ';' { $$ = myinsert('p',2,$2,0,0);} | PRINT NEWLINE ';' { $$ = myinsert('q',2,$2,0,0);} | IF expr THEN stmtlist ELSE stmtlist ENDIF { $$=myinsert('i',1,$2,0,0);temp=myinsert('i',1,$4,1,$6); } | IF expr THEN stmtlist ENDIF { $$=myinsert('I',1,$2,1,$4); } | WHILE expr DO stmtlist ENDWHILE { $$=myinsert('d',1,$2,1,$4);} ; expr : expr '+' expr { $$ =myinsert('+',1,$1,1,$3);} | expr '-' expr { $$ =myinsert('-',1,$1,1,$3); } | expr '/' expr { $$ =myinsert('/',1,$1,1,$3);} | expr '*' expr { $$ = myinsert('*',1,$1,1,$3); } | '(' expr ')' { $$ = $2;} | ID { $$ = myinsert('L',0,yylval,0,0);} | NUM {$$ = myinsert('L',0,yylval,0,0);} | expr '>' expr { $$ =myinsert('>',1,$1,1,$3);} | expr '<' expr { $$ =myinsert('<',1,$1,1,$3);} | expr EQEQ expr { $$ = myinsert('e',1,$1,1,$3);} | expr GE expr { $$ = myinsert('g',1,$1,1,$3);} ; %% void yyerror(char *msg); YYSTYPE myinsert(char op, int lefttable, YYSTYPE left, int righttable,YYSTYPE right); void list_mytree(void); void list_table(void); int evaluate_tree(int); int main() { do { yyparse(); list_mytree(); evaluate_tree(mytreecount-1); list_table(); } while(!feof(stdin)); return 1; } void yyerror(char *msg) { printf("%s\n",msg); } YYSTYPE myinsert(char op, int lefttable,YYSTYPE left, int righttable,YYSTYPE right) { mytree[mytreecount].op =op; mytree[mytreecount].lefttable=lefttable; mytree[mytreecount].left =left; mytree[mytreecount].righttable=righttable; mytree[mytreecount].right =right; mytreecount++; return (mytreecount-1); } int evaluate_tree(int i) { int leftvalue,rightvalue; /* printf("Node executing %d\n",i);*/ switch (mytree[i].op) { case '+': leftvalue = evaluate_tree(mytree[i].left); rightvalue = evaluate_tree(mytree[i].right); return leftvalue+rightvalue; case '>': leftvalue = evaluate_tree(mytree[i].left); rightvalue = evaluate_tree(mytree[i].right); return leftvalue>rightvalue; case '<': leftvalue = evaluate_tree(mytree[i].left); rightvalue = evaluate_tree(mytree[i].right); return (leftvalue < rightvalue); case 'e': leftvalue = evaluate_tree(mytree[i].left); rightvalue = evaluate_tree(mytree[i].right); return leftvalue==rightvalue; case 'g': leftvalue = evaluate_tree(mytree[i].left); rightvalue = evaluate_tree(mytree[i].right); return leftvalue>=rightvalue; case '*': leftvalue = evaluate_tree(mytree[i].left); rightvalue = evaluate_tree(mytree[i].right); return leftvalue*rightvalue; case '-': leftvalue = evaluate_tree(mytree[i].left); rightvalue = evaluate_tree(mytree[i].right); return leftvalue-rightvalue; case '/': leftvalue = evaluate_tree(mytree[i].left); rightvalue = evaluate_tree(mytree[i].right); return leftvalue/rightvalue; case '=': rightvalue = evaluate_tree(mytree[i].right); sym_tbl[mytree[i].left].value=rightvalue; return 1; case 'L': return sym_tbl[mytree[i].left].value; case ';': leftvalue = evaluate_tree(mytree[i].left); rightvalue = evaluate_tree(mytree[i].right); return 1; case 'P' : leftvalue=evaluate_tree(mytree[i].left); printf("%d", leftvalue); return 1; case 'q' : printf("\n"); return 1; case 'p': printf("%s",str_tbl[mytree[i].left]); return 1; default: printf("How did I get here?\n"); exit(0); } } void list_mytree (void) { int i; /* printf("Derivation code\n"); */ /* printf("mytreecount %d\n", mytreecount); */ printf("mytree\t \n"); for(i=0;i