用C++實(shí)現(xiàn)SLR語(yǔ)法分析程序
一、文法
原文法
E->E+T|E-T|T T->T*F|T/F|F F->id|(E)|num 其中: id: a-f, A-F,num:0-9
拓廣文法
(0)S->E (1)E->E+T (2)E->E-T (3)E->T (4)T->T*F (5)T->T/F (6)T->F (7)F->i (8)F->(E) (9)F->n 其中:i:id, n:num
二、SLR 分析表
三、運(yùn)行環(huán)境
CodeBlocks-13.12 with GCC compiler from TDM-GCC (4.7.1, 32 bit)
四、輸入輸出設(shè)計(jì)
輸入:文件“fin.txt”輸入待分析串
輸出:SLR 分析過(guò)程輸出至“fout.txt”
五、主要數(shù)據(jù)結(jié)構(gòu)
// 拓廣文法的產(chǎn)生式 vector<string> G; // 文法符號(hào)到下標(biāo)的轉(zhuǎn)換字典 map<char, int> index; // SLR action 表 vector<vector<int> > action; // SLR goto 表 vector<vector<int> > goTo;
六、核心算法
int main() { 從文件 fin.txt 讀取待分析串到 s; s末尾加‘$'; 狀態(tài)棧 vector<int> statusStack; 符號(hào)棧 vector<char> symbolStack; 狀態(tài)棧 0;符號(hào)棧壓‘$'; ip 指向 s 的第一個(gè)字符; do{ top 是棧頂符號(hào); cur 是 ip 所指向的輸入符號(hào); if(cur 是字母) cur = ‘i'; if(cur 是數(shù)字) cur = ‘n'; x = top 對(duì)應(yīng)下標(biāo); y = cur 對(duì)應(yīng)下標(biāo); 動(dòng)作 val = action[x][y]; if(val == acc){ 輸出 acc; break; } else if(val 為 shift){ 輸出 shift; 當(dāng)前輸入符號(hào) cur 壓入符號(hào)棧; 動(dòng)作 val 壓入狀態(tài)棧; } else if(val 為 reduce){ len = reduce 產(chǎn)生式右部長(zhǎng)度; 狀態(tài)棧和符號(hào)棧各彈出 len 個(gè); topS = 當(dāng)前狀態(tài)棧棧頂; curA = 產(chǎn)生式左部非終結(jié)符號(hào); x = topS 對(duì)應(yīng)下標(biāo); y = curA 對(duì)應(yīng)下標(biāo); curA 壓入符號(hào)棧; goto[x][y]壓入狀態(tài)棧; 輸出 reduce 產(chǎn)生式; } else{ error; break; } }while(true); }
七、測(cè)試
到此這篇關(guān)于用C++實(shí)現(xiàn)SLR語(yǔ)法分析程序的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)SLR語(yǔ)法分析內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ 動(dòng)態(tài)內(nèi)存分配詳解(new/new[]和delete/delete[])
這篇文章主要介紹了C++ 動(dòng)態(tài)內(nèi)存分配詳解(new/new[]和delete/delete[]),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05C++實(shí)現(xiàn)兩個(gè)日期間差多少天的解決方法
本篇文章用實(shí)例說(shuō)明,在C++中實(shí)現(xiàn)兩個(gè)日期間差多少天的方法。需要的朋友參考下2013-05-05用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易通訊錄
這篇文章主要為大家詳細(xì)介紹了用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02C語(yǔ)言實(shí)現(xiàn)校園導(dǎo)游系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)校園導(dǎo)游系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C++實(shí)現(xiàn)旅館住宿管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)旅館住宿管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05C++使用read()和write()讀寫(xiě)二進(jìn)制文件
以文本形式讀寫(xiě)文件和以二進(jìn)制形式讀寫(xiě)文件的區(qū)別,并掌握了用重載的?>>?和?<<?運(yùn)算符實(shí)現(xiàn)以文本形式讀寫(xiě)文件,在此基礎(chǔ)上,本節(jié)將講解如何以二進(jìn)制形式讀寫(xiě)文件2023-10-10