数学与计算机学院编译原理实验报告
年级专业学号姓名成绩
实验题目算符优先分析法分析器的设计实验日期
一、实验目的:
设计一个算符优先分析器,理解优先分析方法的原理。
二、实验要求:
设计一个算符优先分析器
三、实验内容:
使用算符优先分析算法分析下面的文法:
E’→#E#
E →E+T | T
T →T*F | F
F →P^F | P
P →(E) | i
其中i可以看作是一个终结符,无需作词法分析。
具体要求如下:
1、如果输入符号串为正确句子,显示分析步骤,包括分析栈中的内容、优先关系、输入符号串的变化情况;
2、如果输入符号串不是正确句子,则指示出错位置。
四、实验结果及主要代码:
1.主要代码
void operatorp()
{
char s[100];
char a,Q;
int k,j,i,l;
string input,temp;
cin>>input;
cout<<"步骤"<<'\t'<<"栈"<<'\t'<<"优先关系"<<'\t'<<"当前符号"<<'\t'<<"剩余输入串"<<'\t'<<"移进或归约"<<endl;
k=1;s[k]='#';i=1;
do
{
a=input[0];
temp="";
for(l=1;l<input.length();l++)
temp+=input[l];
input=temp;
if(svt(s[k])) j=k;
else j=k-1;
while (search(s[j],a)=='>')
{
cout<<'('<<i<<')'<<'\t'; //步骤
temp="";
for(l=1;l<k+1;l++)
temp+=s[l];
cout<<temp<<'\t'; //栈
cout<<'>'<<'\t'<<setw(10); //优先关系cout<<a<<'\t'<<setw(15); //当前符号cout<<input<<'\t'<<setw(15); //剩余输入串i++;
for(;;)
{
Q=s[j];
if(svt(s[j-1])) j=j-1;
else j=j-2;
if(search(s[j],Q)=='<')
{
cout<<"归约"<<endl;//归约
break;
}
}
temp="";
for(l=j+1;l<k+1;l++)
temp+=s[l];
for(l=0;l<6;l++)
if(temp==key[l])
{
k=j+1;
s[k]=v[l];
break;
}
}
cout<<'('<<i<<')'<<'\t'; //步骤
temp="";
for(l=1;l<k+1;l++)
temp+=s[l];
cout<<temp<<'\t'; //栈
if(search(s[j],a)=='<')
{
cout<<'<'<<'\t'<<setw(10);; //优先关系
cout<<a<<'\t'<<setw(15); //当前符号
cout<<input<<'\t'<<setw(15); //剩余输入串cout<<"移进"<<endl;
i++;
k=k+1;s[k]=a;
} //移进
else if(search(s[j],a)=='Y')
{
cout<<'='<<'\t'<<setw(10);; //优先关系
cout<<a<<'\t'<<setw(15); //当前符号
cout<<input<<'\t'<<setw(15); //剩余输入串
cout<<"接受"<<endl;
i++;
}
else
{
cout<<'?'<<'\t'<<setw(10);; //优先关系
cout<<a<<'\t'<<setw(15); //当前符号
cout<<input<<'\t'<<setw(15); //剩余输入串
cout<<"出错"<<endl;
exit(0);
}//出错
}while(a!='#');
}
2.实验结果
欢迎下载,谢谢观看!资料仅供参考学习。