资源描述:
《编译原理实验文法的判断.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、文法类型的判断和推导序列的生成目录一、实验名称2二、实验目的2三、实验原理21、文法G定义为四元组(Vn,Vt,P,S)22、文法类型的判断2四、实验思路21、接受产生式32、文法类型的判断33、将文法以四元组形式输出4五、实验小结41、文法类型的判断条件42、产生式的存储问题53、文法以四元组形式输出问题5六、附件51、源代码52、运行结果截图10一、实验名称文法类型的判断和推导序列的生成二、实验目的输入:一组任意的文法规则和任意符号串。输出:相应的Chomsky文法类型和推导。三、实验原理1、
2、文法G定义为四元组(Vn,Vt,P,S)其中Vn为非终结符(或语法实体,或变量)集:Vt为终结符集;P为规则(α->β)的集合,α∈(Vn∪Vt)*且至少包含一个非终结符,β∈(Vn∪Vt)*;Vn,Vt和P是非空有穷集。S称作识别符或开始符,它是一个非终结符,至少要在一条规则中作为左部出现。2、文法类型的判断a.设G=(Vn,Vt,P,S)为一文法,若P中的每一个产生式α->β均满足
3、β
4、>=
5、α
6、,仅仅S->ε除外,则文法G是1型或上下文有关的。b.设G=(Vn,Vt,P,S),若P中的每一个
7、产生式α->β满足:α是一个非终结符,β∈(Vn∪Vt)*,则此文法称为2型的或上下文无关的。c.设G=(Vn,Vt,P,S),若P中的每一个产生式的形式都是A->αB或A->α,其中A和B都是终结符,α∈Vt*,则G是3型文法或正规文法。四、实验思路本实验采取C++来完成,用大写字母A到Z表示非终结符,小写字符a到z表示终结符。实验流程图1、接受产生式首先建立一个结构体siyuanzu,其成员有非终结符集合数组Vn,终结符集合数组Vt以及产生式集合数组rule,通过函数input来接受从键盘输入
8、的产生式,并且存储于string类字符串数组rule中。函数input实现接受产生式功能的思路为:先确定要输入的产生式数目n,用for循环实现产生式的存储。2、文法类型的判断函数Grammer实现判断文法类型的功能并且输出文法的类型。其实现功能的思路为:a.对rule数组中每一个产生式进行判断,以“->”中的“-”作为判断条件,将产生式分为左部和右部分别计算左部和右部的长度。若youb小于左部则不是1型文法。输出0型文法;若右部大于或等于左部,则继续判断。b.判断文法是否为2型文法,经过a步骤的执
9、行,若文法为1型文法,只需在此基础上判断文法的左部是否只有一个非终结符。通过判断条件zuo==1&&'A'<=a.rule[i][zuo-1]&&a.rule[i][zuo-1]<='Z'确定是否为2型文法,若不满足判断条件则为1型文法,进行输出,若满足则继续判断。c.判断文法是否为3型文法,经过b步骤的执行,若文法为2型文法,只需在此基础上判断文法的右部是否为αB或α形式或者是Bα或α形式。通过判断条件一((you==2)&&(a.rule[i][num+1]>='a')&&(a.rule[i]
10、[num+1]<='z')&&(a.rule[i][num+2]>='A')&&(a.rule[i][num+2]<='Z'))
11、
12、((you==1)&&(a.rule[i][num+1]>='a')&&(a.rule[i][num+1]<='z'))判断是否满足αB或α形式,通过判断条件二((you==2)&&(a.rule[i][num+1]>='A')&&(a.rule[i][num+1]<='Z')&&(a.rule[i][num+2]>='a')&&(a.rule[i][num+2]<=
13、'z'))
14、
15、((you==1)&&(a.rule[i][num+1]>='a')&&(a.rule[i][num+1]<='z'))判断是否满足Bα或α形式。若所有产生式同时满足判断条件一或者同时满足判断条件二,则为3型文法进行输出。否则为2型文法进行输出。3、将文法以四元组形式输出函数output实现输出文法四元组形式的功能。具体思路为:a.将存放产生式的string类数组rule一分为二,用x数组存放rule中所有的大写字母即非终结符,用y数组存放rule中所有的小写字母即终结符。b.用双重
16、for循环给x和y数组中重复的字符标记,重复的字符全部赋值为“!”c.将x数组中非“!”元素赋值给非终结符集Vn,将y数组中非“!”元素赋值给终结符集Vt。d.按照格式分别输出非终结符集Vn,终结符集Vt,产生式P以及开始符S。五、实验小结我运用C++解决了此次实验的文法类型判断的问题,在实际解决问题的过程中,主要遇到了以下几个问题:1、文法类型的判断条件《编译原理》书本上给出了几类文法类型的定义,但是在实际的解决问题过程中,需要将书本上给的判断条件转换为C++语言中的判断条件,这