home *** CD-ROM | disk | FTP | other *** search
- /* bsgram.y -- grammer specification for bs.
- */
- %{
- #include "bsdefs.h"
-
- char *p; /* the generic pointer */
- int i; /* the generic counter */
-
- struct stk {
- int stack[40];
- int stkp;
- };
-
- struct stk ifstk,whstk,forstk,repstk,lpstk;
- int gomax=0; int ifmax=0; int whmax=0; int formax=0; int repmax=0; int lpmax=0;
-
- extern char *yytext;
- extern char *bsyysval;
- extern int yyleng;
- %}
-
- %term EQUAL NEQ LE LT GE WHILE
- %term GT OR AND NOT RET REPEAT
- %term IF THEN ELSE GOTO GOSUB UNTIL
- %term STOP END INTEGER REAL SCONST ELIHW
- %term LET SWORD PRINT INPUT DATA CFOR
- %term FOR TO STEP READ WRITE NEXT
- %term DEFINE LFUN SFUN FDEF SYMBOL DIM
- %term VALUE IWORD RWORD ROFC LOOP EXITIF
- %term ITOR RTOI ITOA RTOA LEAVE CONTINUE
- %term POOL
-
- %left ',' ';'
- %right '='
- %nonassoc OR AND
- %nonassoc LE LT GE GT EQUAL NEQ
- %left '+' '-'
- %left '*' '/' '%'
- %left UNARY
- %left '('
-
-
- %start lines
-
- %%
-
- lines : /* empty */
- | lines line
- ;
-
- line : lnum stat '\n'
- { printf("\n"); }
- | '\n'
- ;
-
- lnum : INTEGER
- { printf(" line %s ",$1); }
- ;
-
- stat : LET let_xpr
- | let_xpr
- | PRINT pe
- { printf(" print "); }
- | GOTO INTEGER
- { printf(" rlabel LN%s goto ",$2); }
- | GOSUB INTEGER
- { printf(" rlabel LN%s gosub ",$2); }
- | LEAVE
- { printf(" leave "); }
- | CONTINUE
- { printf(" contin "); }
- | RET
- { printf(" return "); }
- | IF bexpr
- {
- lpush(&ifstk,ifmax);
- printf(" rlabel IF%d if ",ifmax);
- ifmax += 2;
- }
- THEN stat
- {
- i = ltop(&ifstk);
- printf(" rlabel IF%d goto ",i+1);
- }
- if_else
- | INPUT
- { printf(" pushstate %d ",M_INPUT); }
- var_lst
- { printf(" popstate "); }
- | STOP
- { printf(" stop "); }
- | END
- { printf(" end "); }
- | FOR ivar '=' rexpr TO rexpr for_step
- {
- lpush(&forstk,formax);
- printf(" rlabel FOR%d rlabel FOR%d enter",
- formax+2,formax+1);
- printf(" icon 0 rlabel FOR%d dlabel FOR%d for ",
- formax+1,formax);
- formax += 3;
- }
- | NEXT
- {
- i = ltop(&forstk);
- printf(" dlabel FOR%d ",i+2);
- }
- ivar
- {
- i = lpop(&forstk);
- printf(" next rlabel FOR%d goto dlabel FOR%d ",
- i,i+1);
- printf("exitlp ");
- }
- | READ { printf(" pushstate %d ",M_READ); } var_lst
- { printf(" popstate "); }
- | DATA { printf(" data "); } data_lst
- | LOOP
- {
- lpush(&lpstk,lpmax);
- printf(" rlabel LP%d rlabel LP%d enter",
- lpmax+2,lpmax+1);
- printf(" dlabel LP%d ",lpmax);
- lpmax += 3;
- }
- | EXITIF bexpr
- {
- i = ltop(&lpstk);
- printf(" not rlabel LP%d if ",i+1);
- }
- | POOL
- {
- i = lpop(&lpstk);
- printf(" dlabel LP%d rlabel LP%d goto",i+2,i);
- printf(" dlabel LP%d exitlp ",i+1);
- }
- | WHILE
- {
- lpush(&whstk,whmax);
- printf(" rlabel WH%d rlabel WH%d enter",
- whmax+2,whmax+1);
- printf(" dlabel WH%d ",whmax);
- whmax += 3;
- }
- bexpr
- {
- i = ltop(&whstk);
- printf(" rlabel WH%d if ",i+1);
- }
- | ELIHW
- {
- i = lpop(&whstk);
- printf(" dlabel WH%d",i+2);
- printf(" rlabel WH%d goto dlabel WH%d exitlp ",i,i+1);
- }
- | REPEAT
- {
- lpush(&repstk,repmax);
- printf(" rlabel REP%d rlabel REP%d enter",
- repmax+1,repmax+2);
- printf(" dlabel REP%d ",repmax);
- repmax += 3;
- }
- | UNTIL
- {
- i = ltop(&repstk);
- printf(" dlabel REP%d ",i+1);
- }
- bexpr
- {
- i = lpop(&repstk);
- printf(" not rlabel REP%d if",i);
- printf(" dlabel REP%d exitlp ",i+2);
- }
- ;
-
- let_xpr : ivar '=' rexpr
- { printf(" rtoi store %d pop ",T_INT); }
- | rvar '=' rexpr
- { printf(" store %d pop ",T_DBL); }
- | svar '=' sexpr
- { printf(" store %d spop ",T_CHR); }
- ;
-
- data_lst : rexpr
- { printf(" dsep "); }
- | sexpr
- { printf(" dsep "); }
- | data_lst ',' rexpr
- { printf(" dsep "); }
- | data_lst ',' sexpr
- { printf(" dsep "); }
- ;
-
- ind_lst : rexpr
- | ind_lst ',' rexpr
- ;
-
- for_step : /* empty */
- { printf(" icon 0 "); }
- | STEP rexpr
- ;
-
- if_else : /* empty */
- {
- i = lpop(&ifstk);
- printf(" dlabel IF%d dlabel IF%d ",i,i+1);
- }
- | ELSE { i=ltop(&ifstk); printf(" dlabel IF%d ",i); } stat
- { i=lpop(&ifstk); printf(" dlabel IF%d ",i+1); }
- ;
-
-
- pe : sexpr ','
- { printf(" scon \"\" , "); }
- | sexpr ';'
- | sexpr
- { printf(" scon \"\\n\" ; "); }
- | /* empty */
- { printf(" scon \"\\n\" "); }
- ;
-
-
- var_lst : ivar
- | rvar
- | svar
- | var_lst ',' var_lst
- ;
-
- sexpr : SCONST
- { printf(" scon \"%s\" ",$1); }
- | svar
- { printf(" val %d ",T_CHR); }
- | rexpr
- { printf(" rtoa "); }
- | svar '=' sexpr
- { printf(" store %d ",T_CHR); }
- | sexpr ';' sexpr
- { printf(" ; "); }
- | sexpr '+' sexpr
- { printf(" ; "); }
- | sexpr ',' sexpr
- { printf(" , "); }
- | '(' sexpr ')'
- ;
- sbe : sexpr EQUAL sexpr
- { printf(" s== "); }
- | sexpr NEQ sexpr
- { printf(" s<> "); }
- | sexpr LE sexpr
- { printf(" s<= "); }
- | sexpr LT sexpr
- { printf(" s< "); }
- | sexpr GE sexpr
- { printf(" s>= "); }
- | sexpr GT sexpr
- { printf(" s> "); }
- ;
-
- ivar : IWORD
- { printf(" var %d %s ",T_INT,$1); }
- | IWORD '(' {printf(" pushstate %d ",M_EXECUTE); } ind_lst ')'
- { printf(" popstate var %d %s ",T_INT+Q_ARY,$1); }
- ;
- rvar : RWORD
- { printf(" var %d %s ",T_DBL,$1); }
- | RWORD '(' { printf(" pushstate %d ",M_EXECUTE); } ind_lst ')'
- { printf(" popstate var %d %s ",T_DBL+Q_ARY,$1); }
- ;
-
- svar : SWORD
- { printf(" var %d %s ",T_CHR,$1); }
- | SWORD '(' { printf(" pushstate %d ",M_EXECUTE); } ind_lst ')'
- { printf(" popstate var %d %s ",T_CHR+Q_ARY,$1); }
- ;
-
-
-
- rexpr : rvar
- { printf(" val %d ",T_DBL); }
- | REAL
- { printf(" rcon %s ",$1); }
- | INTEGER
- { printf(" rcon %s ",$1); }
- | ivar
- { printf(" val %ditor ",T_INT); }
- | rvar '=' rexpr
- { printf(" store %d ",T_DBL); }
- | '(' rexpr ')'
- | rexpr '+' rexpr
- { printf(" r+ "); }
- | rexpr '-' rexpr
- { printf(" r- "); }
- | rexpr '*' rexpr
- { printf(" r* "); }
- | rexpr '/' rexpr
- { printf(" r/ "); }
- | '+' rexpr %prec UNARY
- | '-' rexpr %prec UNARY
- { printf(" rcon -1 r* "); }
- ;
-
- rbe : rexpr EQUAL rexpr
- { printf(" r== "); }
- | rexpr NEQ rexpr
- { printf(" r<> "); }
- | rexpr LE rexpr
- { printf(" r<= "); }
- | rexpr LT rexpr
- { printf(" r< "); }
- | rexpr GE rexpr
- { printf(" r>= "); }
- | rexpr GT rexpr
- { printf(" r> "); }
- ;
- bexpr : sbe
- | rbe
- | NOT bexpr %prec UNARY
- { printf(" not "); }
- | bexpr OR bexpr
- { printf(" or "); }
- | bexpr AND bexpr
- { printf(" and "); }
- | '(' bexpr ')'
- ;
- %%
-
- main()
- {
- rdlin(bsin);
- return(yyparse());
- }
-
- yyerror(s)
- char *s;
- {
- fprintf(stderr,"%s\n",s);
- }
-
- lpush(stack,val) struct stk *stack; int val;
- { stack->stack[stack->stkp++] = val; }
-
- int ltop(stack) struct stk *stack;
- { return(stack->stack[stack->stkp-1]); }
-
- int lpop(stack) struct stk *stack;
- { return(stack->stack[--stack->stkp]); }
-