版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译原理课程设计报告slr(1)分析的实现学 院 计算机科学与技术 专 业 计算机科学与技术 学 号 学 生 姓 名 指导教师姓名 2015年12月 26日目录1设计的目的与内容11.1课程设计的目的11.2设计内容11.3设计要求11.4理论基础12算法的基本思想22.1主要功能函数22.2算法思想3slr文法构造分析表的主要思想:3解决冲突的方法:3slr语法分析表的构造方法:43主要功能模块流程图53.1主函数功能流程图54系统测试65 结论11附录 程序源码清单121 设计的目的与内容1.1课程设计的目的编译原理课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本
2、上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。 l 进一步巩固和复习编译原理的基础知识。 l 培养学生结构化程序、模块化程序设计的方法和能力。 l 提高学生对于编程语言原理的理解能力。l 加深学生对于编程语言实现手段的印象。1.2设计内容构造lr(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解lr(k)分析方法是严格的从左向右扫描,和自底向上的语法分析方法。1.3设计要求1) slr(1)分析表的生成可以选择编程序生成,也可选择手动生成;2) 程序要求要配合适当的错误处理机制;3) 要打印句子的文法分析过程。1.4理论基础由于大多数适用的程序设
3、计语言的文法不能满足lr(0)文法的条件,即使是描述一个实数变量说明这样简单的文法也不一定是lr(0)文法。因此对于lr(0)规范族中有冲突的项目集(状态)用向前查看一个符号的办法进行处理,以解决冲突。这种办法将能满足一些文法的需要,因为只对有冲突的状态才向前查看一个符号,以确定做那种动作,因而称这种分析方法为简单的lr(1)分析法,用slr(1)表示。2算法的基本思想2.1主要功能函数class wf wf(char s1, char s2, int x, int y) wf(const string& s1, const string& s2, int x, int y) bool ope
4、rator (const wf& a) const bool operator = (const wf& a) const void print();class closure void print(string str) bool operator = (const closure& a) const;void make_item()void dfs(const string& x)void make_first()void append(const string& str1, const string& str2)bool _check(const vector& id, const st
5、ring str)void make_follow()void make_set()void make_v()void make_cmp(vector& cmp1, int i, char ch)void make_go()void make_table()void print(string s1, string s2, string s3, string s4, string s5, string s6, string s7)string get_steps(int x)string get_stk(vector stk)string get_shift(wf& temp)void anal
6、yse(string src)2.2算法思想slr文法构造分析表的主要思想:许多冲突性的动作都可能通过考察有关非终结符的follow集而获解决。 解决冲突的方法:解决冲突的方法是分析所有含a和b的句型,考察集合follow(a)和follow(b),如果这两个集合不相交,而且也不包含b,那么当状态i面临输入符号a时,我们可以使用如下策略:若a=b,则移进。若afollow(a),则用产生式a进行归约;若afollow(b),则用产生式b进行归约;此外,报错* slr的基本算法:假定lr(0)规范族的一个项目集i中含有m个移进项目 a1a11,a2a22,amamm; 同时含有n个归约项目 b1
7、,b2,b3,如果集合 a1, am,follow(b1),follow(bn)两两不相交(包括不得有两个follow集合有#),则隐含在i中的动作冲突可以通过检查现行输入符号a属于上述n+1个集合中的哪个集合而活的解决: 若a是某个ai,i=1,2,m,则移进。若afollow(bi),i=1,2,m,则用产生式bi进行归约;此外,报错这种冲突的解决方法叫做slr(1)解决办法。slr语法分析表的构造方法: 首先把g拓广为g,对g构造lr(0)项目集规范族c和活前缀识别自动机的状态转换函数go。函数action和goto可按如下方法构造:若项目ab属于ik,go(ik,a)= ij,a为终结
8、符,置actionk,a为“把状态j和符号a移进栈”,简记为“sj”;若项目a属于ik,那么,对任何非终结符a,afollow(a),置actionk,a为“用产生式a进行归约”,简记为“rj”;其中,假定a为文法g的第j个产生式若项目ss属于ik,则置actionk,#为可“接受”,简记为“acc”;若go(ik, a)= ij,a为非终结符,则置gotok, a=j;分析表中凡不能用规则1至4填入信息的空白格均填上“出错标志”。 语法分析器的初始状态是包含s s的项目集合的状态 slr解决的冲突只是移进-规约冲突和规约-规约冲突3主要功能模块流程图出错接受产生follow合集产生first
9、合集产生项目表输入分析串wf开始(初始化分析表及栈)3.1主函数功能流程图退出程序,并告知用户分析结果构造lr(0)分析表图3.1 程序主要流程4系统测试图4.1 输入图4.2 项目表图4.3 first集图4.4 follow集图4.5 closure表图4.6 edge表图4.7 lr(0)表图4.8 文法分析步骤5 结论lr分析法是一种自下而上进行规范归约的语法分析方法。这里l是指从左到右扫描输入符号串。r是指构造最右推倒的逆工程。这种分析法比递归下降分析法、预测分析法和算符优先分析法对文法的限制要少得多。附录 程序源码清单#include #include #include #incl
10、ude #include #include #include #include #include #include #include #define max 507/#define debugusing namespace std;#pragma warning(disable:4996)class wfpublic: string left, right; int back; int id; wf(char s1, char s2, int x, int y) left = s1; right = s2; back = x; id = y; wf(const string& s1, cons
11、t string& s2, int x, int y) left = s1; right = s2; back = x; id = y; bool operator (const wf& a) const if (left = a.left) return right a.right; return left %sn, left.c_str(), right.c_str(); ;class closurepublic: vector element; void print(string str) printf(%-15s%-15sn, , str.c_str(); for (int i = 0
12、; i element.size(); i+) elementi.print(); bool operator = (const closure& a) const if (a.element.size() != element.size() return false; for (int i = 0; i a.element.size(); i+) if (elementi = a.elementi) continue; else return false; return true; ;struct content int type; int num; string out; content(
13、) type = -1; content(int a, int b) :type(a), num(b) ;vector wf;mapstring, vector dic;mapstring, vector vn_set;map vis;string start = s;vector collection;vector items;char ch = $;int gomaxmax;int tomax;vector v;bool usedmax;content actionmaxmax;int gotomaxmax;mapstring, set first;mapstring, set follo
14、w;void make_item() memset(to, -1, sizeof(-1); for (int i = 0; i wf.size(); i+) vn_setwfi.left.push_back(i); for (int i = 0; i wf.size(); i+) for (int j = 0; j = wfi.right.length(); j+) string temp = wfi.right; temp.insert(temp.begin() + j, ch); dicwfi.left.push_back(items.size(); if (j) toitems.size
15、() - 1 = items.size(); items.push_back(wf(wfi.left, temp, i, items.size(); #ifdef debug puts(-项目表-); for (int i = 0; i %s back:%d id:%dn, itemsi.left.c_str(), itemsi.right.c_str(), itemsi.back, itemsi.id); puts(-);#endifvoid dfs(const string& x) if (visx) return; visx = 1; vector& id = vn_setx; for
16、(int i = 0; i id.size(); i+) string& left = wfidi.left; string& right = wfidi.right; for (int j = 0; j right.length(); j+) if (isupper(rightj) dfs(right.substr(j, 1); set& temp = firstright.substr(j, 1); set:iterator it = temp.begin(); bool flag = true; for (; it != temp.end(); it+) if (*it = ) flag
17、 = false; firstleft.insert(*it); if (flag) break; else firstleft.insert(rightj); break; void make_first() vis.clear(); mapstring, vector :iterator it2 = dic.begin(); for (; it2 != dic.end(); it2+) if (visit2-first) continue; else dfs(it2-first);#ifdef debug puts(*first集*); mapstring, set :iterator i
18、t = first.begin(); for (; it != first.end(); it+) printf(first(%s)=, it-first.c_str(); set & temp = it-second; set:iterator it1 = temp.begin(); bool flag = false; for (; it1 != temp.end(); it1+) if (flag) printf(,); printf(%c, *it1); flag = true; puts(); #endif void append(const string& str1, const
19、string& str2) set& from = followstr1; set& to = followstr2; set:iterator it = from.begin(); for (; it != from.end(); it+) to.insert(*it);bool _check(const vector& id, const string str) for (int i = 0; i id.size(); i+) int x = idi; if (wfx.right = str) return true; return false;void make_follow() whi
20、le (true) bool goon = false; mapstring, vector :iterator it2 = vn_set.begin(); for (; it2 != vn_set.end(); it2+) vector& id = it2-second; for (int i = 0; i = 0; j-) if (isupper(rightj) if (flag) int tx = followright.substr(j, 1).size(); append(left, right.substr(j, 1); int tx1 = followright.substr(j
21、, 1).size(); if (tx1 tx) goon = true; if (_check(id, ) flag = false; for (int k = j + 1; k right.length(); k+) if (isupper(rightk) string idd = right.substr(k, 1); set& from = firstidd; set& to = followright.substr(j, 1); set:iterator it1 = from.begin(); int tx = followright.substr(j, 1).size(); for
22、 (; it1 != from.end(); it1+) if (*it1 != ) to.insert(*it1); int tx1 = followright.substr(j, 1).size(); if (tx1 tx) goon = true; if (_check(id, ) break; else int tx = followright.substr(j, 1).size(); followright.substr(j, 1).insert(rightk); int tx1 = followright.substr(j, 1).size(); if (tx1 tx) goon
23、= true; break; else flag = false; if (!goon) break; #ifdef debug puts(*follow集*); mapstring, set :iterator it = follow.begin(); for (; it != follow.end(); it+) printf(follow(%s)=, it-first.c_str(); set & temp = it-second; temp.insert(#); set:iterator it1 = temp.begin(); bool flag = false; for (; it1
24、 != temp.end(); it1+) if (flag) printf(,); printf(%c, *it1); flag = true; puts(); #endifvoid make_set() bool hasmax; for (int i = 0; i items.size(); i+) if (itemsi.left0 = s & itemsi.right0 = ch) closure temp; string& str = itemsi.right; vector& element = temp.element; element.push_back(itemsi); siz
25、e_t x = 0; for (x = 0; x str.length(); x+) if (strx = ch) break; memset(has, 0, sizeof(has); hasi = 1; if (x != str.length() - 1) queue q; q.push(str.substr(x + 1, 1); while (!q.empty() string u = q.front(); q.pop(); vector& id = dicu; for (size_t j = 0; j id.size(); j+) int tx = idj; if (itemstx.ri
26、ght0 = ch) if (hastx) continue; hastx = 1; if (isupper(itemstx.right1) q.push(itemstx.right.substr(1, 1); element.push_back(itemstx); collection.push_back(temp); for (size_t i = 0; i collection.size(); i+) map temp; for (size_t j = 0; j collectioni.element.size(); j+) string str = collectioni.elemen
27、tj.right; size_t x = 0; for (; x str.length(); x+) if (strx = ch) break; if (x = str.length() - 1) continue; int y = strx + 1; int ii; str.erase(str.begin() + x); str.insert(str.begin() + x + 1, ch); wf cmp = wf(collectioni.elementj.left, str, -1, -1); for (size_t k = 0; k items.size(); k+) if (item
28、sk = cmp) ii = k; break; memset(has, 0, sizeof(has); vector& element = tempy.element; element.push_back(itemsii); hasii = 1; x+; if (x != str.length() - 1) queue q; q.push(str.substr(x + 1, 1); while (!q.empty() string u = q.front(); q.pop(); vector& id = dicu; for (size_t j = 0; j id.size(); j+) in
29、t tx = idj; if (itemstx.right0 = ch) if (hastx) continue; hastx = 1; if (isupper(itemstx.right1) q.push(itemstx.right.substr(1, 1); element.push_back(itemstx); map:iterator it = temp.begin(); for (; it != temp.end(); it+) collection.push_back(it-second); for (size_t i = 0; i collection.size(); i+) s
30、ort(collectioni.element.begin(), collectioni.element.end(); for (size_t i = 0; i collection.size(); i+) for (size_t j = i + 1; j collection.size(); j+) if (collectioni = collectionj) collection.erase(collection.begin() + j); #ifdef debug puts(-closure-); stringstream sin; for (size_t i = 0; i collec
31、tion.size(); i+) sin.clear(); string out; sin closure-i out; collectioni.print(out); puts();#endif void make_v() memset(used, 0, sizeof(used); for (size_t i = 0; i wf.size(); i+) string& str = wfi.left; for (size_t j = 0; j str.length(); j+) if (usedstrj) continue; usedstrj = 1; v.push_back(strj); s
32、tring& str1 = wfi.right; for (size_t j = 0; j str1.length(); j+) if (usedstr1j) continue; usedstr1j = 1; v.push_back(str1j); sort(v.begin(), v.end(); v.push_back(#);void make_cmp(vector& cmp1, int i, char ch) for (size_t j = 0; j collectioni.element.size(); j+) string str = collectioni.elementj.righ
33、t; size_t k; for (k = 0; k str.length(); k+) if (strk = ch) break; if (k != str.length() - 1 & strk + 1 = ch) str.erase(str.begin() + k); str.insert(str.begin() + k + 1, ch); cmp1.push_back(wf(collectioni.elementj.left, str, -1, -1); sort(cmp1.begin(), cmp1.end();void make_go() memset(go, -1, sizeof
34、(go); int m = collection.size(); for (size_t t = 0; t v.size(); t+) char ch = vt; for (int i = 0; i m; i+) vector cmp1; make_cmp(cmp1, i, ch);#ifdef debug cout cmp1.size() endl;#endif if (cmp1.size() = 0) continue; for (int j = 0; j m; j+) vector cmp2; for (size_t k = 0; k collectionj.element.size(); k+) string& str = collectionj.elementk.right; size_t x; for (x = 0; x str.length(); x+) if (strx = ch) break; if (x & strx - 1 = ch
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年浙江省慈溪市高一化学上册期末考试模拟测试卷及参考答案
- 济南市市中区2025届数学三下期中复习检测模拟试题含解析
- 道路运输调度员操作知识评优考核试卷含答案
- 漆器彩绘雕填工岗前岗位考核试卷含答案
- 塑料压延工成果转化模拟考核试卷含答案
- 废旧电池及电池系统处置员岗前操作能力考核试卷含答案
- 电力电容器心体加工工安全素养竞赛考核试卷含答案
- 环丁砜装置操作工岗中创新思维考核试卷含答案
- 蒸化机挡车工诚信道德考核试卷含答案
- 工业固体废物处理处置工岗中知识水平考核试卷含答案
- 山东省菏泽市菏泽经济技术开发区2026-2027学年七年级上学期10月阶段检测语文试题(含答案)
- 江西新华发行集团有限公司赣州市分公司2026年公开招聘工作人员笔试参考题库及答案解析
- 2026年成人高考专升本政治真题试卷及完整答案解析(官方标准)
- 2026年江苏盐城市中考物理试题(含解析)
- 2026年大学试题(管理类)-港口规划与布置历年参考题库含答案解析
- 2026年道德与法治四年级上册第5课《生命最宝贵》教案设计(2课时)
- 律所安全生产责任制度
- GB/T 19054-2025燃油式火化机通用技术条件
- 汽车散热器制造工艺流程
- 2025-2026学年人教版(2024)数学七年级上册期中测试卷
- 《诗经》诗经全文
评论
0/150
提交评论