www.pudn.com > interpreter.zip > interpreter.y
%{
#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"