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"