codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
#include <stdio.h> #include <stdlib.h> #include <setjmp.h> int nextc; #define peek(c) (nextc == c) #define match(c) (peek(c) ? (nextc = getchar()) : 0) jmp_buf env; void error(void) { printf("syntax error.\n"); while (!peek('\n')) nextc = getchar(); longjmp(env, 1); } double exp0(void); double exp1(double); double term0(void); double term1(double); double factor(void); int main() { setjmp(env); nextc = getchar(); printf("%.0f\n", exp0()); return 0; } double exp0(void) { /* E -> TA */ double v = term0(); return exp1(v); } double exp1(double v) { if(match('+')) { /* A -> +TA */ v += term0(); return exp1(v); } else if(match('-')) { /* A -> -TA */ v -= term0(); return exp1(v); } else return v; /* A -> epsilon */ } double term0(void) { /* T -> FB */ double v = factor(); return term1(v); } double term1(double v) { if(match('*')) { /* B -> *FB */ v *= factor(); return term1(v); } else if(match('/')) { /* B -> /FB */ v /= factor(); return term1(v); } else /* B -> epsilon */ return v; } #define N 1024 double factor(void) { /* F -> 0...9 */ static char buf[N]; static char numtab[] = "0123456789.", *p; int flag, i; i = 0; while (1) { flag = 0; for (p = numtab; *p != '\0'; p++) { if (match(*p)) { flag = 1; break; } } if (flag == 1) { buf[i++] = (char)*p; continue; } else { if (i == 0) break; else buf[i] = '\0'; return atof(buf); } } if(match('(')) { /* F -> (E) */ double v = exp0(); if(match(')')) return v; else error(); } else { error(); } } /* end */
Private
[
?
]
Run code
Submit