




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验四 LR(k)分析器设计一、实验目的 (1)掌握下推机这一数学模型的结构和理论,并深刻理解下推自动机在LR分析法中的应用(即LR分析器)。 (2)掌握LR分析法的思想,学会特定分析表的构造方法,利用给出的分析表进行LR分析。二、实验内容根据课堂讲授的形式化算法,编制程序实现对以下语法进行自底向上语法分析的LR分析器,设计分析表,对给出的输入语句进行语法分析,判断是否符合相应的文法要求。Program blockblock stmts stmts stmt stmts | estmt id = E ; | while ( bool ) stmt | blockbool E = EE E + T | T T id | num输入语句:三、实验要求要求实现以下功能:a)设计分析表和语句的输入;b)要实现通用的LR分析思想的源代码;c)输出对语句的语法分析判断结果,如果可能给出错误的信息提示。四、实现方法根据课本的LR分析器模型和LR分析算法,完成LR分析。对要求中的错误信息提示,指的是对应分析表中的空白处,每一个空白的地方都应该有对应的错误情况,因而有相应的错误信息。注意这里的语法分析,是在词法分析的基础上进行的。五、识别活前缀的DFA六、SLR(1)分析表 Program - block Block - stmts Stmts - stmt stmts Stmts - eps Stmt - id = E; Stmt - while ( bool ) stmt Stmt - block Bool - E E = E E - E + T E - T T - id T - numFOLLOW(program) = #FOLLOW(block) = #, , id, while, FOLLOW(stmts) = FOLLOW(stmt) = , id, while, FOLLOW(bool) = )FOLLOW(E) = =, +, ;, )FOLLOW(T) = =, +, ;, )七、主要代码#ifndef LRANALYZER_H#define LRANALYZER_H#include #include #include #include #include Automation.hclass LRAnalyzer : public QObject Q_OBJECTpublic: explicit LRAnalyzer(QObject *parent = 0); bool begin(QString, QTableWidget *); bool loadTable(QString);private: Automation *lex; QString table3030; QMap trans; QMap trans2; int deriveArg30; int deriveLeft30;#endif / LRANALYZER_H#include LRAnalyzer.hLRAnalyzer:LRAnalyzer(QObject *parent) : QObject(parent) lex = new Automation; lex-addKeyword(while); / 2000 lex-addToken(+); / 1000 lex-addToken(=); / 1001 lex-addToken(addToken(=); / 1003 lex-addToken(); / 1004 lex-addToken(); / 1005 lex-addToken(); / 1006 lex-addToken(); / 1007 lex-addToken(;); / 1008 lex-addToken(#); / 1009 trans.insert(1004, 0); trans2.insert(1004, ); trans.insert(1005, 1); trans2.insert(1005, ); trans.insert(1006, 2); trans2.insert(1006, (); trans.insert(1007, 3); trans2.insert(1007, ); trans.insert(1000, 4); trans2.insert(1000, +); trans.insert(1001, 5); trans2.insert(1001, =); trans.insert(1002, 6); trans2.insert(1002, =); trans.insert(1008, 8); trans2.insert(1008, ;); trans.insert(3000, 9); trans2.insert(3000, id); trans.insert(3001, 10); trans2.insert(3001, num); trans.insert(2000, 11); trans2.insert(2000, while); trans.insert(1009, 12); trans2.insert(1009, #); trans.insert(4001, 13); trans2.insert(4001, block); / block trans.insert(4002, 14); trans2.insert(4002, stmts); / stmts trans.insert(4003, 15); trans2.insert(4003, stmt); / stmt trans.insert(4004, 16); trans2.insert(4004, bool); / bool trans.insert(4005, 17); trans2.insert(4005, E); / E trans.insert(4006, 18); trans2.insert(4006, T); / T /* 1Program - block 2Block - stmts 3Stmts - stmt stmts 4Stmts - eps 5Stmt - id = E; 6Stmt - while ( bool ) stmt 7Stmt - block 8Bool - E E = E 10E - E + T 11E - T 12T - id 13T - num */ deriveArg1 = 1; deriveArg2 = 3; deriveArg3 = 2; deriveArg4 = 0; deriveArg5 = 4; deriveArg6 = 5; deriveArg7 = 1; deriveArg8 = 3; deriveArg9 = 3; deriveArg10 = 3; deriveArg11 = 1; deriveArg12 = 1; deriveArg13 = 1; deriveLeft2 = 4001; deriveLeft3 = 4002; deriveLeft4 = 4002; deriveLeft5 = 4003; deriveLeft6 = 4003; deriveLeft7 = 4003; deriveLeft8 = 4004; deriveLeft9 = 4004; deriveLeft10 = 4005; deriveLeft11 = 4005; deriveLeft12 = 4006; deriveLeft13 = 4006;bool LRAnalyzer:loadTable(QString filePath) if (!freopen(filePath.toLatin1(), r, stdin) return false; char buf256; int line = 0; while (gets(buf) int pos = 0, cnt = 0; while (bufpos) if (bufpos = t) cnt+, pos+; else while (bufpos != t & bufpos != 0) tablelinecnt.append(bufpos+); line+; return true;bool LRAnalyzer:begin(QString src, QTableWidget *w) src.append(#); lex-begin(src); MatchResult rlt; QStack state; QStack optr; state.push(0); optr.push(1009); while (rlt = lex-match(), rlt.type != 0) analyze: QString s = tablestate.top()transrlt.type; w-setRowCount(w-rowCount() + 1); w-setItem(w-rowCount() - 1, 0, new QTableWidgetItem(QString(%1).arg(w-rowCount(); QString temp; for (QStack:iterator it = state.begin(); it != state.end(); it+) temp.append(QString(%1 ).arg(*it); w-setItem(w-rowCount() - 1, 1, new QTableWidgetItem(temp); temp.clear(); for (QStack:iterator it = optr.begin(); it != optr.end(); it+) temp.append(QString(%1 ).arg(trans2*it); w-setItem(w-rowCount() - 1, 2, new QTableWidgetItem(temp); if (rlt.type != -1) w-setItem(w-rowCount() - 1, 3, new QTableWidgetItem(rlt.str + src.mid(rlt.line).replace(QRegExp(nrst), QString:null); else w-setItem(w-rowCount() - 1, 3, new QTableWidgetItem(Lexical Analyze Error); return false; if (s.isEmpty() /qDebug() setItem(w-rowCount() - 1, 4, new QTableWidgetItem(Error); return false; else if (s0 = S) state.push(s.mid(1).toInt(); optr.push(rlt.type); w-setItem(w-rowCount() - 1, 4, new QTableWidgetItem(s); /qDebug() setItem(w-rowCount() - 1, 4, new QTableWidgetItem(s); if (s = acc) break; int r = s.mid(1).toInt(); for (int i = 0; i deriveArgr; i+) optr.pop(), state.pop(); optr.push(deriveLeftr); /qDebug() Reduce; state.push(tablestate.top()transoptr.top().toInt(); /qDebug() Goto; goto a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 铜陵职业技术学院《文化投资学》2023-2024学年第二学期期末试卷
- 2025年钢筋买卖合同范本
- 天津市职业大学《民航专业英语》2023-2024学年第二学期期末试卷
- 2025至2031年中国微波黄粉虫干燥设备行业投资前景及策略咨询研究报告
- 2025至2031年中国单绳矿井提升机塑料衬板行业投资前景及策略咨询研究报告
- 赶集摊位投标方案范本
- 2025至2031年中国PP-R冷热给水管件行业投资前景及策略咨询研究报告
- 2025至2030年中国高强聚氨酯管托数据监测研究报告
- 2025至2030年中国石油和合成液抗乳化性能测定仪数据监测研究报告
- 2025至2030年中国着色复合母粒数据监测研究报告
- 施工组织设计中期答辩
- 汽车卸煤沟土方开挖工程施工设计方案
- 重点监管的危险化工工艺与危险化学品
- 小学语文绘本阅读《神奇飞书》课件-
- GB/T 41664-2022低NOx燃油燃气燃烧器评价方法与试验规则
- 马工程《刑法学(下册)》教学课件 第20章 侵犯公民人身权利、民主权利罪
- 2023年水法律法规学习考试题库10月
- 街道优生优育进万家活动实施方案
- 《音乐疗法》教学课件
- ERP生产系统课件
- 小区室外雨、污水排水管道施工方案
评论
0/150
提交评论