算符优先分析器设计实验报告Word文档格式.docx

上传人:b****8 文档编号:22223211 上传时间:2023-02-03 格式:DOCX 页数:13 大小:528.93KB
下载 相关 举报
算符优先分析器设计实验报告Word文档格式.docx_第1页
第1页 / 共13页
算符优先分析器设计实验报告Word文档格式.docx_第2页
第2页 / 共13页
算符优先分析器设计实验报告Word文档格式.docx_第3页
第3页 / 共13页
算符优先分析器设计实验报告Word文档格式.docx_第4页
第4页 / 共13页
算符优先分析器设计实验报告Word文档格式.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

算符优先分析器设计实验报告Word文档格式.docx

《算符优先分析器设计实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《算符优先分析器设计实验报告Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。

算符优先分析器设计实验报告Word文档格式.docx

最左素短语是指处于句型最左边的那个素短语。

最左素短语是算符优先分析算法的可归约串。

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;

输入的程序界面如图:

输入一个正确的句子,结果如下:

输入一个错误的句子,提示为不合法的句子:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 实习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1