编译原理基础——习题与上机题解答 教学课件 ppt 作者 刘坚 第6-10章 第10章

上传人:E**** 文档编号:89389532 上传时间:2019-05-24 格式:PPT 页数:24 大小:215.50KB
返回 下载 相关 举报
编译原理基础——习题与上机题解答 教学课件 ppt 作者 刘坚 第6-10章 第10章_第1页
第1页 / 共24页
编译原理基础——习题与上机题解答 教学课件 ppt 作者 刘坚 第6-10章 第10章_第2页
第2页 / 共24页
编译原理基础——习题与上机题解答 教学课件 ppt 作者 刘坚 第6-10章 第10章_第3页
第3页 / 共24页
编译原理基础——习题与上机题解答 教学课件 ppt 作者 刘坚 第6-10章 第10章_第4页
第4页 / 共24页
编译原理基础——习题与上机题解答 教学课件 ppt 作者 刘坚 第6-10章 第10章_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《编译原理基础——习题与上机题解答 教学课件 ppt 作者 刘坚 第6-10章 第10章》由会员分享,可在线阅读,更多相关《编译原理基础——习题与上机题解答 教学课件 ppt 作者 刘坚 第6-10章 第10章(24页珍藏版)》请在金锄头文库上搜索。

1、第10章 上机题的改进建议,到此为止函数绘图语言解释器的解决方案已经介绍完毕。题目和解决方案只是起到了一个抛砖引玉的作用,有兴趣和有能力的读者可以此为基础进行改进,以使上机作业更有趣味。改进可以从两个方面考虑:语言的扩充和实现方法的更新。下边是一些不成熟的建议,仅供读者参考。,(1) 修改显示屏的直角坐标系,使得它与习惯上的坐标系一致; (2) 扩充语句类型,使得用户可以规定图形颜色,包括背景色和前景色; (3) 扩展循环绘图语句,使得for_draw语句可以嵌套; (4) 增加文本框,使得用户可以在图形中添加文字说明;,10.1 函数绘图语言的扩充,(5) 增加清除图形功能,使得图形可以具有

2、简单的动画效果。,与传统模块化和过程式程序设计比较,面向对象程序设计技术的核心之一是为程序设计者提供了类和类的继承机制,利用此机制可以提高软件开发的效率和安全性,从而提高软件的可维护性和可重用性。,10.2 采用面向对象技术实现解释器,根据词法分析器、语法分析器和最终解释器之间的关系,考虑到每个阶段的测试需求,我们可以将函数绘图语言的解释器设计为图10.1所示的结构。此结构与附录1.1源程序的结构一致,但是它将原来的词法分析器、语法分析器和语义函数三个模块分别改造为类。词法分析器和语法分析器是两个基本的类,它们分别实现单纯的词法分析和语法分析。,原来的语义函数模块现在改造为语法分析器的派生类,

3、它在基类的基础上重置基类中的某些函数,以实现函数绘图语言的语法制导翻译和不同阶段的测试。 事实上,语法制导翻译的本质反映在面向对象的程序设计方法上就是一种继承关系。为了说明这个问题,下边以ForStatement递归子程序为例,介绍如何将混合在一起的语法分析和语义分析以继承的关系区分开来,以提高程序的可读性和可维护性。读者可以沿此思路实现图10.1所示的函数绘图语言解释器。,例10.1 过程式的程序设计方法中,我们将ForStatement的递归子程序放置在语法分析器模块parser中,并且设计为如下形式。,图10.1,#ifdef PARSER_DEBUG #define call_matc

4、h(x) printf(“matchtoken %sn“, x) #else #define call_match(x) #endif / enter、back的定义与call_match类似,此处忽略 static void ForStatement (void) #ifndef PARSER_DEBUG,double Start, End, Step; / 绘图起点、终点、步长 #endif struct ExprNode *start_ptr, *end_ptr, *step_ptr, *x_ptr, *y_ptr; / 各表达式语法树根节点指针 enter(“ForStatement“

5、); call_match(“FOR“); MatchToken (FOR); call_match(“T“); MatchToken(T);,call_match(“FROM“); MatchToken (FROM); start_ptr = Expression(); / 构造起点表达式的语法树 #ifndef PARSER_DEBUG Start = GetExprValue(start_ptr); / 计算表达式的值 DelExprTree(start_ptr); / 释放语法树所占空间 #endif call_match(“TO“); MatchToken (TO);,end_ptr

6、 = Expression(); / 构造终点表达式的语法树 #ifndef PARSER_DEBUG End = GetExprValue(end_ptr); / 计算表达式的值 DelExprTree(end_ptr); / 释放语法树所占空间 #endif call_match(“STEP“); MatchToken (STEP); step_ptr = Expression(); / 构造步长表达式的语法树 #ifndef PARSER_DEBUG,Step = GetExprValue(step_ptr); / 计算表达式的值 DelExprTree(step_ptr); / 释放语

7、法树所占空间 #endif call_match(“DRAW“); MatchToken (DRAW); call_match(“(“); MatchToken (L_BRACKET); x_ptr = Expression(); / 构造横坐标表达式的语法树 call_match(“,“);MatchToken (COMMA);,y_ptr = Expression(); / 构造纵坐标表达式的语法树 call_match(“)“); MatchToken (R_BRACKET); #ifndef PARSER_DEBUG DrawLoop (Start, End, Step, x_ptr,

8、 y_ptr); / 绘制图形 DelExprTree(x_ptr); / 释放横坐标语法树所占空间 DelExprTree(y_ptr); / 释放纵坐标语法树所占空间 #endif back(“ForStatement“); ,上述子程序将语法分析和语义分析混在了一起,为了使子程序在语法分析阶段和函数绘图阶段均可以被分别测试,只能通过引入编译开关PARSER_DEBUG来区分两个阶段的工作,这使得程序的易读性大打折扣,同时也违反了软件设计中“模块功能独立”的原则。 通过C+提供的类机制,可以将ForStatement递归子程序一分为二,它在语法分析器类中仅进行单纯的语法分析和相应测试,而在

9、其后的派生类中根据语法分析的结果进行语义计算和绘图。保存语法分析结果的数据结构作为语法分析器类的成员变量声明在parser.h中。它们是指向表达式语法树的指针,具体可声明如下:,struct ExprNode * start_ptr, / 起点表达式的语法树 * end_ptr, / 终点表达式的语法树 * step_ptr, / 步长表达式的语法树 * x_ptr, / 点的横坐标表达式的语法树 * y_ptr, / 点的纵坐标表达式的语法树,* angle_ptr; / 旋转角度表达式的语法树 语法分析器类中的子程序可设计如下: void parser_class:call_match(c

10、har * x) cout “matchtoken “ x endl; / enter、back的定义与call_match类似,此处忽略,void parser_class:for_statement () enter(“for_statement“); call_match(“FOR“); MatchToken (FOR); call_match(“T“); MatchToken (T); call_match(“FROM“); MatchToken (FROM); start_ptr = Expression(); / 构造起点表达式的语法树 call_match(“TO“); Matc

11、hToken (TO);,end_ptr = Expression(); / 构造终点表达式的语法树 call_match(“STEP“); MatchToken (STEP); step_ptr = Expression(); / 构造步长表达式的语法树 call_match(“DRAW“); MatchToken (DRAW); call_match(“(“); MatchToken (L_BRACKET); x_ptr = Expression(); / 构造横坐标表达式的语法树 call_match(“,“); MatchToken (COMMA);,y_ptr = Expressio

12、n(); / 构造纵坐标表达式的语法树 call_match(“)“); MatchToken (R_BRACKET); back(“for_statement“); 在派生类中重置上述函数如下。其中用于语法分析阶段跟踪调试的call_match在绘图阶段通过重置被屏蔽。 void interpreter_class:call_match() / enter、back的重置与call_match类似,此处忽略,void interpreter_class:for_statement () double start_val, end_val, step_val; / 绘图起点、终点、步长 par

13、ser_class:for_statement(); / 语法分析获取各表达式的语法树 start_val = GetExprValue(start_ptr); / 计算起点表达式的值 end_val = GetExprValue(end_ptr); / 计算终点表达式的值,step_val = GetExprValue(step_ptr); / 计算步长表达式的值 DrawLoop (start_val, end_val, step_val, x_ptr, y_ptr); / 绘图 DelExprTree(start_ptr); / 释放各语法树的空间 DelExprTree(end_ptr); DelExprTree(step_ptr); DelExprTree(x_ptr);,DelExprTree(y_ptr); ,

展开阅读全文
相关资源
相关搜索

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

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