ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:21.20KB ,
资源ID:6787771      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6787771.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(LL1文法源代码.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

LL1文法源代码.docx

1、LL1文法源代码/* /LL(1)分析法 /编译环境:g+ /语言:C+ /* #include #include #include #include using namespace std; /* class Grammar public: Grammar(); Grammar(const Grammar&);/复制构造函数 Grammar& operator =(const Grammar&);/赋值函数 friend ostream& operator(ostream& output,const Grammar& rs)/输出文法 output结 终 符:rs.zhongendl; ou

2、tput非结终符:rs.feiendl; output文法内容(共rs.number条):endl; int i=0; while(irs.number)/显示文法内容 outputrs.contenti+endl; output*endl; output非终结符ttFIRST集合ttFOLLOW集合endl; for(unsigned int j=0;jrs.fei.size();j+) coutrs.feijtttrs.firstjtttrs.followjendl; output*endl; output预测分析表:endlt; for(unsigned int j=0;jrs.zhon

3、g.size();j+) outputrs.zhongjt;/显示终结符 output#endl; for(unsigned int j=0;jrs.fei.size();j+) outputrs.feijt;/显示非终结符 /开始显示内容 for(unsigned int k=0;k=rs.zhong.size();k+) coutrs.tablejkt; output(istream& input,Grammar& rs)/输入文法 unsigned int j=0; /cout请输入文法:endl; /cout,每一句一行,最后一行请以#开头,使用表示!每一行一条文法句。)endl; c

4、har filename255; coutfilename; ifstream infile(filename,ios:in); if(!infile) cout无法打开文件!rs.end; /inputrs.end; rs.contentj+=rs.end; if(infile.eof() break; while(i=A&rs.endi=Z) rs.fei.append(1,rs.endi); else rs.zhong.append(1,rs.endi); i+; rs.number=j-1;/记录文法长度 if(rs.Check()=0) system(pause); exit(0);

5、 rs.Checkstr(rs.fei); rs.Checkstr(rs.zhong); rs.Checkstr(rs.fei); rs.Checkstr(rs.zhong); /* rs.Checkstr(rs.fei); rs.Checkstr(rs.zhong); rs.Checkstr(rs.fei); rs.Checkstr(rs.zhong); */ rs.FirstAndFollow(); rs.CreateTable(); return input; int Findid(char);/在文法中查找某个非终结符 int Check();/检查文法的正确性 string Chec

6、kstr(string&);/去除字符串中重复字符 string Delchar(char,string);/去除字符中某个字符 int Findchar(char,string);/查找字符中是否存在某个字符:可用string:find(.) int StrNum(const string&);/计算字符串有多少个产生式 char RandChar();/随机产生一个大写字母,为非终结符 string GetSub(int,const string&,char);/获取第N个产生式右部 Grammar& DelLeft(int);/消除文法句子的直接左递归 Grammar& DelSL();

7、/消除文法句子的左递归 string First(char);/计算某个非终结符的FIRST集合 string First(const string&);/计算某个字符串的FIRST集合 string Follow(char);/计算某个非终结符的FOLLOW集合 Grammar& FirstAndFollow();/存储所有非终符的FIRST集合和FOLLOW集合 Grammar& CreateTable();/建立预测分析表 Grammar(); /* char Pop();/出栈 int Next(char,char);/匹配动作 char Top();/获取分析栈栈顶元素 char I

8、p();/获取输入栈当前元素 Grammar& Push(const string&);/进栈 int Display();/输出分析结果 /* private: int number;/文法长度 string zhong;/终结符 string fei;/非终结符 string *content;/文法内容 string end;/记录输入的最后一行 string *first;/文法的FIRST集合 string *follow;/文法的FOLLOW集合 string *table;/文法的预测分析表 /* string stack;/分析栈 string instack;/输入栈 /*

9、; Grammar:Grammar() /初始化指针 content=new string255; first=new string255; follow=new string255; table=new string *255; /初始化指针完毕 Grammar:Grammar(const Grammar& rs)/复制构造函数 zhong=rs.zhong; fei=rs.fei; end=rs.end; number=rs.number; content=new string255; first=new string255; follow=new string255; table=new

10、 string *255; for(int i=0;i=number;i+) contenti=rs.contenti; FirstAndFollow(); CreateTable(); Grammar& Grammar:operator =(const Grammar& rs)/赋值函数 zhong=rs.zhong; fei=rs.fei; end=rs.end; number=rs.number; content=new string255; first=new string255; follow=new string255; table=new string *255; for(int

11、 i=0;i=number;i+) contenti=rs.contenti; FirstAndFollow(); CreateTable(); return *this; int Grammar:Findid(char a)/在文法中查找某个非终结符 int i=0; while(inumber) if(contenti0=a) return i; i+; return -1; char Grammar:RandChar()/随机产生一个大写字母,为非终结符 switch(rand()%25) case 0:return A; case 1:return B; case 2:return C

12、; case 3:return D; case 4:return E; case 5:return F; case 6:return G; case 7:return H; case 8:return I; case 9:return J; case 10:return K; case 11:return L; case 12:return M; case 13:return N; case 14:return O; case 15:return P; case 16:return Q; case 17:return R; case 18:return S; case 19:return T;

13、 case 20:return U; case 21:return V; case 22:return W; case 23:return X; case 24:return Y; case 25:return Z; return Z; int Grammar:Check()/检查文法的正确性 unsigned int j=0; int i=0; while(jfei.size()/保证每个非终结符都使用推导 int sig=1; i=0; while(inumber) if(contenti+0=feij) sig=1; break; sig=-1; if(sig=-1) cout非终结符f

14、eij未使用推导!endl; return 0; j+; DelSL();/消除文法左递归 i=0; while(inumber) if(contenti.size()=3) cout文法句contenti长度不对!) cout文法句contenti! /验证文法是否有直接左递归 int n=StrNum(contenti); int s=0;/记录是否有直接左递归 char z=contenti0;/获得产生式左部非终结符 int m=0;/记录直接左递归个数 for(int k=1;k=n;k+) string tmp=GetSub(k,contenti,|); if(z=tmp0) s=

15、1; m+; if(m=n) cout文法句contenti将形成无穷推导!Ac|Ab if(s=1)/有直接左递归 DelLeft(i); i+; j=0; while(jfei.size()/保证修改后的每个非终结符都使用推导 int sig=1; i=0; while(inumber) if(contenti+0=feij) sig=1; break; sig=-1; if(sig=-1) cout非终结符feij未使用推导!endl; return 0; j+; return 1; Grammar& Grammar:DelSL()/消除文法左递归 /课本算法3.2(60页) for(u

16、nsigned int i=1;ifei.size();i+)/for i in 2.n /loop for(unsigned int j=0;j. int Ain=StrNum(Aistr);/获取Ai-.的产生式数 string Ainew;/用于记录更改后的文法句子 Ainew+=Ai; Ainew+=-; for(int k=1;kAj string Ajstr=contentj;/获取Aj-. int Ajn=StrNum(Ajstr);/获取Aj-.的产生式数 for(int w=1;w=Ajn;w+)/插入Aj的每一个产生式 string Ajtmp=GetSub(w,Ajstr,|); string Aitmp=Aitemp;/用于操作 Aitmp.replace(0,1,Ajtmp);/删除第一个字母后再插入Ajtmp字符串形成新串 Ait+=Aitmp;/插入Aj的每一个产生式 Ait+=|; Ait.erase(Ait.size()-1,1);/删除最后一个|字符 else Ait=Aitemp; Ainew+=Ait; Ainew+=|; Ainew.erase(Ainew.size()-1,1);/删除最后一个|字符 if(Ainew!=Aistr) /如果不相同则更新,否则没有必要更新 contenti=Ainew;/更新 /end loop

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

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