home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume2 / basic / part3 / bs2 / bsgram.y < prev    next >
Encoding:
Text File  |  1986-11-30  |  6.6 KB  |  348 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 
  87.             { printf(" pushstate %d ",M_INPUT); }
  88.           var_lst
  89.             { printf(" popstate "); }
  90.         | STOP
  91.             { printf(" stop "); }
  92.         | END
  93.             { printf(" end "); }
  94.         | FOR ivar '=' rexpr TO rexpr for_step
  95.             {
  96.                 lpush(&forstk,formax);
  97.                 printf(" rlabel FOR%d rlabel FOR%d enter",
  98.                     formax+2,formax+1);
  99.                 printf(" icon 0 rlabel FOR%d dlabel FOR%d for ",
  100.                     formax+1,formax);
  101.                 formax += 3;
  102.             }
  103.         | NEXT
  104.             {
  105.                 i = ltop(&forstk);
  106.                 printf(" dlabel FOR%d ",i+2);
  107.             }
  108.           ivar
  109.             {
  110.                 i = lpop(&forstk);
  111.                 printf(" next rlabel FOR%d goto dlabel FOR%d ",
  112.                     i,i+1);
  113.                 printf("exitlp ");
  114.             }
  115.         | READ { printf(" pushstate %d ",M_READ); } var_lst
  116.             { printf(" popstate "); }
  117.         | DATA { printf(" data "); } data_lst
  118.         | LOOP
  119.             {
  120.                 lpush(&lpstk,lpmax);
  121.                 printf(" rlabel LP%d rlabel LP%d enter",
  122.                     lpmax+2,lpmax+1);
  123.                 printf(" dlabel LP%d ",lpmax);
  124.                 lpmax += 3;
  125.             }
  126.         | EXITIF bexpr
  127.             {
  128.                 i = ltop(&lpstk);
  129.                 printf(" not rlabel LP%d if ",i+1);
  130.             }
  131.         | POOL
  132.             {
  133.                 i = lpop(&lpstk);
  134.                 printf(" dlabel LP%d rlabel LP%d goto",i+2,i);
  135.                 printf(" dlabel LP%d exitlp ",i+1);
  136.             }
  137.         | WHILE
  138.             {
  139.                 lpush(&whstk,whmax);
  140.                 printf(" rlabel WH%d rlabel WH%d enter",
  141.                     whmax+2,whmax+1);
  142.                 printf(" dlabel WH%d ",whmax);
  143.                 whmax += 3;
  144.             }
  145.           bexpr
  146.             {
  147.                 i = ltop(&whstk);
  148.                 printf(" rlabel WH%d if ",i+1);
  149.             }
  150.         | ELIHW
  151.             {
  152.                 i = lpop(&whstk);
  153.                 printf(" dlabel WH%d",i+2);
  154.                 printf(" rlabel WH%d goto dlabel WH%d exitlp ",i,i+1);
  155.             }
  156.         | REPEAT
  157.             {
  158.                 lpush(&repstk,repmax);
  159.                 printf(" rlabel REP%d rlabel REP%d enter",
  160.                     repmax+1,repmax+2);
  161.                 printf(" dlabel REP%d ",repmax);
  162.                 repmax += 3;
  163.             }
  164.         | UNTIL
  165.             {
  166.                 i = ltop(&repstk);
  167.                 printf(" dlabel REP%d ",i+1);
  168.             }
  169.           bexpr
  170.             {
  171.                 i = lpop(&repstk);
  172.                 printf(" not rlabel REP%d if",i);
  173.                 printf(" dlabel REP%d exitlp ",i+2);
  174.             }
  175.         ;
  176.  
  177. let_xpr        : ivar '=' rexpr
  178.             { printf(" rtoi store %d pop ",T_INT); }
  179.         | rvar '=' rexpr
  180.             { printf(" store %d pop ",T_DBL); }
  181.         | svar '=' sexpr
  182.             { printf(" store %d spop ",T_CHR); }
  183.         ;
  184.  
  185. data_lst    : rexpr
  186.             { printf(" dsep "); }
  187.         | sexpr
  188.             { printf(" dsep "); }
  189.         | data_lst ',' rexpr
  190.             { printf(" dsep "); }
  191.         | data_lst ',' sexpr
  192.             { printf(" dsep "); }
  193.         ;
  194.  
  195. ind_lst        : rexpr
  196.         | ind_lst ',' rexpr
  197.         ;
  198.  
  199. for_step    : /* empty */
  200.             { printf(" icon 0 "); }
  201.         | STEP rexpr
  202.         ;
  203.  
  204. if_else        : /* empty */
  205.             {
  206.                 i = lpop(&ifstk);
  207.                 printf(" dlabel IF%d dlabel IF%d ",i,i+1);
  208.             }
  209.         | ELSE { i=ltop(&ifstk); printf(" dlabel IF%d ",i); } stat
  210.             { i=lpop(&ifstk); printf(" dlabel IF%d ",i+1); }
  211.         ;
  212.  
  213.  
  214. pe        : sexpr ','
  215.             { printf(" scon \"\" , "); }
  216.         | sexpr ';'
  217.         | sexpr
  218.             { printf(" scon \"\\n\" ; "); }
  219.         | /* empty */
  220.             { printf(" scon \"\\n\" "); }
  221.         ;
  222.  
  223.  
  224. var_lst        : ivar
  225.         | rvar
  226.         | svar
  227.         | var_lst ',' var_lst
  228.         ;
  229.  
  230. sexpr        : SCONST
  231.             { printf(" scon \"%s\" ",$1); }
  232.         | svar
  233.             { printf(" val %d ",T_CHR); }
  234.         | rexpr
  235.             { printf(" rtoa "); }
  236.         | svar '=' sexpr
  237.             { printf(" store %d ",T_CHR); }
  238.         | sexpr ';' sexpr
  239.             { printf(" ; "); }
  240.         | sexpr '+' sexpr
  241.             { printf(" ; "); }
  242.         | sexpr ',' sexpr
  243.             { printf(" , "); }
  244.         | '(' sexpr ')'
  245.         ;
  246. sbe        : sexpr EQUAL sexpr
  247.             { printf(" s== "); }
  248.         | sexpr NEQ sexpr
  249.             { printf(" s<> "); }
  250.         | sexpr LE sexpr
  251.             { printf(" s<= "); }
  252.         | sexpr LT sexpr
  253.             { printf(" s< "); }
  254.         | sexpr GE sexpr
  255.             { printf(" s>= "); }
  256.         | sexpr GT sexpr
  257.             { printf(" s> "); }
  258.         ;
  259.  
  260. ivar        : IWORD
  261.             { printf(" var %d %s ",T_INT,$1); }
  262.         | IWORD '(' {printf(" pushstate %d ",M_EXECUTE); } ind_lst ')'
  263.             { printf(" popstate var %d %s ",T_INT+Q_ARY,$1); }
  264.         ;
  265. rvar        : RWORD
  266.             { printf(" var %d %s ",T_DBL,$1); }
  267.         | RWORD '(' { printf(" pushstate %d ",M_EXECUTE); } ind_lst ')'
  268.             { printf(" popstate var %d %s ",T_DBL+Q_ARY,$1); }
  269.         ;
  270.  
  271. svar        : SWORD
  272.             { printf(" var %d %s ",T_CHR,$1); }
  273.         | SWORD '(' { printf(" pushstate %d ",M_EXECUTE); } ind_lst ')'
  274.             { printf(" popstate var %d %s ",T_CHR+Q_ARY,$1); }
  275.         ;
  276.  
  277.  
  278.  
  279. rexpr        : rvar
  280.             { printf(" val %d ",T_DBL); }
  281.         | REAL
  282.             { printf(" rcon %s ",$1); }
  283.         | INTEGER
  284.             { printf(" rcon %s ",$1); }
  285.         | ivar
  286.             { printf(" val %ditor ",T_INT); }
  287.         | rvar '=' rexpr
  288.             { printf(" store %d ",T_DBL); }
  289.         | '(' rexpr ')'
  290.         | rexpr '+' rexpr
  291.             { printf(" r+ "); }
  292.         | rexpr '-' rexpr
  293.             { printf(" r- "); }
  294.         | rexpr '*' rexpr
  295.             { printf(" r* "); }
  296.         | rexpr '/' rexpr
  297.             { printf(" r/ "); }
  298.         | '+' rexpr    %prec UNARY
  299.         | '-' rexpr    %prec UNARY
  300.             { printf(" rcon -1 r* "); }
  301.         ;
  302.  
  303. rbe        : rexpr EQUAL rexpr
  304.             { printf(" r== "); }
  305.         | rexpr NEQ rexpr
  306.             { printf(" r<> "); }
  307.         | rexpr LE rexpr
  308.             { printf(" r<= "); }
  309.         | rexpr LT rexpr
  310.             { printf(" r< "); }
  311.         | rexpr GE rexpr
  312.             { printf(" r>= "); }
  313.         | rexpr GT rexpr
  314.             { printf(" r> "); }
  315.         ;
  316. bexpr        : sbe
  317.         | rbe
  318.         | NOT bexpr    %prec UNARY
  319.             { printf(" not "); }
  320.         | bexpr OR bexpr
  321.             { printf(" or "); }
  322.         | bexpr AND bexpr
  323.             { printf(" and "); }
  324.         | '(' bexpr ')'
  325.         ;
  326. %%
  327.  
  328. main()
  329. {
  330.     rdlin(bsin);
  331.     return(yyparse());
  332. }
  333.  
  334. yyerror(s)
  335. char *s;
  336. {
  337.     fprintf(stderr,"%s\n",s);
  338. }
  339.  
  340. lpush(stack,val) struct stk *stack; int val;
  341. { stack->stack[stack->stkp++] = val; }
  342.  
  343. int ltop(stack) struct stk *stack;
  344. { return(stack->stack[stack->stkp-1]); }
  345.  
  346. int lpop(stack) struct stk *stack;
  347. { return(stack->stack[--stack->stkp]); }
  348.