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

📄 syntax.cpp~

📁 LL1通用语法分析器
💻 CPP~
📖 第 1 页 / 共 2 页
字号:
                Pattern p = it->second;        vector<Token *> tokens = p.getTokens();                for (vector<Token *>::iterator i = tokens.begin(); i != tokens.end(); i++) {            (*i)->print();            cout << " ";        }    }    cout << endl;}void Syntax::caculateFirstSet(){    vector<Variable> vars = getVariables();    int varNum = vars.size();        TokenSetMap  firstSets;    vector<vector<Pattern> > patterns;    for(int i = 0; i < varNum; i++)        patterns.push_back(getPatterns(vars[i]));    bool increase = true;    while(increase){        for(int i = 0; i < varNum; i++){            TokenSet &setI = firstSets[vars[i]];            int oldSize = setI.size();                        for(int j = 0; j < patterns[i].size(); j++){                bool cont = true;                for(int k = 0; k < patterns[i][j].length() && cont; k++){                    Token *p = patterns[i][j].at(k);                                        switch(p->getType()){                        case TERMINAL:                        case EPSILON:                            setI.insert(p);                            cont = false;                            break;                                                    case VARIABLE:                            TokenSet newSet;                            Variable v = *dynamic_cast<Variable *>(p);                            set_union(setI.begin(), setI.end(), firstSets[v].begin(), firstSets[v].end(),                                      insert_iterator<TokenSet>(newSet, newSet.begin()), TokenCompare());                                                        Epsilon e;                            if(firstSets[v].count(&e) != 0){                                //产生式右部不全是变元,且原来的first集合没有epsilon, 则epsilon不在新的FIRST集合中。                                if(setI.count(&e) == 0 && k != patterns[i][j].length() - 1){                                    setI = newSet;                                    setI.erase(&e);                                } else { //新的FIRST集合中含有epsilon                                    setI = newSet;                                }                            } else {                                setI = newSet;                                cont = false; //不会遇到产生epsilon的变元。                            }                            break;                    }                }            }            //如果迭代集合发生变化            increase = (setI.size() > oldSize);        }    }        FIRSTSet = TokenSets(varNum);    for(int i = 0; i < varNum; i++){        TokenSet &setI = firstSets[vars[i]];        #ifdef DEBUG        cout << "FIRST(" << vars[i].getName() << ") =\t{ ";#endif        for(TokenSet::const_iterator it = setI.begin(); it != setI.end(); it++){            FIRSTSet[i].insert((*it)->clone());        }#ifdef DEBUG        printTokenSet(setI);        cout << " } " << endl;#endif    }}void Syntax::caculateFollowSet(){    std::vector<Variable> &vars = allVars;        TokenSets &firstSets = FIRSTSet;    map<Variable, TokenSet> firstSetMap;    vector<vector<Pattern> > patterns;        int varNum = vars.size();    for(int i = 0; i < varNum; i++){        patterns.push_back(getPatterns(vars[i]));        firstSetMap[vars[i]] = firstSets[i];    }    map<Variable, TokenSet> followSetMap;        //将#加入起始变元的FOLLOW集合中。    followSetMap[startVariable].insert(new Terminal("$"));        Epsilon e;    bool increase = true;    while(increase){        increase = false;                for(int i = 0; i < varNum; i++){            for(int j = 0; j < patterns[i].size(); j++){                                for(int k = 0; k < patterns[i][j].length(); k++){                    if(patterns[i][j].at(k)->getType() == VARIABLE){                                                bool cont = true;                        Variable v = *dynamic_cast<Variable *>(patterns[i][j].at(k));                        int oldSize = followSetMap[v].size();                                                bool behindGenerateE = (k == patterns[i][j].length() - 1);                                                for(int l = k + 1; l < patterns[i][j].length() && cont; l++){                            if(patterns[i][j].at(l)->getType() == VARIABLE){                                TokenSet newSet;                                                                Variable vl = *dynamic_cast<Variable *>(patterns[i][j].at(l));                                set_union(followSetMap[v].begin(), followSetMap[v].end(),                                           firstSetMap[vl].begin(), firstSetMap[vl].end(),                                          insert_iterator<TokenSet>(newSet, newSet.begin()));                                if(newSet.count(&e) != 0){                                    newSet.erase(&e);                                                followSetMap[v] = newSet;                                    if(l == patterns[i][j].length() - 1){ //将产生式左边的变元的FOLLOW集合合并到集合里。                                        behindGenerateE = true;                                    }                                } else {                                    followSetMap[v] = newSet;                                    cont = false;                                }                            } else if(patterns[i][j].at(l)->getType() == TERMINAL){ //变元后面是一个终结符                                followSetMap[v].insert(patterns[i][j].at(l));                                cont = false;                            }                        }                                                // 如果变元v产生式后面剩余部分为空或者能生成epsilon,将产生式前面的变元vars[i]                        // 的FOLLOW集合变元V的FOLLOW集合上                        if(behindGenerateE){                             TokenSet newSet;                            set_union(followSetMap[v].begin(), followSetMap[v].end(),                                       followSetMap[vars[i]].begin(), followSetMap[vars[i]].end(),                                      insert_iterator<TokenSet>(newSet, newSet.begin()));                            followSetMap[v] = newSet;                        }                        if(followSetMap[v].size() > oldSize){                            increase = true;                        }                    }                }            }        }    }    FOLLOWSet = TokenSets(varNum);    for(int i = 0; i < varNum; i++){#ifdef DEBUG        cout << "FOLLOW (" << vars[i].getName() << ") =\t{ ";#endif        TokenSet &setI = followSetMap[vars[i]];        for(TokenSet::const_iterator it = setI.begin(); it != setI.end(); it++){            FOLLOWSet[i].insert((*it)->clone());        }        #ifdef DEBUG        printTokenSet(setI);        cout << " }" << endl;#endif    }}void Syntax::caculateVariables(){    allVars.resize(0);    for(ProductionMap::const_iterator it = productions.begin();        it != productions.end(); it++){        if(allVars.empty() || !(it->first == allVars.back()))            allVars.push_back(it->first);    }}/** * @return AnalyzeTable */void Syntax::genLL1AnalyzeTable (AnalyzeTable & table){    Epsilon e;    vector<Pattern> patterns;    #ifdef DEBUG    cout << "\n句式的FIRST集合: \n";#endif     int varNum = allVars.size();    for(int i = 0; i < varNum; i++){        patterns = getPatterns(allVars[i]);        TokenSet first;        bool hasEpsilon = false;                for(int j = 0; j < patterns.size(); j++){            getFirst(patterns[j], first);            #ifdef DEBUG            cout << "FIRST(";            patterns[j].print();            cout << ") = { ";            printTokenSet(first);            cout << " } \n";#endif             if(first.count(&e) != 0){                if(!hasEpsilon){                    hasEpsilon = true;                } else{                    cerr << "Warning : 此文法不是LL(1)文法,存在两条产生式,都生成Epsilon" << endl;                }            }            for(TokenSet::const_iterator it = first.begin(); it != first.end(); it++){                Index idx;                switch((*it)->getType()){                    case TERMINAL:                        idx = Index(allVars[i], dynamic_cast<Terminal &>(**it));                        try{                            table.addProduction(idx, Production(allVars[i], patterns[j]));                        } catch (ProductionAlreadyExists &e){                            cerr << "Warning : 此文法不是LL(1)文法, 分析表冲突" << endl;                        }                                                break;                                            case EPSILON :                        for(TokenSet::const_iterator follow = FOLLOWSet[i].begin();                            follow != FOLLOWSet[i].end(); follow++){                            if((*follow)->getType() == TERMINAL){                                Index idx(allVars[i], dynamic_cast<Terminal &>(**follow));                                try{                                    table.addProduction(idx, Production(allVars[i], patterns[j]));                                } catch (ProductionAlreadyExists &e){                                    cerr << "Warning : 此文法不是LL(1)文法,分析表冲突" << endl;                                }                            }                        }                }            }        }    }#ifdef DEBUG    cout << "\n分析表:\n";        for(int i = 0; i < allVars.size(); i++){        for(int j = 0; j < allTerms.size(); j++){            Index idx(allVars[i], allTerms[j]);            cout << "(" << idx.getVariable().getName() << ", "                 << idx.getTerminal().getString() << " ) -- ";                        try{                table.getProduction(idx).getRhs().print();            } catch (...){            }            cout << endl;        }                Index idx(allVars[i], Terminal("$"));        cout << "(" << idx.getVariable().getName() << ", "             << idx.getTerminal().getString() << " ) -- ";        try{            table.getProduction(idx).getRhs().print();        } catch (...){        }        cout << endl;    }#endif}void Syntax::printLL1AnalyzeTable() const{}void Syntax::grammarError(const string& msg, int lineNum){    cerr << lineNum << ": " << msg;    exit(1);}Syntax::~Syntax(){    for(int i = 0; i < allVars.size(); i++){        for(TokenSet::const_iterator it = FIRSTSet[i].begin(); it != FIRSTSet[i].end(); it++){            delete *it;        }                for(TokenSet::const_iterator it = FOLLOWSet[i].begin(); it != FOLLOWSet[i].end(); it++){            delete *it;        }    }        for(int i = 0; i < pool.size(); i++)        delete pool[i];}void Syntax::printTokenSet(const TokenSet& s) const{    bool first = true;    for(TokenSet::const_iterator it = s.begin(); it != s.end(); it++){        if(first)            first = false;        else             cout << ", ";                (*it)->print();    }}Variable Syntax::getStartVariable() const{    return startVariable;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -