登 录
//一个简单的自顶向下语法分析 #include <cassert> #include <cstdio> using namespace std; char str[1024]; long curpos; int num() { int ret; if (str[curpos] >= '0' && str[curpos] <= '9') { ret = str[curpos] - '0'; ++curpos; return ret; } printf("ERROR!not a num.pos=%d/r/n", curpos); assert(0); return 0; } void match(int c) { if (str[curpos] == c) { ++curpos; return; } printf("ERROR!not =%c/r/n", c); assert(0); } int A(); int C() { int ret; if (str[curpos] == '(') { match('('); ret = A(); match(')'); } else { ret = num(); } return ret; } int B(); void B2(int& token, int& num) { if (str[curpos] == '*') { match('*'); token = '*'; num = B(); } else { token = 0; } } int B() { int ret = C(); int token, num; B2(token, num); if (token == '*') { return ret * num; } else if (token == '/') { return ret / num; } else { return ret; } } void A2(int& token, int& num) { if (str[curpos] == '+') { match('+'); token = '+'; num = A(); } else if (str[curpos] == '-') { match('-'); token = '-'; num = A(); } } int A() { int token, num; int ret = B(); A2(token, num); if (token == '+') { return ret + num; } else if (token == '-') { return ret - num; } else { return ret; } } int main() { printf("请输入表达式:/r/n"); for (; { scanf("%s", &str); curpos = 0; printf("结果为:%d/r/n", A()); match(0); printf("Corrent!/r/n"); } return 0; }
抱歉!评论已关闭.