《编译原理实验部分》实验4文法类型判断.docx

上传人:b****6 文档编号:3324661 上传时间:2022-11-21 格式:DOCX 页数:9 大小:108.38KB
下载 相关 举报
《编译原理实验部分》实验4文法类型判断.docx_第1页
第1页 / 共9页
《编译原理实验部分》实验4文法类型判断.docx_第2页
第2页 / 共9页
《编译原理实验部分》实验4文法类型判断.docx_第3页
第3页 / 共9页
《编译原理实验部分》实验4文法类型判断.docx_第4页
第4页 / 共9页
《编译原理实验部分》实验4文法类型判断.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

《编译原理实验部分》实验4文法类型判断.docx

《《编译原理实验部分》实验4文法类型判断.docx》由会员分享,可在线阅读,更多相关《《编译原理实验部分》实验4文法类型判断.docx(9页珍藏版)》请在冰豆网上搜索。

《编译原理实验部分》实验4文法类型判断.docx

《编译原理实验部分》实验4文法类型判断

《编译原理》(实验部分)

实验4_文法类型判断

一、实验目的

输入:

一组任意的规则。

输出:

相应的Chomsky文法的类型。

二、实验设备

1、PC兼容机一台;操作系统为WindowsWindowsXP。

2、VisualC++6.0或以上版本,Windows2000或以上版本,汇编工具(在Software子目录下)。

三、实验原理

1、0型文法(短语文法)

如果对于某文法G,P中的每个规则具有下列形式:

u:

:

=v,其中u∈V+,v∈V*,则称该文法G为0型文法或短语文法,简写为PSG。

2、1型文法(上下文有关文法)

如果对于某文法G,P中的每个规则具有下列形式:

xUy:

:

=xuy,其中U∈VN;u∈V+;x,y∈V*,则称该文法G为1型文法或上下文有关文法,也称上下文敏感文法,简写为CSG。

3.2型文法(上下文无关文法)

如果对于某文法G,P中的每个规则具有下列形式:

U:

:

=u,其中U∈VN;u∈V+,则称该文法G为2型文法或上下文无关文法,简写为CFG。

4.3型文法(正则文法,线性文法)

如果对于某文法G,P中的每个规则具有下列形式:

U:

:

=T或U:

:

=WT,其中T∈VT;U,W∈VN,则称该文法G为左线性文法。

如果对于某文法G,P中的每个规则具有下列形式:

U:

:

=T或U:

:

=TW,其中T∈VT;U,W∈VN,则称该文法G为右线性文法。

左线性文法和右线性文法通称为3型文法或正则文法,有时又称为有穷状态文法,简写为RG。

四、实验步骤

实验代码

#include

#include

usingnamespacestd;

typedefstructString

{

stringleft,right;//记录当前产生式的左边和右边

}String;

intleftlength,rightlength;//记录当前产生式的左边和右边的长度

Stringcreate(stringt,Strings)//建立结构体,记录当前规则的左边和右边

{

inti=0;

for(i=0;i

{

if(t[i]=='-'&&t[i+1]=='>')

{

s.left=t.substr(0,i);

leftlength=i;

s.right=t.substr(i+2,t.length());

rightlength=t.length()-leftlength-2;

break;

}

}

if(i==t.length())

cout<<"输入有误。

"<

returns;

}

intflag=0;//记录3型文法中产生式是否同为左线型或右线性

intzero=0,first=0,second=0,third=0,low=6;//记录当前产生式属于哪种类型,low用来记录当前所有产生式中最低级

intZero(Strings)//判断是否为0型文法

{

inti;

for(i=0;i

{

if(s.left[i]>='A'&&s.left[i]<='Z')//判断字符是否是非终结符,是则结束

break;

}

if(i==leftlength)//遍历中左部未找到非终结字符,不是0型文法

{

cout<<"该文法不是0型文法"<

return0;

}

else//属于0型文法,type加0

{

zero=1;

return1;

}

}

intFirst(Strings)//判断是否为1型文法

{

if(Zero(s))//先判断是否是0型文法

{

//判断产生式左部长度是否小于右部或者右部长度为0,这是属于1型文法

if((leftlength<=rightlength)||rightlength==0)

{

first=1;

return1;

}

else//不是1型文法,但是0型文法

{

zero=1;

return0;

}

}

else//不是0型文法

return0;

}

intSecond(Strings)//判断是否为2型文法

{

if(First(s))//先判断是否为1型文法

{

//判断产生式左部长度是否为一,左部第一个是否是非终结符,是则为2型文法

if((leftlength==1)||(s.left[0]>='A'&&s.left[0]<='Z'))

{

second=1;

return1;

}

else//不是2型文法,但是1型文法

{

first=1;

return0;

}

}

else//不是2型文法,也不是1型文法

return0;

}

intThird(Strings)//判断是否为3型文法

{

intflag;

if(Second(s))//先判断是否是2型文法

{

if(rightlength==1&&s.right[0]>='a'&&s.right[0]<='z')//判断产生式右部字符是否为一个终结字符

{

third=1;

flag=0;

return1;

}

elseif(rightlength==2&&s.right[0]>='a'&&s.right[0]<='z'&&s.right[1]>='A'&&s.right[1]<='Z')//右线性文法

{

third=1;

flag+=1;

return1;

}

elseif(rightlength==2&&s.right[0]>='A'&&s.right[0]<='Z'&&s.right[1]>='a'&&s.right[1]<='z')//左线性文法

{

third=1;

flag+=2;

return1;

}

else//不是3型文法,但是2型文法

return0;

}

else

return0;//不是2型文法

}

intmain()

{

intn=0,k=0;

intjk;

stringt,stand="^z";

Strings;

cout<<"请输入一组任意的规则(以“^z”结束),空子串用“^”表示:

"<

cin>>t;

while(t!

=stand)

{

s=create(t,s);

n++;

zero=first=second=third=0;

Third(s);

if(third)//记录当前产生式的文法类型

jk=3;

elseif(second)

jk=2;

elseif(first)

jk=1;

elseif(zero)

jk=0;

low=low

low:

jk;////记录当前产生式组的最低文法类型

cin>>t;

}

if(low==3)

{

if(flag%n==0)

cout<<"这是3型文法。

";

elseif(low==2)

cout<<"这是2型文法。

";

elseif(low==1)

cout<<"这是1型文法。

";

elseif(low==0)

cout<<"这是0型文法。

";

}

elseif(low==2)

cout<<"这是2型文法。

";

elseif(low==1)

cout<<"这是1型文法。

";

elseif(low==0)

cout<<"这是0型文法。

";

return0;

}

运行结果:

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

当前位置:首页 > 解决方案 > 营销活动策划

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

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