算符优先分析器设计实验报告.docx

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

算符优先分析器设计实验报告.docx

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

算符优先分析器设计实验报告.docx

算符优先分析器设计实验报告

 

 

编译原理实验报告

题目:

算符优先分析法分析器

 

学院计算机科学与技术

专业xxxxxxxxxxxxxxxx

学号xxxxxxxxxxxx

XX宁剑

指导教师xxxx

2015年xx月xx日

算符优先分析法分析器

一、实验目的 

1.理解自底向上优先分析,比拟和自顶向下优先分析的不同。

2.理解算符优先分析的特点,体会其和简单优先分析方法的不同。

3.加深对编译器语法分析的理解。

二、实验原理 

1.自底向上优先分析方法,也称移进-归约分析,粗略地说它的思想是对输入符号串自左向右进展扫描,并将输入符号逐个移入一个后进先出栈,边移入边分析,一旦栈顶符号串形成某个句型的句柄或可归约串时,就将该产生式的左部非终极符代替相应的右边文法符号串。

2.算符优先分析法的根本思想

首先确定算符〔确切地说是终结符〕之间的优先关系和结合性质,然后借助这种关系,比拟相邻算符之间的优先级来确定句型的可归约串,并进展归约。

注意:

算符优先分析过程是自下而上的归约过程,但它的可归约串未必是句柄,也就是说,算符优先分析过程不是一种规归约。

3.终结符号间优先关系确实定,用FIRSTVT和LASTVT计算。

4.最左素短语

所谓素短语是指这样一个短语,它至少含有一个终结符,并且除它自身之外不再含有其它素短语。

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

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

5.计算得到所给文法的算符优先矩阵

6.算符优先分析的根本过程

三、实验要求

使用算符优先分析算法分析下面的文法:

E’→#E#

E→E+T|T

T→T*F|F

F→P^F|P

P→(E)|i

其中i可以看作是一个终结符,无需作词法分析。

具体要求如下:

1.如果输入符号串为正确句子,显示分析步骤,包括分析栈中的容、优先关系、输入符号串的变化情况;

2.如果输入符号串不是正确句子,那么指示出错位置。

四、实验结果〔程序〕及分析

#include

#include

#include

#include

#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<<"步骤栈优先关系当前符号剩余输入串移进或归约"<

k=0;

S[k]='#';

S[k+1]='\0';

l=strlen(shuru);//求输入字符串的长度

for(j=0;j

yu[j]=shuru[j];

yu[j]='\0';

scanner();

return0;

}

voidscanner()//扫描分析输入串

{

inti,j,l,h1,l1,h2,l2,h3,l3,y1,y2,r1,r2;

intstep=0;//分析步骤数

chara;//存放正在分析的字符

charp1,Q,p2;

l=strlen(shuru);//算出输入串长度

for(i=0;i

{

a=shuru[i];

if(S[k]=='+'||S[k]=='*'||S[k]=='^'||S[k]=='i'||S[k]=='('||S[k]==')'||S[k]=='#')

j=k;

else

j=k-1;

h1=panyouxian(S[j]);//从优先关系表中查出S[j]和a的优先关系

if(a=='+'||a=='*'||a=='^'||a=='i'||a=='('||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]=='*'||S[j-1]=='^'||S[j-1]=='i'||S[j-1]=='('||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<

i--;

S[k]='F';

r1=strlen(S);

for(r2=k+1;r2

S[r2]='\0';//多个字符归约,把栈顶后面的舍弃

y1=strlen(yu);

for(y2=0;y2

yu[y1-y2]=yu[y1-y2-1];

yu[0]='i';

}

else

goto

loop;

}

else

{

if(p1=='<')//移进如果上一步是不归约,剩余的字符串减少一个

{

shengyuchuan();

shuru[l]='\0';

step=step+1;

cout<

k=k+1;

S[k]=a;

}

else

{

if(p1=='=')

{

h3=panyouxian(S[j]);

l3=panyouxian('#');

p2=youxian[h3][l3];

if(p2=='=')

{

shengyuchuan();

step++;

cout<

cout<<"合法的句子!

"<

break;

}

else

{

k=k+1;

S[k]=a;

}

}

else

{

cout<<"出错!

"<

break;

}

}

}

}

}

voidshengyuchuan()

{

inti,j;

i=strlen(yu);

for(j=0;j

yu[j]=yu[j+1];

yu[i-1]='\0';

}

intpanyouxian(charx)

{

intm;

switch(x)

{

case'+':

m=0;

break;

case'*':

m=1;

break;

case'^':

m=2;

break;

case'i':

m=3;

break;

case'(':

m=4;

break;

case')':

m=5;break;

case'#':

m=6;

break;

}

returnm;

}

输入的程序界面如图:

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

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

 

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

当前位置:首页 > 解决方案 > 学习计划

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

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