用C++實現(xiàn)SLR語法分析程序
更新時間:2022年02月07日 09:19:05 作者:newlw
大家好,本篇文章主要講的是用C++實現(xiàn)SLR語法分析程序,感興趣的同學趕緊來看一看吧,對你有幫助的話記得收藏一下
一、文法
原文法
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 分析表

三、運行環(huán)境
CodeBlocks-13.12 with GCC compiler from TDM-GCC (4.7.1, 32 bit)
四、輸入輸出設(shè)計
輸入:文件“fin.txt”輸入待分析串
輸出:SLR 分析過程輸出至“fout.txt”
五、主要數(shù)據(jù)結(jié)構(gòu)
// 拓廣文法的產(chǎn)生式 vector<string> G; // 文法符號到下標的轉(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;
符號棧 vector<char> symbolStack;
狀態(tài)棧 0;符號棧壓‘$';
ip 指向 s 的第一個字符;
do{
top 是棧頂符號;
cur 是 ip 所指向的輸入符號;
if(cur 是字母) cur = ‘i';
if(cur 是數(shù)字) cur = ‘n';
x = top 對應(yīng)下標;
y = cur 對應(yīng)下標;
動作 val = action[x][y];
if(val == acc){
輸出 acc;
break;
}
else if(val 為 shift){
輸出 shift;
當前輸入符號 cur 壓入符號棧;
動作 val 壓入狀態(tài)棧;
}
else if(val 為 reduce){
len = reduce 產(chǎn)生式右部長度;
狀態(tài)棧和符號棧各彈出 len 個;
topS = 當前狀態(tài)棧棧頂;
curA = 產(chǎn)生式左部非終結(jié)符號;
x = topS 對應(yīng)下標;
y = curA 對應(yīng)下標;
curA 壓入符號棧;
goto[x][y]壓入狀態(tài)棧;
輸出 reduce 產(chǎn)生式;
}
else{
error;
break;
}
}while(true);
}
七、測試


到此這篇關(guān)于用C++實現(xiàn)SLR語法分析程序的文章就介紹到這了,更多相關(guān)C++實現(xiàn)SLR語法分析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:
相關(guān)文章
C++ 動態(tài)內(nèi)存分配詳解(new/new[]和delete/delete[])
這篇文章主要介紹了C++ 動態(tài)內(nèi)存分配詳解(new/new[]和delete/delete[]),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-05-05

