用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-05
C++實(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-02
C語(yǔ)言實(shí)現(xiàn)校園導(dǎo)游系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)校園導(dǎo)游系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C++實(shí)現(xiàn)旅館住宿管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)旅館住宿管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
C++使用read()和write()讀寫二進(jìn)制文件
以文本形式讀寫文件和以二進(jìn)制形式讀寫文件的區(qū)別,并掌握了用重載的?>>?和?<<?運(yùn)算符實(shí)現(xiàn)以文本形式讀寫文件,在此基礎(chǔ)上,本節(jié)將講解如何以二進(jìn)制形式讀寫文件2023-10-10

