home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume2 / basic / part3 / bs2 / bsgram.y.orig < prev    next >
Encoding:
Text File  |  1986-11-30  |  7.5 KB  |  391 lines

  1.     /* bsgram.y -- grammer specification for bs.
  2.      */
  3. %{
  4. #include "bsdefs.h"
  5.  
  6. char *p;        /* the generic pointer */
  7. int i;            /* the generic counter */
  8.  
  9. struct stk {
  10.     int stack[40];
  11.     int stkp;
  12. };
  13.  
  14. struct stk ifstk,whstk,forstk,repstk,lpstk;
  15. int gomax=0; int ifmax=0; int whmax=0; int formax=0; int repmax=0; int lpmax=0;
  16.  
  17. extern char *yytext;
  18. extern char *bsyysval;
  19. extern int yyleng;
  20. %}
  21.  
  22. %term EQUAL    NEQ    LE    LT    GE    WHILE
  23. %term GT    OR    AND    NOT    RET    REPEAT
  24. %term IF    THEN    ELSE    GOTO    GOSUB    UNTIL
  25. %term STOP    END    INTEGER    REAL    SCONST    ELIHW
  26. %term LET    SWORD    PRINT    INPUT    DATA    CFOR
  27. %term FOR    TO    STEP    READ    WRITE    NEXT
  28. %term DEFINE    LFUN    SFUN    FDEF    SYMBOL    DIM
  29. %term VALUE    IWORD    RWORD    ROFC    LOOP    EXITIF
  30. %term ITOR    RTOI    ITOA    RTOA    LEAVE    CONTINUE
  31. %term POOL
  32.  
  33. %left ',' ';'
  34. %right '='
  35. %nonassoc OR AND
  36. %nonassoc LE LT GE GT EQUAL NEQ
  37. %left '+' '-'
  38. %left '*' '/' '%'
  39. %left UNARY
  40. %left '('
  41.  
  42.  
  43. %start lines
  44.  
  45. %%
  46.  
  47. lines        : /* empty */
  48.         | lines line
  49.         ;
  50.  
  51. line        : lnum stat '\n'
  52.             { printf("\n"); }
  53.         | '\n'
  54.         ;
  55.  
  56. lnum        : INTEGER
  57.             { printf(" line %s ",$1); }
  58.         ;
  59.  
  60. stat        : LET let_xpr
  61.         | let_xpr
  62.         | PRINT pe
  63.             { printf(" print "); }
  64.         | GOTO INTEGER
  65.             { printf(" rlabel LN%s goto ",$2); }
  66.         | GOSUB INTEGER
  67.             { printf(" rlabel LN%s gosub ",$2); }
  68.         | LEAVE
  69.             { printf(" leave "); }
  70.         | CONTINUE
  71.             { printf(" contin "); }
  72.         | RET
  73.             { printf(" return "); }
  74.         | IF bexpr
  75.             {
  76.                 lpush(&ifstk,ifmax);
  77.                 printf(" rlabel IF%d if ",ifmax);
  78.                 ifmax += 2;
  79.             }
  80.           THEN stat
  81.             {
  82.                 i = ltop(&ifstk);
  83.                 printf(" rlabel IF%d goto ",i+1);
  84.             }
  85.           if_else
  86.         | INPUT { printf(" pushstate %d ",M_INPUT); } var_lst
  87.             { printf(" popstate "); }
  88.         | STOP
  89.             { printf(" stop "); }
  90.         | END
  91.             { printf(" end "); }
  92.         | FOR ivar '=' iexpr TO iexpr for_step
  93.             {
  94.                 lpush(&forstk,formax);
  95.                 printf(" rlabel FOR%d rlabel FOR%d enter",
  96.                     formax+2,formax+1);
  97.                 printf(" icon 0 rlabel FOR%d dlabel FOR%d for ",
  98.                     formax+1,formax);
  99.                 formax += 3;
  100.             }
  101.         | NEXT
  102.             {
  103.                 i = ltop(&forstk);
  104.                 printf(" dlabel FOR%d ",i+2);
  105.             }
  106.           ivar
  107.             {
  108.                 i = lpop(&forstk);
  109.                 printf(" next rlabel FOR%d goto dlabel FOR%d ",
  110.                     i,i+1);
  111.                 printf("exitlp ");
  112.             }
  113.         | READ { printf(" pushstate %d ",M_READ); } var_lst
  114.             { printf(" popstate "); }
  115.         | DATA { printf(" data "); } data_lst
  116.         | LOOP
  117.             {
  118.                 lpush(&lpstk,lpmax);
  119.                 printf(" rlabel LP%d rlabel LP%d enter",
  120.                     lpmax+2,lpmax+1);
  121.                 printf(" dlabel LP%d ",lpmax);
  122.                 lpmax += 3;
  123.             }
  124.         | EXITIF bexpr
  125.             {
  126.                 i = ltop(&lpstk);
  127.                 printf(" not rlabel LP%d if ",i+1);
  128.             }
  129.         | POOL
  130.             {
  131.                 i = lpop(&lpstk);
  132.                 printf(" dlabel LP%d rlabel LP%d goto",i+2,i);
  133.                 printf(" dlabel LP%d exitlp ",i+1);
  134.             }
  135.         | WHILE
  136.             {
  137.                 lpush(&whstk,whmax);
  138.                 printf(" rlabel WH%d rlabel WH%d enter",
  139.                     whmax+2,whmax+1);
  140.                 printf(" dlabel WH%d ",whmax);
  141.                 whmax += 3;
  142.             }
  143.           bexpr
  144.             {
  145.                 i = ltop(&whstk);
  146.                 printf(" rlabel WH%d if ",i+1);
  147.             }
  148.         | ELIHW
  149.             {
  150.                 i = lpop(&whstk);
  151.                 printf(" dlabel WH%d",i+2);
  152.                 printf(" rlabel WH%d goto dlabel WH%d exitlp ",i,i+1);
  153.             }
  154.         | REPEAT
  155.             {
  156.                 lpush(&repstk,repmax);
  157.                 printf(" rlabel REP%d rlabel REP%d enter",
  158.                     repmax+1,repmax+2);
  159.                 printf(" dlabel REP%d ",repmax);
  160.                 repmax += 3;
  161.             }
  162.         | UNTIL
  163.             {
  164.                 i = ltop(&repstk);
  165.                 printf(" dlabel REP%d ",i+1);
  166.             }
  167.           bexpr
  168.             {
  169.                 i = lpop(&repstk);
  170.                 printf(" not rlabel REP%d if",i);
  171.                 printf(" dlabel REP%d exitlp ",i+2);
  172.             }
  173.         ;
  174.  
  175. let_xpr        : ivar '=' iexpr
  176.             { printf(" store %d pop ",T_INT); }
  177.         | rvar '=' rexpr
  178.             { printf(" store %d pop ",T_DBL); }
  179.         | svar '=' sexpr
  180.             { printf(" store %d spop ",T_CHR); }
  181.         ;
  182.  
  183. data_lst    : iexpr
  184.             { printf(" dsep "); }
  185.         | rexpr
  186.             { printf(" dsep "); }
  187.         | sexpr
  188.             { printf(" dsep "); }
  189.         | data_lst ',' iexpr
  190.             { printf(" dsep "); }
  191.         | data_lst ',' rexpr
  192.             { printf(" dsep "); }
  193.         | data_lst ',' sexpr
  194.             { printf(" dsep "); }
  195.         ;
  196.  
  197. ind_lst        : iexpr
  198.         | ind_lst ',' iexpr
  199.         ;
  200.  
  201. for_step    : /* empty */
  202.             { printf(" icon 0 "); }
  203.         | STEP iexpr
  204.         ;
  205.  
  206. if_else        : /* empty */
  207.             {
  208.                 i = lpop(&ifstk);
  209.                 printf(" dlabel IF%d dlabel IF%d ",i,i+1);
  210.             }
  211.         | ELSE { i=ltop(&ifstk); printf(" dlabel IF%d ",i); } stat
  212.             { i=lpop(&ifstk); printf(" dlabel IF%d ",i+1); }
  213.         ;
  214.  
  215.  
  216. pe        : sexpr ','
  217.             { printf(" scon \"\" , "); }
  218.         | sexpr ';'
  219.         | sexpr
  220.             { printf(" scon \"\\n\" ; "); }
  221.         | /* empty */
  222.             { printf(" scon \"\\n\" "); }
  223.         ;
  224.  
  225.  
  226. var_lst        : ivar
  227.         | rvar
  228.         | svar
  229.         | var_lst ',' var_lst
  230.         ;
  231.  
  232. sexpr        : SCONST
  233.             { printf(" scon \"%s\" ",$1); }
  234.         | svar
  235.             { printf(" val %d ",T_CHR); }
  236.         | iexpr
  237.             { printf(" itoa "); }
  238.         | rexpr
  239.             { printf(" rtoa "); }
  240.         | svar '=' sexpr
  241.             { printf(" store %d ",T_CHR); }
  242.         | sexpr ';' sexpr
  243.             { printf(" ; "); }
  244.         | sexpr '+' sexpr
  245.             { printf(" ; "); }
  246.         | sexpr ',' sexpr
  247.             { printf(" , "); }
  248.         | '(' sexpr ')'
  249.         ;
  250. sbe        : sexpr EQUAL sexpr
  251.             { printf(" s== "); }
  252.         | sexpr NEQ sexpr
  253.             { printf(" s<> "); }
  254.         | sexpr LE sexpr
  255.             { printf(" s<= "); }
  256.         | sexpr LT sexpr
  257.             { printf(" s< "); }
  258.         | sexpr GE sexpr
  259.             { printf(" s>= "); }
  260.         | sexpr GT sexpr
  261.             { printf(" s> "); }
  262.         ;
  263.  
  264. ivar        : IWORD
  265.             { printf(" var %d %s ",T_INT,$1); }
  266.         | IWORD '(' {printf(" pushstate %d ",M_EXECUTE); } ind_lst ')'
  267.             { printf(" popstate var %d %s ",T_INT+Q_ARY,$1); }
  268.         ;
  269. rvar        : RWORD
  270.             { printf(" var %d %s ",T_DBL,$1); }
  271.         | RWORD '(' { printf(" pushstate %d ",M_EXECUTE); } ind_lst ')'
  272.             { printf(" popstate var %d %s ",T_DBL+Q_ARY,$1); }
  273.         ;
  274.  
  275. svar        : SWORD
  276.             { printf(" var %d %s ",T_CHR,$1); }
  277.         | SWORD '(' { printf(" pushstate %d ",M_EXECUTE); } ind_lst ')'
  278.             { printf(" popstate var %d %s ",T_CHR+Q_ARY,$1); }
  279.         ;
  280.  
  281. iexpr        : ivar
  282.             { printf(" val %d ",T_INT); }
  283.         | INTEGER
  284.             { printf(" icon %s ",$1); }
  285.         | REAL
  286.             { printf(" rcon %s rtoi ",$1); }
  287.         | ivar '=' iexpr
  288.             { printf(" store %d ",T_INT); }
  289.         | RTOI '(' rexpr ')'
  290.             { printf(" rtoi "); }
  291.         | '(' iexpr ')'
  292.         | iexpr '+' iexpr
  293.             { printf(" i+ "); }
  294.         | iexpr '-' iexpr
  295.             { printf(" i- "); }
  296.         | iexpr '*' iexpr
  297.             { printf(" i* "); }
  298.         | iexpr '/' iexpr
  299.             { printf(" i/ "); }
  300.         | iexpr '%' iexpr
  301.             { printf(" i%% "); }
  302.         | '+' iexpr    %prec UNARY
  303.         | '-' iexpr    %prec UNARY
  304.             { printf(" icon -1 i* "); }
  305.         ;
  306.  
  307. ibe        : iexpr EQUAL iexpr
  308.             { printf(" i== "); }
  309.         | iexpr NEQ iexpr
  310.             { printf(" i<> "); }
  311.         | iexpr LE iexpr
  312.             { printf(" i<= "); }
  313.         | iexpr LT iexpr
  314.             { printf(" i< "); }
  315.         | iexpr GE iexpr
  316.             { printf(" i>= "); }
  317.         | iexpr GT iexpr
  318.             { printf(" i> "); }
  319.         ;
  320.  
  321. rexpr        : rvar
  322.             { printf(" val %d ",T_DBL); }
  323.         | REAL
  324.             { printf(" rcon %s ",$1); }
  325.         | INTEGER
  326.             { printf(" rcon %s ",$1); }
  327.         | rvar '=' rexpr
  328.             { printf(" store %d ",T_DBL); }
  329.         | ITOR '(' iexpr ')'
  330.             { printf(" itor "); }
  331.         | '(' rexpr ')'
  332.         | rexpr '+' rexpr
  333.             { printf(" r+ "); }
  334.         | rexpr '-' rexpr
  335.             { printf(" r- "); }
  336.         | rexpr '*' rexpr
  337.             { printf(" r* "); }
  338.         | rexpr '/' rexpr
  339.             { printf(" r/ "); }
  340.         | '+' rexpr    %prec UNARY
  341.         | '-' rexpr    %prec UNARY
  342.             { printf(" rcon -1 r* "); }
  343.         ;
  344.  
  345. rbe        : rexpr EQUAL rexpr
  346.             { printf(" r== "); }
  347.         | rexpr NEQ rexpr
  348.             { printf(" r<> "); }
  349.         | rexpr LE rexpr
  350.             { printf(" r<= "); }
  351.         | rexpr LT rexpr
  352.             { printf(" r< "); }
  353.         | rexpr GE rexpr
  354.             { printf(" r>= "); }
  355.         | rexpr GT rexpr
  356.             { printf(" r> "); }
  357.         ;
  358. bexpr        : sbe
  359.         | ibe
  360.         | rbe
  361.         | NOT bexpr    %prec UNARY
  362.             { printf(" not "); }
  363.         | bexpr OR bexpr
  364.             { printf(" or "); }
  365.         | bexpr AND bexpr
  366.             { printf(" and "); }
  367.         | '(' bexpr ')'
  368.         ;
  369. %%
  370.  
  371. main()
  372. {
  373.     rdlin(bsin);
  374.     return(yyparse());
  375. }
  376.  
  377. yyerror(s)
  378. char *s;
  379. {
  380.     fprintf(stderr,"%s\n",s);
  381. }
  382.  
  383. lpush(stack,val) struct stk *stack; int val;
  384. { stack->stack[stack->stkp++] = val; }
  385.  
  386. int ltop(stack) struct stk *stack;
  387. { return(stack->stack[stack->stkp-1]); }
  388.  
  389. int lpop(stack) struct stk *stack;
  390. { return(stack->stack[--stack->stkp]); }
  391.