编译原理之预测分析法的实现(使用C/C++语言实现+使用栈的知识点))

本文使用栈的知识进行编译原理中的预测分析法的代码编写。


一、实验要求

已知预测分析表如下,编写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();
			//推出空,只用弹出栈顶元素,继续往后进行比较即可  

四、实验结果

在这里插入图片描述


结束语

以上就是有关编译原理的预测分析法的简单代码编写,希望能对读者们起到一定的作用。
如果存在错误欢迎在评论区指出,可以多多交流哇,大家一起进步。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值