编译原理实验二压缩文法的等价变换汇总Word文件下载.docx

上传人:b****6 文档编号:19234694 上传时间:2023-01-04 格式:DOCX 页数:10 大小:129.55KB
下载 相关 举报
编译原理实验二压缩文法的等价变换汇总Word文件下载.docx_第1页
第1页 / 共10页
编译原理实验二压缩文法的等价变换汇总Word文件下载.docx_第2页
第2页 / 共10页
编译原理实验二压缩文法的等价变换汇总Word文件下载.docx_第3页
第3页 / 共10页
编译原理实验二压缩文法的等价变换汇总Word文件下载.docx_第4页
第4页 / 共10页
编译原理实验二压缩文法的等价变换汇总Word文件下载.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

编译原理实验二压缩文法的等价变换汇总Word文件下载.docx

《编译原理实验二压缩文法的等价变换汇总Word文件下载.docx》由会员分享,可在线阅读,更多相关《编译原理实验二压缩文法的等价变换汇总Word文件下载.docx(10页珍藏版)》请在冰豆网上搜索。

编译原理实验二压缩文法的等价变换汇总Word文件下载.docx

(1)某条规则U:

=u的左部非终结符U(U不是识别符号),不在任何其他规则右部出现,即所有的推导始终不会用到此规则。

【不可到达】

(2)在推导句子的过程中,一旦使用了该规则,将推不出任何终结符号串。

即该规则中含有推不出任何终结符号串的非终结符。

【不可终止】

 

四:

数据结构与算法

structChomsky

{

stringleft;

stringright;

};

voidapart(Chomsky*p,inti)//分开产生式左右部

voidVNVT(Chomsky*p)//求VN和VT

intzero(Chomsky*p)//0型文法

intone(Chomsky*p)//1型文法

inttwo(Chomsky*p)//2型文法

voidshanchu(Chomsky*p)//删除多余规则与有害规则

五:

出错分析

1:

变量重复定义导致了一些小错误

2:

程序太长{}缺少也导致了错误

3:

后面删除规则的程序出错了,没有调试成功。

六:

实验结果与分析

不是上下文无关文法的:

2型文法的压缩:

七:

源代码

#include<

iostream>

string>

usingnamespacestd;

#definemax50

intNONE=1;

intRELEFT=1;

stringstrings,noend,end;

//非终结符与终结符存储

intn;

//产生式总数

intflag;

intj;

for(j=0;

j<

strings.length();

j++)

if(strings[j]=='

-'

{

p[i].left=strings.substr(0,j);

p[i].right=strings.substr(j+1,strings.length()-j);

}

}

inti,j;

for(i=0;

i<

n;

i++)

{

for(j=0;

(int)p[i].left.length();

j++)

if((p[i].left[j]>

='

A'

&

p[i].left[j]<

Z'

))//非终结符判断

{

if(noend.find(p[i].left[j])>

100)

noend+=p[i].left[j];

}

else

if(end.find(p[i].left[j])>

end+=p[i].left[j];

(int)p[i].right.length();

if(!

(p[i].right[j]>

p[i].right[j]<

))//终结符判断

if(end.find(p[i].right[j])>

end+=p[i].right[j];

else

if(noend.find(p[i].right[j])>

noend+=p[i].right[j];

}

intflag(0),count(0);

if(p[i].left[j]>

)//有否非终结符

flag++;

if(flag>

0)

flag=0;

count++;

else

break;

//左部没有非终结符,结束

if(count==n)

return1;

//属于0型文法

else

cout<

<

endl<

"

所输产生式不属于任何文法。

endl;

NONE=0;

return0;

intflag(0);

inti;

if(zero(p))

for(i=0;

if(p[i].right.length()<

p[i].left.length())//右部长度是否小于左部

break;

flag--;

if(flag>

此文法属于0型文法,即短语文法。

return0;

//不属于1型文法

else

if(flag==0)

return1;

//属于1型文法

else

return0;

if(one(p))

i++)

if((p[i].left.length()!

=1)||!

(p[i].left[0]>

p[i].left[0]<

))//左部不属于一个字符或不属于非终结符

flag--;

此文法属于1型文法,即上下文有关文法。

//不属于2型文法

cout<

次文法属于2型文法"

//属于2型文法

if(two(p))

此文法属于上下文无关文法,可进行文法压缩,实验继续"

inti,j;

i++)//有害规则的判断

if(p[i].left.length()==p[i].right.length())

for(j=0;

{

if(p[i].left[j]!

=p[i].right[j])//不为有害规则

{

j--;

break;

//次规则不是有害规则

}

}

if(j==p[i].left.length()-1)//此条规则为有害规则,删除

cout<

删除此条有害规则"

p[i].left<

->

p[i].right<

n--;

for(intk=0;

k<

(int)noend.length();

k++)//多余规则中不可到达的判断

for(i=0;

if(noend[k]!

=p[i].right[j])

continue;

else

i--;

break;

if(i==n-1)//此条规则为多余规则

for(i=0;

if(p[i].left[j]==noend[k]||p[i].right[j]==noend[k])

cout<

删除此条多余规则"

n--;

for(k=0;

k++)//多余规则中不可终止的判断

压缩后的文法是:

此文法不是上下文无关文法,实验结束"

voidmain()

cout<

....................编译原理实验二:

压缩文法的等价变换...................."

请输入产生式总数及各产生式:

其中左右部之间用'

表示,空用'

#'

表示"

cin>

>

Chomsky*p=newChomsky[max];

cin>

strings;

apart(p,i);

VNVT(p);

shanchu(p);

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

当前位置:首页 > 考试认证 > 交规考试

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

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