本文使用栈的知识进行编译原理中的预测分析法的代码编写。
文章目录
一、实验要求
已知预测分析表如下,编写C/C++程序实现对输入表达式的语法分析

ps:预测分析表的数据结构使用二维数据结构,第一维 V N V_N VN 下标0-4对应非终结符,第二维 V T V_T VT下标0-5对应终结符
二、实验原理
预测分析法是自顶向下分析的一种方法,一个预测分析程序是由三个部分组成:(1) 预测分析程序 (2) 先进后出栈 (3) 预测分析表
三、实验过程
1.构建预测分析表、非终结符数组、终结符数组
使用数字对预测分析表中的推导产生式进行编号,自己了解数字与相应的推导式的对应关系即可。
比如1: ->TD 2: ->+TD 3: 空 4:->FS 5:->*FS 6: ->i 7:->(E)
int M[5][6]={0};
M[0][0]=1; M[0][3]=1;
M[1][1]=2; M[1][4]=3; M[1][5]=3;
M[2][0]=4; M[2][3]=4;
M[3][1]=3; M[3][2]=5; M[3][4]=3; M[3][5]=3;
M[4][0]=6; M[4][3]=7;
char a[5]={'E','D','T','S','F'};//非终结符,对应下标为表项的行数
char b[6]={'i','+','*','(',')','#'};//终结符 ,对应下标为表项的列数

2.创建输入字符串,设置指针
此处使用了STL中的string知识
string s;
cin>>s;//输入自己想要判断的字符串
int ip=0;//字符串的指针,每成功匹配以后都向后移动一位
3.创建一个分析栈,并进行压入结束符和开始符的基本初始化操作
此处使用了STL的stack知识,如果有不懂的可以去查查相关函数的使用。
stack<char> st;
st.push('#');//压入结束符
st.push('E');//压入开始符

4.寻找表项
寻找非终结符(下标为x)、终结符(下标为y)的下标组合(x,y)对应的预测分析表中的表项。

5.匹配字符过程
由非终结符开始的产生式。例如:E->TD
for(i=ip;i<length;i++)cout<<s[i];
printf("\t");
//输出推导所用产生式或匹配
cout<<temp1<<"->TD"<<endl;
//进行替换,将替换的栈顶元素弹出
st.pop();
//手动压入TD,注意顺序应该D先压入,后面的字符在底下
st.push('D');
st.push('T');
}
ps:printf(“\t”)是为了输出的字符串是对齐的,格式好看

由终结符开始的产生式。如:S->*FS(*是终结符)
for(i=ip;i<length;i++)cout<<s[i];
printf("\t");
cout<<temp1<<"->*FS"<<endl;
st.pop();
st.push('S');
st.push('F');
st.push('*');
/*
由于*属于终结符不是非终结符,于是手动进行匹配处理
弹出栈顶元素'*',输入字符串的比较指针向后移动一位
*/
showstack(st);//打印输出分析栈的内容
for(i=ip;i<length;i++)cout<<s[i];
printf("\t");
cout<<"*匹配"<<endl;
st.pop();//一旦匹配一个就输出一个
ip++;
产生式为空。如: D → ε D\to\varepsilon D→ε
for(i=ip;i<length;i++)cout<<s[i];
printf("\t");
cout<<temp1<<"->空"<<endl;
st.pop();
//推出空,只用弹出栈顶元素,继续往后进行比较即可
四、实验结果

结束语
以上就是有关编译原理的预测分析法的简单代码编写,希望能对读者们起到一定的作用。
如果存在错误欢迎在评论区指出,可以多多交流哇,大家一起进步。
本文介绍了使用C/C++编程实现编译原理中的预测分析法,通过构建预测分析表、非终结符和终结符数组,创建分析栈并进行匹配字符的过程,对输入表达式进行语法分析。示例中详细讲解了如何根据预测分析表进行操作,并提供了匹配字符的代码示例。

5189

被折叠的 条评论
为什么被折叠?



