《编译原理实验部分》实验4文法类型判断Word格式文档下载.docx
- 文档编号:16230194
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:9
- 大小:108.38KB
《编译原理实验部分》实验4文法类型判断Word格式文档下载.docx
《《编译原理实验部分》实验4文法类型判断Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《《编译原理实验部分》实验4文法类型判断Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。
2、1型文法(上下文有关文法)
xUy:
=xuy,其中U∈VN;
u∈V+;
x,y∈V*,则称该文法G为1型文法或上下文有关文法,也称上下文敏感文法,简写为CSG。
3.2型文法(上下文无关文法)
U:
=u,其中U∈VN;
u∈V+,则称该文法G为2型文法或上下文无关文法,简写为CFG。
4.3型文法(正则文法,线性文法)
=T或U:
=WT,其中T∈VT;
U,W∈VN,则称该文法G为左线性文法。
=TW,其中T∈VT;
U,W∈VN,则称该文法G为右线性文法。
左线性文法和右线性文法通称为3型文法或正则文法,有时又称为有穷状态文法,简写为RG。
四、实验步骤
实验代码
#include<
iostream>
string>
usingnamespacestd;
typedefstructString
{
stringleft,right;
//记录当前产生式的左边和右边
}String;
intleftlength,rightlength;
//记录当前产生式的左边和右边的长度
Stringcreate(stringt,Strings)//建立结构体,记录当前规则的左边和右边
inti=0;
for(i=0;
i<
t.length();
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<
<
"
输入有误。
endl;
returns;
}
intflag=0;
//记录3型文法中产生式是否同为左线型或右线性
intzero=0,first=0,second=0,third=0,low=6;
//记录当前产生式属于哪种类型,low用来记录当前所有产生式中最低级
intZero(Strings)//判断是否为0型文法
inti;
leftlength;
i++)//遍历产生式左部每一个字符
if(s.left[i]>
='
A'
s.left[i]<
Z'
)//判断字符是否是非终结符,是则结束
if(i==leftlength)//遍历中左部未找到非终结字符,不是0型文法
该文法不是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型文法
intSecond(Strings)//判断是否为2型文法
if(First(s))//先判断是否为1型文法
//判断产生式左部长度是否为一,左部第一个是否是非终结符,是则为2型文法
if((leftlength==1)||(s.left[0]>
s.left[0]<
))
second=1;
else//不是2型文法,但是1型文法
else//不是2型文法,也不是1型文法
intThird(Strings)//判断是否为3型文法
intflag;
if(Second(s))//先判断是否是2型文法
if(rightlength==1&
s.right[0]>
a'
s.right[0]<
z'
)//判断产生式右部字符是否为一个终结字符
third=1;
flag=0;
elseif(rightlength==2&
s.right[1]>
s.right[1]<
)//右线性文法
flag+=1;
)//左线性文法
flag+=2;
else//不是3型文法,但是2型文法
else
//不是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<
jk?
low:
jk;
////记录当前产生式组的最低文法类型
cin>
if(low==3)
if(flag%n==0)
cout<
这是3型文法。
elseif(low==2)
这是2型文法。
elseif(low==1)
这是1型文法。
elseif(low==0)
这是0型文法。
elseif(low==2)
elseif(low==1)
elseif(low==0)
return0;
运行结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理实验部分 编译 原理 实验 部分 文法 类型 判断
![提示](https://static.bdocx.com/images/bang_tan.gif)