Run Time: 0.000
Ranking (as of 2016-09-15): 304 out of 680
Language: C++
A simple implementation of recursive descent parser.
/* UVa 622 - Grammar Evaluation To build using Visual Studio 2012: cl -EHsc -O2 UVa_622_Grammar_Evaluation.cpp */ /* < expression > := < component > | < component > + < expression > < component > := < factor > | < factor > * < component > < factor > := < positiveinteger > | (< expression >) */ #include <cstdio> #include <cstring> #include <cctype> const int nr_chars_max = 255; char s[nr_chars_max + 1], *ps; int positive_integer() { if (isdigit(*ps)) { int n = 0; do n = n * 10 + *ps++ - '0'; while (isdigit(*ps)); return n; } else return -1; } int expression(); int component(); int factor(); int factor() { int n = positive_integer(); if (n != -1) return n; else if (*ps == '(') { ps++; n = expression(); if (*ps == ')') ps++; else throw -1; return n; } else { throw -1; return -1; } } int component() { int n = factor(); if (*ps == '*') { ps++; n *= component(); } return n; } int expression() { int n = component(); if (*ps == '+') { ps++; n += expression(); } return n; } int main() { int n; scanf("%d", &n); while (n--) { scanf("%s", ps = s); try { int n = expression(); if (*ps) throw -1; printf("%d\n", n); } catch (int e) { puts("ERROR"); } } return 0; }
No comments:
Post a Comment