home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / m4 / m4y.y < prev    next >
Encoding:
Lex Description  |  1979-01-10  |  1.6 KB  |  95 lines

  1. %{
  2. extern long    evalval;
  3. #define    YYSTYPE    long
  4. %}
  5.  
  6. %term DIGITS
  7. %left '|'
  8. %left '&'
  9. %right '!'
  10. %nonassoc GT GE LT LE NE EQ
  11. %left '+' '-'
  12. %left '*' '/' '%'
  13. %right POWER
  14. %right UMINUS
  15. %%
  16.  
  17. s    : e    ={ evalval = $1; }
  18.     |    ={ evalval = 0; }
  19.     ;
  20.  
  21. e    : e '|' e    ={ $$ = ($1!=0 || $3!=0) ? 1 : 0; }
  22.     | e '&' e    ={ $$ = ($1!=0 && $3!=0) ? 1 : 0; }
  23.     | '!' e        ={ $$ = $2 == 0; }
  24.     | e EQ e    ={ $$ = $1 == $3; }
  25.     | e NE e    ={ $$ = $1 != $3; }
  26.     | e GT e    ={ $$ = $1 > $3; }
  27.     | e GE e    ={ $$ = $1 >= $3; }
  28.     | e LT e    ={ $$ = $1 < $3; }
  29.     | e LE e    ={ $$ = $1 <= $3; }
  30.     | e '+' e    ={ $$ = ($1+$3); }
  31.     | e '-' e    ={ $$ = ($1-$3); }
  32.     | e '*' e    ={ $$ = ($1*$3); }
  33.     | e '/' e    ={ $$ = ($1/$3); }
  34.     | e '%' e    ={ $$ = ($1%$3); }
  35.     | '(' e ')'    ={ $$ = ($2); }
  36.     | e POWER e    ={ for ($$=1; $3-->0; $$ *= $1); }    
  37.     | '-' e %prec UMINUS    ={ $$ = $2-1; $$ = -$2; }
  38.     | '+' e %prec UMINUS    ={ $$ = $2-1; $$ = $2; }
  39.     | DIGITS    ={ $$ = evalval; }
  40.     ;
  41.  
  42. %%
  43.  
  44. yylex() {
  45.     extern char *pe;
  46.  
  47.     while (*pe==' ' || *pe=='\t' || *pe=='\n')
  48.         pe++;
  49.     switch(*pe) {
  50.     case '\0':
  51.     case '+':
  52.     case '-':
  53.     case '/':
  54.     case '%':
  55.     case '(':
  56.     case ')':
  57.         return(*pe++);
  58.     case '^':
  59.         pe++;
  60.         return(POWER);
  61.     case '*':
  62.         return(peek('*', POWER, '*'));
  63.     case '>':
  64.         return(peek('=', GE, GT));
  65.     case '<':
  66.         return(peek('=', LE, LT));
  67.     case '=':
  68.         return(peek('=', EQ, EQ));
  69.     case '|':
  70.         return(peek('|', '|', '|'));
  71.     case '&':
  72.         return(peek('&', '&', '&'));
  73.     case '!':
  74.         return(peek('=', NE, '!'));
  75.     default:
  76.         evalval = 0;
  77.         while (*pe >= '0' && *pe <= '9')
  78.             evalval = evalval*10 + *pe++ - '0';
  79.         return(DIGITS);
  80.     }
  81. }
  82.  
  83. peek(c, r1, r2)
  84. {
  85.     if (*++pe != c)
  86.         return(r2);
  87.     ++pe;
  88.     return(r1);
  89. }
  90.  
  91. yyerror(s)
  92. char *s;
  93. {
  94. }
  95.