用C++实现SLR语法分析程序
作者:newlw
大家好,本篇文章主要讲的是用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 分析表
三、运行环境
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); }
七、测试
到此这篇关于用C++实现SLR语法分析程序的文章就介绍到这了,更多相关C++实现SLR语法分析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!