%{ #include #include #include "./interpreter.h" %} %union { int xnum; int nnum; int treeptr; char * str; double floating; } %token VAR %token NUMBER %token STRING %token WHILE %token PRINTSTR %token PRINTVAR %token LP RP %token LC RC %token SC %right ASGNOP %left LTOP %left ADDOP SUBOP %left MULOP DIVOP %right MINUS %type expr %% stmt.list : | stmt.list stmt ; stmt : VAR ASGNOP expr SC { ec_tree($3); ec_asgn(&x[$1]); } | while.prefix stmt { ec_label(); } | PRINTSTR LP STRING RP SC { ec_pstr ($3); } | PRINTVAR LP VAR RP SC { ec_pvar ( &x[$3] ); } | LC stmt.list RC ; while.prefix : WHILE LP expr RP { ec_addr (); ec_tree ($3); ec_while (); } expr : expr LTOP expr { $$ = binarynode (ltop, $1, $3); } | expr ADDOP expr { $$ = binarynode (addop, $1, $3); } | expr SUBOP expr { $$ = binarynode (subop, $1, $3); } | expr MULOP expr { $$ = binarynode (mulop, $1, $3); } | expr DIVOP expr { $$ = binarynode (divop, $1, $3); } | SUBOP expr %prec MINUS { $$ = unarynode (minus, $2); } | LP expr RP { $$ = $2; } | NUMBER { $$ = setcleaf ($1); } | VAR { $$ = setvleaf ($1);} ; %% /* インタプレータのメイン・ルーチン */ extern FILE *yyin; main(int argc, char *argv[]) { if ( argc != 2 ){ printf ("usage: %s file-name\n", argv[0]); exit(0); } if ( !(yyin = fopen( argv[1], "r")) ){ printf ("cannot open the input file: %s\n", argv[1]); exit(0); } prg_ctr = 0; yyparse(); run_iprg(); } yyerror(s) char *s; { printf ("%s\n",s); exit(0);} #include "/var/home2/fuchino/public_html/experimentIII-2000/lex.yy.c"