|
|
1.1 ! root 1: %{ ! 2: extern long evalval; ! 3: #define YYSTYPE long ! 4: %} ! 5: ! 6: %term DIGITS ! 7: %left OROR ! 8: %left ANDAND ! 9: %left '|' '^' ! 10: %left '&' ! 11: %right '!' '~' ! 12: %nonassoc GT GE LT LE NE EQ ! 13: %left '+' '-' ! 14: %left '*' '/' '%' ! 15: %right POWER ! 16: %right UMINUS ! 17: %% ! 18: ! 19: s : e ={ evalval = $1; } ! 20: | ={ evalval = 0; } ! 21: ; ! 22: ! 23: e : e OROR e ={ $$ = ($1!=0 || $3!=0) ? 1 : 0; } ! 24: | e ANDAND e ={ $$ = ($1!=0 && $3!=0) ? 1 : 0; } ! 25: | '!' e ={ $$ = $2 == 0; } ! 26: | '~' e ={ $$ = ~$2; } ! 27: | e EQ e ={ $$ = $1 == $3; } ! 28: | e NE e ={ $$ = $1 != $3; } ! 29: | e GT e ={ $$ = $1 > $3; } ! 30: | e GE e ={ $$ = $1 >= $3; } ! 31: | e LT e ={ $$ = $1 < $3; } ! 32: | e LE e ={ $$ = $1 <= $3; } ! 33: | e '|' e ={ $$ = ($1|$3); } ! 34: | e '&' e ={ $$ = ($1&$3); } ! 35: | e '^' e ={ $$ = ($1^$3); } ! 36: | e '+' e ={ $$ = ($1+$3); } ! 37: | e '-' e ={ $$ = ($1-$3); } ! 38: | e '*' e ={ $$ = ($1*$3); } ! 39: | e '/' e ={ $$ = ($1/$3); } ! 40: | e '%' e ={ $$ = ($1%$3); } ! 41: | '(' e ')' ={ $$ = ($2); } ! 42: | e POWER e ={ for ($$=1; $3-->0; $$ *= $1); } ! 43: | '-' e %prec UMINUS ={ $$ = $2-1; $$ = -$2; } ! 44: | '+' e %prec UMINUS ={ $$ = $2-1; $$ = $2; } ! 45: | DIGITS ={ $$ = evalval; } ! 46: ; ! 47: ! 48: %% ! 49: ! 50: extern char *pe; ! 51: ! 52: yylex() { ! 53: ! 54: while (*pe==' ' || *pe=='\t' || *pe=='\n') ! 55: pe++; ! 56: switch(*pe) { ! 57: case '\0': ! 58: case '+': ! 59: case '-': ! 60: case '/': ! 61: case '%': ! 62: case '^': ! 63: case '~': ! 64: case '(': ! 65: case ')': ! 66: return(*pe++); ! 67: case '*': ! 68: return(peek('*', POWER, '*')); ! 69: case '>': ! 70: return(peek('=', GE, GT)); ! 71: case '<': ! 72: return(peek('=', LE, LT)); ! 73: case '=': ! 74: return(peek('=', EQ, EQ)); ! 75: case '|': ! 76: return(peek('|', OROR, '|')); ! 77: case '&': ! 78: return(peek('&', ANDAND, '&')); ! 79: case '!': ! 80: return(peek('=', NE, '!')); ! 81: default: { ! 82: register base; ! 83: ! 84: evalval = 0; ! 85: ! 86: if (*pe == '0') { ! 87: if (*++pe=='x' || *pe=='X') { ! 88: base = 16; ! 89: ++pe; ! 90: } else ! 91: base = 8; ! 92: } else ! 93: base = 10; ! 94: ! 95: for (;;) { ! 96: register c, dig; ! 97: ! 98: c = *pe; ! 99: ! 100: if (c>='0' && c<='9') ! 101: dig = c - '0'; ! 102: else if (c>='a' && c<='f') ! 103: dig = c - 'a' + 10; ! 104: else if (c>='A' && c<='F') ! 105: dig = c - 'A' + 10; ! 106: else ! 107: break; ! 108: ! 109: evalval = evalval*base + dig; ! 110: ++pe; ! 111: } ! 112: ! 113: return(DIGITS); ! 114: } ! 115: } ! 116: } ! 117: ! 118: peek(c, r1, r2) ! 119: { ! 120: if (*++pe != c) ! 121: return(r2); ! 122: ++pe; ! 123: return(r1); ! 124: } ! 125: ! 126: yyerror() {;}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.