用C++实现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 分析表

用C++实现SLR语法分析程序_第1张图片

三、运行环境

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

四、输入输出设计

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

输出:SLR 分析过程输出至“fout.txt”

五、主要数据结构

// 拓广文法的产生式 
vector G;        
// 文法符号到下标的转换字典 
map index;    
// SLR action 表
vector > action;    
// SLR goto 表 
vector > goTo;      

六、核心算法

int main() 
{ 
    从文件 fin.txt 读取待分析串到 s; 
    s末尾加‘$'; 
    状态栈 vector statusStack; 
    符号栈 vector 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);
} 

七、测试

用C++实现SLR语法分析程序_第2张图片

用C++实现SLR语法分析程序_第3张图片

到此这篇关于用C++实现SLR语法分析程序的文章就介绍到这了,更多相关C++实现SLR语法分析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

你可能感兴趣的:(用C++实现SLR语法分析程序)