算符优先分析器设计实验报告Word文档格式.docx
《算符优先分析器设计实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《算符优先分析器设计实验报告Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
最左素短语是指处于句型最左边的那个素短语。
最左素短语是算符优先分析算法的可归约串。
5.计算得到所给文法的算符优先矩阵
6.算符优先分析的根本过程
三、实验要求
使用算符优先分析算法分析下面的文法:
E’→#E#
E→E+T|T
T→T*F|F
F→P^F|P
P→(E)|i
其中i可以看作是一个终结符,无需作词法分析。
具体要求如下:
1.如果输入符号串为正确句子,显示分析步骤,包括分析栈中的容、优先关系、输入符号串的变化情况;
2.如果输入符号串不是正确句子,那么指示出错位置。
四、实验结果〔程序〕及分析
#include<
stdio.h>
cstring>
iostream>
iomanip>
#defineMAX100
usingnamespacestd;
charS[MAX];
charshuru[MAX],yu[MAX];
voidscanner();
intpanyouxian(charx);
voidshengyuchuan();
intk;
charyouxian[7][7]=
{
{'
>
'
'
<
},
},
$'
='
};
//优先关系表,其中>
为大于,<
为小于,=为等于,$为空格
intmain()
intl,j;
cout<
"
请输入一个字符串:
;
cin.get(shuru,MAX);
//将输入的字符串存到数组
cout<
步骤栈优先关系当前符号剩余输入串移进或归约"
endl;
k=0;
S[k]='
#'
S[k+1]='
\0'
l=strlen(shuru);
//求输入字符串的长度
for(j=0;
j<
l;
j++)
yu[j]=shuru[j];
yu[j]='
scanner();
return0;
}
voidscanner()//扫描分析输入串
{
inti,j,l,h1,l1,h2,l2,h3,l3,y1,y2,r1,r2;
intstep=0;
//分析步骤数
chara;
//存放正在分析的字符
charp1,Q,p2;
//算出输入串长度
for(i=0;
i<
i++)
{
a=shuru[i];
if(S[k]=='
+'
||S[k]=='
*'
^'
i'
('
)'
)
j=k;
else
j=k-1;
h1=panyouxian(S[j]);
//从优先关系表中查出S[j]和a的优先关系
if(a=='
||a=='
l1=panyouxian(a);
else//如果句子含有不是终结符集合里的其它字符,不合法
{
cout<
错误!
不合法的句子!
break;
}
p1=youxian[h1][l1];
if(p1=='
{
loop:
Q=S[j];
if(S[j-1]=='
||S[j-1]=='
j=j-1;
else
j=j-2;
h2=panyouxian(S[j]);
l2=panyouxian(Q);
p1=youxian[h2][l2];
if(p1=='
)//S[j+1]…S[k]归约为F
{
k=j+1;
shengyuchuan();
step++;
cout<
left<
("
step<
setw(6)<
)"
setw(10)<
S<
p1<
a<
setw(5)<
right<
yu<
setw(15)<
归约"
i--;
S[k]='
F'
r1=strlen(S);
for(r2=k+1;
r2<
r2;
r2++)
S[r2]='
//多个字符归约,把栈顶后面的舍弃
y1=strlen(yu);
for(y2=0;
y2<
y1;
y2++)
yu[y1-y2]=yu[y1-y2-1];
yu[0]='
}
goto
loop;
)//移进如果上一步是不归约,剩余的字符串减少一个
{
shuru[l]='
step=step+1;
移近"
k=k+1;
S[k]=a;
if(p1=='
{
h3=panyouxian(S[j]);
l3=panyouxian('
);
p2=youxian[h3][l3];
if(p2=='
)
{
shengyuchuan();
step++;
cout<
承受"
合法的句子!
break;
}
else
k=k+1;
S[k]=a;
}
else
cout<
出错!
break;
}
}
voidshengyuchuan()
inti,j;
i=strlen(yu);
for(j=0;
i;
yu[j]=yu[j+1];
yu[i-1]='
intpanyouxian(charx)
intm;
switch(x)
case'
:
m=0;
break;
m=1;
m=2;
m=3;
m=4;
m=5;
break;
m=6;
returnm;
输入的程序界面如图:
输入一个正确的句子,结果如下:
输入一个错误的句子,提示为不合法的句子: