📄 analyser.cpp
字号:
/************************************************************************ Copyright IBMTC Written by Xinxi Wang**************************************************************************/#include <iostream>#include "Analyser.h"#include "Terminal.h"#include "Variable.h"#include "Epsilon.h"using namespace std;Analyser::Analyser(AnalyzeTable &table, Syntax *s) : analyzeTable(table), syntax(s){ Token *p = new Terminal("$"); pool.push_back(p); tokenStack.push(p); //加入起始变元 p = s->getStartVariable().clone(); pool.push_back(p); tokenStack.push(p);}/** * @brief 分析 */void Analyser::analyze ( ){ Lexer * lexer = Lexer::getInstance(); while(!tokenStack.empty()) { switch(tokenStack.top()->getType()) { case TERMINAL: if(lexer->nextToken() == *tokenStack.top()) {#ifdef DEBUG cout << "匹配终结符: "; tokenStack.top()->print(); cout << endl;#endif if(*tokenStack.top() == Terminal("$")) cout << "分析成功" << endl; tokenStack.pop(); } else error("栈顶终结符与缓冲区不匹配"); break; case VARIABLE: { Index idx(dynamic_cast<Variable &>(*tokenStack.top()), lexer->current()); Pattern pattern; try{ pattern = analyzeTable.getProduction(idx).getRhs(); }catch (ProductionNotExists & e){ error("无匹配的产生式"); }#ifdef DEBUG tokenStack.top()->print(); cout << " 生成 "; pattern.print(); cout << endl;#endif tokenStack.pop(); for(int i = pattern.length() - 1; i >= 0; i--){ Token *p = pattern.at(i)->clone(); pool.push_back(p); tokenStack.push(p); } break; } case EPSILON: tokenStack.pop(); break; } }}/** * @brief 错误信息输出 * @param msg */void Analyser::error (string msg ){ cerr.width(5); cerr << Lexer::getInstance()->line() << ": " << Lexer::getInstance()->getBuffer() << endl << string(Lexer::getInstance()->column() + 7, ' ') << '^' << endl << string(Lexer::getInstance()->column() + 7, ' ') << msg << endl; exit(1);}Analyser::~Analyser(){ for(int i = 0; i < pool.size(); i++){ delete pool[i]; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -