实验4-LR(k)分析器知识课件

上传人:youn****329 文档编号:135854482 上传时间:2020-06-19 格式:DOC 页数:10 大小:553.50KB
返回 下载 相关 举报
实验4-LR(k)分析器知识课件_第1页
第1页 / 共10页
实验4-LR(k)分析器知识课件_第2页
第2页 / 共10页
实验4-LR(k)分析器知识课件_第3页
第3页 / 共10页
实验4-LR(k)分析器知识课件_第4页
第4页 / 共10页
实验4-LR(k)分析器知识课件_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《实验4-LR(k)分析器知识课件》由会员分享,可在线阅读,更多相关《实验4-LR(k)分析器知识课件(10页珍藏版)》请在金锄头文库上搜索。

1、实验四 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 +

2、T | T T id | num输入语句:三、实验要求要求实现以下功能:a)设计分析表和语句的输入;b)要实现通用的LR分析思想的源代码;c)输出对语句的语法分析判断结果,如果可能给出错误的信息提示。四、实现方法根据课本的LR分析器模型和LR分析算法,完成LR分析。对要求中的错误信息提示,指的是对应分析表中的空白处,每一个空白的地方都应该有对应的错误情况,因而有相应的错误信息。注意这里的语法分析,是在词法分析的基础上进行的。五、识别活前缀的DFA六、SLR(1)分析表 Program - block Block - stmts Stmts - stmt stmts Stmts - eps St

3、mt - 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#

4、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

5、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-addTo

6、ken(); / 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.

7、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,

8、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.in

9、sert(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; deri

10、veArg2 = 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; deriveLe

11、ft7 = 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); Match

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号