⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 analyser.cpp

📁 LL1通用语法分析器
💻 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 + -