日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

用C++實現SLR語法分析程序_C 語言

作者:newlw ? 更新時間: 2022-04-11 編程語言

一、文法

原文法

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 分析表

在這里插入圖片描述

三、運行環境

CodeBlocks-13.12 with GCC compiler from TDM-GCC (4.7.1, 32 bit)

四、輸入輸出設計

輸入:文件“fin.txt”輸入待分析串

輸出:SLR 分析過程輸出至“fout.txt”

五、主要數據結構

// 拓廣文法的產生式 
vector<string> G;        
// 文法符號到下標的轉換字典 
map<char, int> index;    
// SLR action 表
vector<vector<int> > action;    
// SLR goto 表 
vector<vector<int> > goTo;      

六、核心算法

int main() 
{ 
    從文件 fin.txt 讀取待分析串到 s; 
    s末尾加‘$'; 
    狀態棧 vector<int> statusStack; 
    符號棧 vector<char> symbolStack; 
    狀態棧 0;符號棧壓‘$';
    ip 指向 s 的第一個字符; 
    do{ 
        top 是棧頂符號; 
        cur 是 ip 所指向的輸入符號; 
        if(cur 是字母) cur = ‘i'; 
        if(cur 是數字) cur = ‘n'; 
        x = top 對應下標;
        y = cur 對應下標; 
        動作 val = action[x][y]; 
        if(val == acc){ 
            輸出 acc;
            break;
        } 
        else if(val 為 shift){ 
            輸出 shift;
            當前輸入符號 cur 壓入符號棧; 
            動作 val 壓入狀態棧; 
        } 
        else if(val 為 reduce){ 
            len = reduce 產生式右部長度;
            狀態棧和符號棧各彈出 len 個; 
            topS = 當前狀態棧棧頂;
            curA = 產生式左部非終結符號; 
            x = topS 對應下標;
            y = curA 對應下標;
            curA 壓入符號棧;
            goto[x][y]壓入狀態棧;
            輸出 reduce 產生式; 
        } 
        else{ 
            error;
            break;
        } 
    }while(true);
} 

七、測試

在這里插入圖片描述

原文鏈接:https://blog.csdn.net/newlw/article/details/122798277

欄目分類
最近更新