实验词法分析程序_第1页
实验词法分析程序_第2页
实验词法分析程序_第3页
实验词法分析程序_第4页
实验词法分析程序_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验1 词法分析程序一、实验目的与要求1. 复习正规文法、正规式、有限自动机之间的相互转换的原理及技术;2. 学会使用Visual C+等高级语言编程实现上述转换,并能合理显示结果;3. 以C+的一个真子集为案例,具体分析词法分析程序的设计步骤、基本架构及代码编制,并通过一定实例验证其可行性,以加深对词法分析原理的理解;4. 通过本次实验,使学生理解模块化程序设计的思想,从而从全局角度领会一个完整软件的设计精髓,为后续试验的顺利完成奠定坚实的基础。二、实验仪器及设备1. 微型电子计算机80台2. 配置Windows 2000及以上版本操作系统3. 安装Visual C+6.0/Visual C

2、#2000/Delphi6.0等以上版本的开发环境三、实验内容及步骤(一)正规文法与有限自动机的相互转换1正规文法 Þ 有限自动机已知某正规文法GS如下:SaASbBSAaBAbABaSBbAB请编程实现:(1) 将GS转换为NFA;(2) 将上述得到的NFA确定化为DFA;(3) 再将DFA最简化为MFA。2有限自动机 Þ 正规文法已知某有限自动机 NFA M=(Q,f,q0,Z)如下:状态集:Q=1,2,3,4,5,6,7,8,9字母表:=a,b转移函数:f(1,a)=5f(1,)=2f(1,a)=4f(5,)=6f(2,b)=3f(4,)=7f(6,)=2f(6,b)

3、=9f(3,)=8f(8,a)=9f(7,b)=9初态:q0=1终态集:Z=6,7,9请编程实现:(1) 首先将此NFA确定化为DFA;(2) 再将得到的DFA最简化为MFA;(3) 最后,将MFA转化为正规文法(左线性或右线性均可)。(二)编程实现MiniC+的词法分析这里的MiniC+为C+语言的一个真子集,其语法结构与C+类似。基本组成如下:(1) 关键字有18个,分别为:void、int、char、bool、float、double、if、else、switch、case、default、break、continue、do、while、for、return以及struct等。(2) 标

4、识符:定义为“以字母或下划线开头,由字母、数字或下划线组成的符号串。”(3) 常量:包括数字(暂时仅考虑无符号整数)、字符串、字符常量等。(4) 分隔符:( ) . , : ; ? # 等。(5) 运算符:=、=、>、>=、<、<=、!、!=、&&、&=、|、|=、+、+、- 、=、->、/、/=、%、%=等。要求同学们完成下述工作:1 基于上述描述,根据你的理解,尝试写出该MiniC+的文法GS;2 再根据你所写的文法GS,绘制出MiniC+的NFA状态图,并进而推导出最简化的MFA;3 根据你推导出的MFA,编写MiniC+的词法分析程

5、序,并用下面的源代码测试你所设计的程序。/测试函数调用,求N!int f(int a)if(a=1)a=1;else a=a*f(a-1);return a;void main()int i,a;cout<<"please input n =:"<<endl;cin>>i;a=f(i);cout<<"n! ="<<a;将程序输出的单词流与理论分析的结果比较分析,若有差错,请找出原因,并进一步修改你的程序,直至得到正确的结果。四、思考题1. 将实验内容(一)中的文法GS转化为正规式;2. 将实验内

6、容(一)中的有限自动机M转化为正规式。五、实验报告1. 实验报告撰写在统一配发的纸质报告册上,下次上课时交给老师。2. 实验报告格式如下。实验1 词法分析程序一、实验目的与要求二、实验仪器及设备三、实验内容1根据指导书要求,按顺序解答;2要求有结果,尤其是程序显示结果;3不需要附上源代码。四、思考题五、实验小结阐述实验中碰到的问题、解决的方法或技术、得到的结论、体会感触等。六、参考代码(一)CGrammar类1头文件Grammar.h#pragma warning(disable:4786)/屏蔽“由于string和vector等STL模版产生很长的标识符而引起的警告信息”#include&l

7、t;iostream>#include<iomanip>#include<string>#include<fstream>#include<vector>/使用vector容器#include <sstream>using namespace std;struct CreateFormula/ 产生式string LeftPart;/ 左部string RightPart;/ 右部;class CGrammarpublic:CGrammar();CGrammar();/外部操作函数:void SetGrammar(char *F

8、ilename);/ 根据文件内容设置文法产生式void DelDirectLeftRecursion(int i);/ 消除“直接”左递归bool DelIndirectLeftRecursion();/ 消除“间接”左递归bool HavingRedundance();/ 含有无用产生式void MiniGrammar();/ 文法化简void DisplayGrammar();/ 显示文法void DisplayGrammar(char *Filename);/ 将文法产生式保存在txt文件/返回文法属性的函数:int GetGrammarType();/ 返回文法类型bool GetH

9、avingLeftRecursion();/ 是否存在左递归vector<string>GetVN();/ 返回非终结符vector<string>GetVT();/ 返回终结符vector<CreateFormula>GetCF();/ 返回产生式数据string GetStartSign();/ 返回开始符号public:/基本函数:bool FindSign(string str,vector<string>&VnVt);/ 查找某符号串str是否属于VnVtvector<string> GetSingleSign(st

10、ring str);/分解字符串为单个符号(包括形式为E'的符号)private:void CountVn_and_Vt();/ 求非终结符和终结符集bool EnableDelLeftRecursion();/ 能否删除左递归void ExistDirectLeftRecursion();/ 含有“直接”左递归void ExistIndirectLeftRecursion();/ 含有“间接”左递归bool IS_0_Grammar();/ 识别0型文法bool IS_1_Grammar();/ 识别1型文法bool IS_2_Grammar();/ 识别2型文法bool IS_3_

11、Grammar();/ 识别3型文法void GrammarType();/ 判断文法类型string CreateNewVn(string vn);/ 构造新的非终结符protected:/ 文法结构vector<string>NoEndSign;/ 非终结符集vector<string>EndSign;/ 终结符集vector<CreateFormula>GR_Array;/ 产生式集合string StartSign;/ 开始符号int GrammarTypeNum;/ 文法类型号码private:int GR_Number;/ 产生式的总数bool

12、IsDirectLeftRecursion;/ 含有直接左递归的标识bool IsIndirectLeftRecursion;/ 含有间接左递归的标识;2实现文件Grammar.cpp#include "Grammar.h"#define KONG ""CGrammar:CGrammar()GR_Array.reserve(1000);/很重要,预先划分一块内存给vector使用GrammarTypeNum=-1;IsDirectLeftRecursion=false;IsIndirectLeftRecursion=false;CGrammar:CGra

13、mmar()/从txt文件中获取文法的产生式集合:/规则:不用简写;用“”连接;用“”表示空串;每行一条产生式。void CGrammar:SetGrammar(char *Filename)ifstream fin(Filename,ios:in);char line1024=0;int pos;CreateFormula temp;if(!GR_Array.empty()GR_Array.clear();/清空 while(fin.getline(line, sizeof(line)/下面的一段代码用于删除产生式中的所有空格:char templine200=""int

14、 i=0,j=0;while(linei)if(linei!=' '&&linei!=''&&linei!='')templinej=linei;j+;i+;templinej+1='0'/操作结束string s(templine);if(pos=s.find("")>=100)continue;temp.LeftPart=s.substr(0,pos);temp.RightPart =s.substr(pos+2,s.length()-pos);/""

15、;是汉字符号,所以“+2”GR_Array.push_back(temp);GR_Number=GR_Array.size();fin.clear();fin.close();/初始化操作:CountVn_and_Vt();/ 求非终结符集、终结符集GrammarType();/ 判断文法的分类类型ExistDirectLeftRecursion();/ 判断是否存在直接左递归ExistIndirectLeftRecursion();/ 判断是否存在间接左递归/ 将文法产生式保存在txt文件void CGrammar:DisplayGrammar(char *Filename)ofstream

16、 fout(Filename,ios:out);for(int i=0;i<GR_Array.size();i+) fout<<setw(2)<<left<<GR_Arrayi.LeftPart<<""<<left<<GR_Arrayi.RightPart<<endl; fout.clear();fout.close();/ 查找某符号串str是否属于某个容器VnVtbool CGrammar:FindSign(string str,vector<string>&V

17、nVt)for(int i=0;i<VnVt.size();i+) if(!(VnVpare(str)return true;return false;/求非终结符集Vn、终结符集Vtvoid CGrammar:CountVn_and_Vt()if(!NoEndSign.empty()NoEndSign.clear();if(!EndSign.empty()EndSign.clear(); for(int i=0;i<GR_Array.size();i+) /观察产生式的左部vector<string>strtemp=GetSingleSign(GR_Arr

18、ayi.LeftPart);/分解左部为单个符号for(int j=0;j<strtemp.size();j+)string tempvn=strtempj;if(tempvn0>='A'&&tempvn0<='Z')/若为大写字母则是非终结符if(!FindSign(tempvn,NoEndSign)/若是新的非终结符,则添加进去NoEndSign.push_back(tempvn);else /否则,则为终结符if(!FindSign(tempvn,EndSign)/若是新的终结符,则添加进去EndSign.push_bac

19、k(tempvn);/观察产生式的右部if(GR_Arrayi.RightPpare("")/若不是X形式,则/分解右部为单个符号vector<string>strtemp1=GetSingleSign(GR_Arrayi.RightPart);for(int k=0;k<strtemp1.size();k+)string tempvt=strtemp1k;if(!(tempvt0>='A'&&tempvt0<='Z')/若不是大写字母,则是终结符if(!FindSign(tempvt,EndSi

20、gn)/若是新的终结符,则添加进去EndSign.push_back(tempvt);else /否则,则为非终结符if(!FindSign(tempvt,NoEndSign)/若是新的终结符,则添加进去NoEndSign.push_back(tempvt);if(!NoEndSign.empty()StartSign=NoEndSign0;/ 文法开始符号默认为遇到的第一个非终结符/识别0型文法(所有产生式的左部含有非终结符):bool CGrammar:IS_0_Grammar()int CapitalNumInLeftPart;/某产生式左部的非终结符的数目,即大写字母数int coun

21、t=0;for(int i=0;i<GR_Array.size();i+)CapitalNumInLeftPart=0;for(int j=0;j<GR_Arrayi.LeftPart.length();j+) string temp3=GR_Arrayi.LeftPart.substr(j,1);if(FindSign(temp3,NoEndSign)CapitalNumInLeftPart+;if(CapitalNumInLeftPart<=0)return false;/表示当前产生式的左部没有非终结符,则直接终止return true;/是 0 型文法/识别1型文法(

22、即上下文有关文法,所有产生式的左部长度<=右部长度):bool CGrammar:IS_1_Grammar()for(int i=0;i<GR_Array.size();i+) if(GR_Arrayi.LeftPart.length()>GR_Arrayi.RightPart.length() /若左部大于右部,return false;return true;/识别2型文法(即上下文无关文法:左部长度=1,且左部为非终结符Vn)bool CGrammar:IS_2_Grammar()for(int i=0;i<GR_Array.size();i+)if(GR_Arr

23、ayi.LeftPart.length()!=1)/若左部长度不为1return false;string temp4=GR_Arrayi.LeftPart.substr(0,1);if(!FindSign(temp4,NoEndSign)return false;return true;/识别3型文法(即正规文法,分为右线性、左线性)bool CGrammar:IS_3_Grammar()int Flag1=0,Flag2=0;/分别代表右线性AaB、左线性ABa的个数for(int i=0;i<GR_Array.size();i+)if(GR_Arrayi.RightPart.len

24、gth()=1)/右部字符个数等于1,string temp1=GR_Arrayi.RightPart.substr(0,1);/取右部字符if(!FindSign(temp1,NoEndSign)&&!FindSign(temp1,EndSign)/ 若右部既不是终结符/,即不满足Aa形式,也不是非终结符,既不满足AB形式,则return false;else if(GR_Arrayi.RightPart.length()=2)/判断是否右线性AaB或左线性ABa形式if(GR_Arrayi.RightPpare("")/若不是X形式,则string te

25、mp2=GR_Arrayi.RightPart.substr(0,1);string temp3=GR_Arrayi.RightPart.substr(1,1);if(FindSign(temp2,EndSign)/ 若右部首字符是终结符&&FindSign(temp3,NoEndSign)/ 次首字符为非终结符,即AaBFlag1+;else if(FindSign(temp2,NoEndSign)/ 若右部首字符是非终结符&&FindSign(temp3,EndSign)/ 次首字符为终结符,即ABaFlag2+;elsereturn false;else

26、return false;if(Flag1>0&&Flag2>0)/同时含有右线性、左线性return false;elsereturn true;/判断文法的类型void CGrammar:GrammarType()GrammarTypeNum=-1;if(IS_0_Grammar()GrammarTypeNum=0;if(IS_1_Grammar()GrammarTypeNum=1;if(IS_2_Grammar()GrammarTypeNum=2;if(IS_3_Grammar()GrammarTypeNum=3;/ 判断是否含有“直接”左递归void CGr

27、ammar:ExistDirectLeftRecursion()for(int i=0;i<GR_Array.size();i+)string temp1=GR_Arrayi.LeftPart.substr(0,1);if(FindSign(temp1,NoEndSign)&&/若左部首字符为指定非终结符NoEndSigni,GR_Arrayi.LeftPart0=GR_Arrayi.RightPart0)/ ,且存在直接左递归IsDirectLeftRecursion=true;return;IsDirectLeftRecursion=false;/ 判断是否含有“间接

28、”左递归void CGrammar:ExistIndirectLeftRecursion()vector<CreateFormula>:iterator Iter1,Iter2;vector<CreateFormula>GR_ArrayTemp;/备份用:GR_ArrayTemp.reserve(1000);GR_ArrayTemp=GR_Array;/此处仅是判断是否存在左递归,/所有不能对原产生式进行破坏性操作,而只能对备份数据操作。for(int i=0;i<NoEndSign.size();i+)for(int j=0;j<i;j+)for(Iter

29、1=GR_ArrayTemp.begin();Iter1!=GR_ArrayTemp.end();Iter1+)string temp1=(*Iter1).LeftPart.substr(0,1);string temp2=(*Iter1).RightPart.substr(0,1);if(!pare(NoEndSigni)/左部首字符为Pi,&&!pare(NoEndSignj)/右部首字符为Pj,即形如PiPj/注:这里,是终结符,i、j是下标。/ 寻找所有形为:Pj.的产生式:for(Iter2=GR_ArrayTemp.begin();Iter2!=GR_ArrayTe

30、mp.end();Iter2+)string temp3=(*Iter2).LeftPart.substr(0,1);if(!pare(NoEndSignj)/若某产生式的左部为Pj,则替换,CreateFormula temp;temp=(*Iter1); temp.RightPart.replace(0,1,(*Iter2).RightPart);GR_ArrayTemp.push_back(temp);/当替换完成后,需要删除第k条产生式((*Iter1)),Iter1=GR_ArrayTemp.erase(Iter1);for(Iter1=GR_ArrayTemp.begin();It

31、er1!=GR_ArrayTemp.end();Iter1+)string temp1=(*Iter1).LeftPart.substr(0,1);if(FindSign(temp1,NoEndSign)&&/若左部首字符为指定非终结符NoEndSigni,(*Iter1).LeftPart0=(*Iter1).RightPart0)/ ,且存在直接左递归IsIndirectLeftRecursion=true;return ;IsIndirectLeftRecursion=false;/ 能否删除左递归bool CGrammar:EnableDelLeftRecursion(

32、)int Sum=GR_Array.size();for(int i=0;i<Sum;i+)/判断能否消除左递归 if(GR_Arrayi.LeftPart0=GR_Arrayi.RightPart0/ 若“左部首字符=右部首字符,”&&GR_Arrayi.RightPart.length()=1)/ “且右部长度=1”,即“满足PP回路”。/ 则再检查是否存在与PP有相同左部首字符、且右部首字符=的产生式,即P形式for(int j=0;j<Sum;j+)if(GR_Arrayj.LeftPart0=GR_Arrayi.LeftPart0/相同的左部首字符,&am

33、p;&GR_Arrayj.RightPart0='')/ 且右部首字符=return false;/若存在这样的情况,则无法消除左递归。退出!return true;/构造新的非终结符,例如“E”变换为“E'”:string CGrammar:CreateNewVn(string NoEndSigntemp)return NoEndSigntemp+'''/消除直接“左”递归void CGrammar:DelDirectLeftRecursion(int i)string c;vector<CreateFormula>:ite

34、rator Iter1,Iter2;/ 迭代器1for(Iter1=GR_Array.begin();Iter1!=GR_Array.end();Iter1+)string temp1=(*Iter1).LeftPart.substr(0,1);if(!pare(NoEndSigni)&&/若左部首字符为指定非终结符NoEndSigni,(*Iter1).LeftPart0=(*Iter1).RightPart0)/ ,且存在直接左递归/(1):修改产生式Pa为PaP'c=CreateNewVn(NoEndSigni);for(Iter2=GR_Array.begin(

35、);Iter2!=GR_Array.end();Iter2+)string temp2=(*Iter2).LeftPart.substr(0,1);if(!pare(NoEndSigni)&&/对于左部首字符同样=指定非终结符NoEndSigni,(*Iter2).LeftPart0!=(*Iter2).RightPart0)/但左部首字符不等于右部首字符,即不是左递归,例如Pa(*Iter2).RightPart+=c;/在右部尾端添补新的非终结符号,即:Pa变为PaP'/(2):对递归式(*Iter1)进行改造:(*Iter1).LeftPart=c;/左部变为新的

36、非终结符号c,即P'(*Iter1).RightPart=(*Iter1).RightPart.erase(0,1);/右部删除首字符,即“去除”原递归字符(*Iter1).RightPart+=c;/在右部尾端添加c,即P'/ 例如:PPa变为P'aP',即变为右递归。/(3):为文法增加一条空“”产生式:CreateFormula temp;temp.LeftPart=(*Iter1).LeftPart;temp.RightPart=""GR_Array.push_back(temp);/(4):将P'加入非终结符集:if(!Fi

37、ndSign(c,NoEndSign)NoEndSign.push_back(c);/消除间接“左”递归bool CGrammar:DelIndirectLeftRecursion()/首先判断能否消除左递归if(!EnableDelLeftRecursion()return false;vector<CreateFormula>:iterator Iter1,Iter2;for(int i=0;i<NoEndSign.size();i+)for(int j=0;j<i;j+)for(Iter1=GR_Array.begin();Iter1!=GR_Array.end(

38、);Iter1+)string temp1=(*Iter1).LeftPart.substr(0,1);string temp2=(*Iter1).RightPart.substr(0,1);if(!pare(NoEndSigni)/左部首字符为Pi,&&!pare(NoEndSignj)/右部首字符为Pj,即形如PiPj/注:这里,是终结符,i、j是下标。/ 寻找所有形为:Pj.的产生式:for(Iter2=GR_Array.begin();Iter2!=GR_Array.end();Iter2+)string temp3=(*Iter2).LeftPart.substr(0

39、,1);if(!pare(NoEndSignj)/若某产生式的左部为Pj,则替换,CreateFormula temp;temp=(*Iter1); temp.RightPart.replace(0,1,(*Iter2).RightPart);GR_Array.push_back(temp);/当替换完成后,需要删除第k条产生式((*Iter1)),Iter1=GR_Array.erase(Iter1);DelDirectLeftRecursion(i);/消除直接左递归GR_Number=GR_Array.size();return true;/判断是否含有多余产生式(规则)/ 多余规则(即

40、无用产生式)满足下述条件:/(1)每一个非终结符号A(S除外)必须在某句型中(规则右端)出现,/ 即若某条规则左部的非终结符A不在任何其他规则右部出现,/ 那么所有的推导始终不会用到此规则,也就是说A是“不可到达”的。/ (2)非终结符A必须推出终结符串t来。否则在推导句子的过程中,/ 一旦使用了该规则,将推不出任何终结符号串,称为“不可终止”的。bool CGrammar:HavingRedundance()vector<string>NoEndSignTemp;/保存能由开始符号到达的非终结符的集合vector<string>:iterator Iter1,Iter

41、3;/ 迭代器vector<CreateFormula>:iterator Iter2;/ 迭代器/第(1)种情况:删除“不可达”产生式NoEndSignTemp.reserve(1000);/为NoEndSignTemp与分配存储空间,否则可能出错。/(A)求解能由开始符号到达的非终结符的集合:NoEndSignTemp.push_back(GR_Array0.LeftPart);for(Iter1=NoEndSignTemp.begin();Iter1!=NoEndSignTemp.end();Iter1+) for(Iter2=GR_Array.begin();Iter2!=

42、GR_Array.end();Iter2+)if(NoEndSign=NoEndSignTemp) return false;if(!(*Iter2).LeftPpare(*Iter1)for(Iter3=NoEndSign.begin();Iter3!=NoEndSign.end();Iter3+)int L=(*Iter2).RightPart.length();if(*Iter2).RightPart.find(*Iter3)<L)/如果某产生式的右部含有非终结符*Iter3/,且该非终结符*Iter3不在NoEndSignTemp中,则if(!FindSign(*Iter3,No

43、EndSignTemp)NoEndSignTemp.push_back(*Iter3);/ 添加到NoEndSignTemp中/(B)删除不能由开始符号到达的非终结符引导的产生式:for(Iter3=NoEndSign.begin();Iter3!=NoEndSign.end();Iter3+)if(!FindSign(*Iter3,NoEndSignTemp)/若非终结符*Iter3不在NoEndSignTemp中,则return true;return false;/文法化简,即删除无用产生式。void CGrammar:MiniGrammar()vector<string>N

44、oEndSignTemp;/保存能由开始符号到达的非终结符的集合vector<string>:iterator Iter1,Iter3;/ 迭代器vector<CreateFormula>:iterator Iter2;/ 迭代器/第(1)种情况:删除“不可达”产生式NoEndSignTemp.reserve(1000);/为NoEndSignTemp与分配存储空间,否则可能出错。/(A)求解能由开始符号到达的非终结符的集合:NoEndSignTemp.push_back(GR_Array0.LeftPart);for(Iter1=NoEndSignTemp.begin

45、();Iter1!=NoEndSignTemp.end();Iter1+) for(Iter2=GR_Array.begin();Iter2!=GR_Array.end();Iter2+)if(NoEndSign=NoEndSignTemp) return;if(!(*Iter2).LeftPpare(*Iter1)for(Iter3=NoEndSign.begin();Iter3!=NoEndSign.end();Iter3+)int L=(*Iter2).RightPart.length();if(*Iter2).RightPart.find(*Iter3)<L)/如果某产生式的右部

46、含有非终结符*Iter3/,且该非终结符*Iter3不在NoEndSignTemp中,则if(!FindSign(*Iter3,NoEndSignTemp)NoEndSignTemp.push_back(*Iter3);/ 添加到NoEndSignTemp中/(B)删除不能由开始符号到达的非终结符引导的产生式:for(Iter3=NoEndSign.begin();Iter3!=NoEndSign.end();Iter3+)if(!FindSign(*Iter3,NoEndSignTemp)/若非终结符*Iter3不在NoEndSignTemp中,则/删除所有左部为*Iter3的产生式:for

47、(Iter2=GR_Array.begin();Iter2!=GR_Array.end();Iter2+)if(!(*Iter2).LeftPpare(*Iter3)Iter2=GR_Array.erase(Iter2);/分解字符串为单个符号(包括形式为E'的符号)vector<string> CGrammar:GetSingleSign(string str)vector<string> temp1;for(int i=0;i<str.length();i+)string temp2=str.substr(i,1);if(i<str.length

48、()&&stri+1=''')temp2+=str+i;temp1.push_back(temp2); return temp1;/显示文法(四元组形式)void CGrammar:DisplayGrammar()int sum=NoEndSign.size(),i;/显示开始符号cout<<"G"<<StartSign<<"=("/显示非终结符cout<<NoEndSign0;for(i=1;i<sum;i+)cout<<","

49、cout<<NoEndSigni;cout<<","/显示终结符sum=EndSign.size(); cout<<EndSign0;for(i=1;i<sum;i+)cout<<","cout<<EndSigni;cout<<",P,"<<NoEndSign0<<"),其中P由下列产生式组成:"<<endl;/显示产生式集合:vector<CreateFormula>:iterator I

50、ter1;for(Iter1=GR_Array.begin();Iter1!=GR_Array.end();Iter1+) cout<<""<<setw(2)<<left<<(*Iter1).LeftPart<<" " <<setw(20)<<left<<(*Iter1).RightPart<<endl;/返回文法类型int CGrammar:GetGrammarType()return GrammarTypeNum;/返回是否存在左递归的标识bo

51、ol CGrammar:GetHavingLeftRecursion()return IsDirectLeftRecursion|IsIndirectLeftRecursion;/返回非终结符vector<string>CGrammar:GetVN()return NoEndSign;/返回终结符vector<string>CGrammar:GetVT()return EndSign;/ 返回产生式数据vector<CreateFormula>CGrammar:GetCF()return GR_Array;/ 返回开始符号string CGrammar:GetStartSign()return StartSign;(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论