用C++实现SLR语法分析程序
短信预约 -IT技能 免费直播动态提醒
一、文法
原文法
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语法分析内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341