|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.