} } else if (sourceCode[i] >= '0'&& sourceCode[i] <= '9') { } else { } if (number != NULL) { } switch (sourceCode[i]) { case '+': } source.push_back(add); break; source.push_back(sub); break; source.push_back(mul); break; source.push_back(div); break; source.push_back(pow); break; source.push_back(lef); break; source.push_back(rig); break; std::cout << \ << sourceCode[i] << std::endl; return false; break; source.push_back(ide); identifier.push_back(number); number = 0; number = number * 10 + sourceCode[i] - 48; case '-': case '*': case '/': case '^': case '(': case ')': default: source.push_back(sha); return true; 第6页 共15页
} void Lexical::printSource() { } char Lexical::toChar(int a) { } void Lexical::setSourceCode(std::string source) { } sourceCode = source; switch (a) { case add: } return 0; return '+'; return '-'; return '*'; return '/'; return '^'; return 'i'; return '('; return ')'; return '#'; break; case sub: case mul: case div: case pow: case ide: case lef: case rig: case sha: default: for (int i = 0; i < source.size(); i++) { } std::cout << \; std::cout << toChar(source[i]); Syntax.h
第7页 共15页
#pragma once #include \namespace ccyg { std::vector
class Syntax : public ccyg::Lexical { public: enum Relation //定义优先关系枚举 { }; enum Symbol { }; Syntax(std::string = 0); ~Syntax(); bool reduced();//定义归约方法 void movein();//定义移进方法 int findOperator();//查找最近运算符 char toChar(int); bool nextStep(); void initNext(); void printSymbol(); void printSemantic(); bool getSuccess(); E = 9, T = 10, F = 11, P = 12 equal = 0, less = 1, greater = 2, //错误 i_i = 3, i_left = 4, left_sharp = 5, right_i = 6, right_left = 7, sharp_right = 8 } }; Syntax.cpp #include \#include
2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 4, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 5, 2, 2, 2, 2, 2, 6, 7, 2, 2, 1, 1, 1, 1, 1, 1, 1, 8, 0 }; long long poow(int a,int b) if (b == 1) { } else { } return poow(a,b-1) * a; return a; isSuccess = false; isInitNext = false; semStack.push_back(identifier[0]); std::vector
if (symbolStack[symbolStack.size() - 1] == ide) { } else { switch (symbolStack[symbolStack.size() - 2]) { case add: { } case sub: { symbolStack[symbolStack.size() - 3] = E; symbolStack.pop_back(); symbolStack.pop_back(); semStack[semStack.size() - 3] = semStack[semStack.size() - 3] semStack.pop_back(); semStack.pop_back(); break; symbolStack[symbolStack.size() - 3] = E; symbolStack.pop_back(); symbolStack.pop_back(); semStack[semStack.size() - 3] = semStack[semStack.size() - 3] semStack.pop_back(); semStack.pop_back(); break; symbolStack[symbolStack.size() - 1] = P; + semStack[semStack.size() - 1]; - semStack[semStack.size() - 1];