编译原理上机实践之语法制导翻译绘制函数图形

上传人:tian****1990 文档编号:82087839 上传时间:2019-02-23 格式:PPT 页数:30 大小:364KB
返回 下载 相关 举报
编译原理上机实践之语法制导翻译绘制函数图形_第1页
第1页 / 共30页
编译原理上机实践之语法制导翻译绘制函数图形_第2页
第2页 / 共30页
编译原理上机实践之语法制导翻译绘制函数图形_第3页
第3页 / 共30页
编译原理上机实践之语法制导翻译绘制函数图形_第4页
第4页 / 共30页
编译原理上机实践之语法制导翻译绘制函数图形_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《编译原理上机实践之语法制导翻译绘制函数图形》由会员分享,可在线阅读,更多相关《编译原理上机实践之语法制导翻译绘制函数图形(30页珍藏版)》请在金锄头文库上搜索。

1、1,语法制导翻译绘制函数图形,编译原理上机作业(3),2,简单复习,- 函数f(t)=t的图形 origin is (200, 300); - 设置原点的偏移量 rot is pi/6; - 设置旋转角度 scale is (2, 1); - 设置横坐标和纵坐标的比例 for T from 0 to 200 step 1 draw (t, 0); - 横坐标的轨迹 for T from 0 to 180 step 1 draw (0, -t); - 纵坐标的轨迹 for T from 0 to 150 step 1 draw (t, -t); - f(t)=t的轨迹,词法分析器: 识别输入序列

2、,并为语法分析器提供记号。 语法分析器: 根据记号流识别句子,并为表达式构造语法树。 语义分析器: 根据语言结构,处理函数绘图语言程序的语义。,3,2.3.3 语法制导翻译绘制图形,表达式值的计算:深度优先后序遍历语法树 图形的绘制:画出每个坐标点,绘图所需的语义处理: 从origin、rot和scale中得到坐标变换所需的信息; for_draw语句根据t的每一个值进行如下处理: 计算被绘制点的横、纵坐标值; 根据坐标变换信息进行坐标变换,得到实际坐标; 根据点的实际坐标画出该点。,2.3.3.1 绘图语言的语义,语法制导翻译的基本步骤 为文法符号设计属性; 设计语义规则中所需的辅助函数;

3、为产生式设计语义规则。,4,例子:比例设置语句的语义设计,文法:ScaleStatment SCALE IS L_BRACKET Expression COMMA Expression R_BRACKET 可简写为:S SCALE IS (E,E) 它的作用是提供横、纵坐标的比例因子。 因此需要: 设计属性:.x和.y,分别保存比例因子; 设计计算表达式值的辅助函数: GetExprValue(nptr),它返回表达式树的值; 设计语义规则: S SCALE IS (E1,E2) S.x:=GetExprValue(E1.nptr); S.y:=GetExprValue(E2.nptr);,5

4、,2.3.3.2 语义函数的设计, 全程变量: double Parameter=0; / 为参数T分配的变量 double Origin_x=0.0, Origin_y=0.0;/ 用于记录平移距离 double Rot_ang=0.0; / 用于记录旋转角度 double Scale_x=1, Scale_y=1; / 用于记录比例因子,6, 全程变量(续),例:以点(350, 220)为圆心绘制两个同心园 origin is (350, 220); scale is (50, 50); for t from 0 to 2*pi step pi/100 draw(cos(t), sin(t

5、); scale is (100, 100); for t from 0 to 2*pi step pi/200 draw(cos(t), sin(t);,/ Origin_x=350,Origin_y=220,/ Scale_x=50,Scale_y=50,/ Scale_x=100,Scale_y=100,7, 辅助语义函数,b) 计算点的坐标值:首先获取坐标值,然后进行坐标变换 static void CalcCoord( struct ExprNode * x_nptr, struct ExprNode * y_nptr, double ,c) 绘制一个点(与环境有关): void D

6、rawPixel(unsigned long x, unsigned long y);,d) 循环绘制所有的点: void DrawLoop( double Start, double End, double Step, struct ExprNode * HorPtr, struct ExprNode * VerPtr);,a) 计算表达式的值:深度优先后序遍历语法树 double GetExprValue(struct ExprNode * root);,8, 辅助语义函数设计举例 a) 表达式值的计算,double GetExprValue(struct ExprNode * root)

7、 if (root = NULL) return 0.0; switch (root - OpCode) case PLUS : return GetExprValue(root-Content.CaseOperator.Left ) + GetExprValue(root-Content.CaseOperator.Right) ; case MINUS : / 其它运算类似处理 case FUNC : return (* root-Content.CaseFunc.MathFuncPtr) (GetExprValue(root-Content.CaseFunc.Child) ); case

8、CONST_ID : return root-Content.CaseConst ; case T : return *(root-Content.CaseParmPtr); default : return 0.0 ; ,9,b) 计算点的坐标值:,static void CalcCoord ( struct ExprNode * x_nptr, struct ExprNode * y_nptr, double ,10,d) 点轨迹的循环绘制,void DrawLoop( double Start, double End, double Step, struct ExprNode * x_p

9、tr, struct ExprNode * y_ptr) extern double Parameter; / 参数T的存储空间 double x, y; ,for(Parameter=Start; Parameter=End; Parameter+=Step) ,CalcCoord(x_ptr, y_ptr, x, y); / 计算实际坐标DrawPixel(unsigned long)x, (unsigned long)y); / 根据坐标绘制点,11,2.3.3.3 递归子程序中语义规则的嵌入,语义规则可以嵌入在递归子程序的任何位置。根据语法制导翻译的基本思想,如果希望从某部分语言结构中

10、获取语义,则相应的语义规则可以紧跟在该结构的语法分析之后。,a) OriginStatement b) ForStatement,12,OriginStatement,x = GetExprValue(tmp);/ 获取横坐标的平移值,y = GetExprValue(tmp);/ 获取纵坐标的平移值,SetOrigin(x, y); / 置坐标平移全程量,static void OriginStatement (void) double x, y; struct ExprNode *tmp; MatchToken (ORIGIN); MatchToken (IS); MatchToken (

11、L_BRACKET); tmp = Expression(); MatchToken (COMMA); tmp = Expression(); MatchToken (R_BRACKET); ,13,b) ForStatement,Start = GetExprValue(start_ptr);,End = GetExprValue(end_ptr);,Step = GetExprValue(step_ptr);,DrawLoop (Start, End, Step, x_ptr, y_ptr);,static void ForStatement (void) double Start, En

12、d, Step; struct ExprNode *start_ptr,*end_ptr,*step_ptr,*x_ptr,*y_ptr; MatchToken (FOR); MatchToken(T); MatchToken (FROM); start_ptr=Expression(); MatchToken (TO); end_ptr=Expression(); MatchToken (STEP); step_ptr=Expression(); MatchToken (DRAW); MatchToken (L_BRACKET); x_ptr = Expression(); MatchTok

13、en(COMMA); y_ptr=Expression(); MatchToken (R_BRACKET); ,14,2.3.3.4 解释器的源程序组织(看实际环境), 程序的冗余比数据的冗余更危险; 资源的物理位置与逻辑位置无关; 合理组织资源,利于团队合作与回归测试; 辅助信息同等重要。,15,2.3.3.5 解释器主程序的生成 2.3.3.6 测试例程与测试结果(略),绘图主程序与词法分析和语法分析器主程序的区别:需要在窗口环境中运行,因此需要建立选项为Win32 Application的主程序。,16,2.5 上机题的改进建议,2.5.1 函数绘图语言的扩充 修改显示屏的直角坐标系,使

14、与习惯上的坐标系一致; 扩充语句类型,使得用户可以规定图形颜色; 扩展循环绘图语句,使得for_draw语句可以嵌套; 增加文本框,使得用户可以在图形中添加文字说明; 增加清图功能,使得图形可以具有简单的动画效果。,17,2.5.2 语法制导翻译中继承的不同实现方法,类(或子程序) 主程序,习惯上:提供服务者(server)类(子程序) 请求服务者(client)主程序,词法分析: 语法分析: 语义分析:,语法制导翻译的本质反映在面向对象的程序设计方法上就是一种继承关系。,18,用类实现继承,tree_node_ptr start_ptr, end_ptr, step_ptr,x_ptr, y

15、_ptr; /- 基类中的for_statement void parser_class:for_statement () match_token (FOR); match_token(T); match_token (FROM); start_ptr = expression(); match_token (TO); end_ptr = expression(); match_token (STEP); step_ptr = expression(); match_token (DRAW); match_token (L_BRACKET); x_ptr = expression(); mat

16、ch_token(COMMA); y_ptr = expression(); match_token(R_BRACKET); ,19,用类实现继承(续),/- 派生类中的for_statement void interpreter_class:for_statement () double start_val, end_val, step_val; parser_class:for_statement(); / 语法分析 start_val = GetExprValue(start_ptr); / 语义分析 end_val = GetExprValue(end_ptr); step_val = GetExprValue(step_ptr); DrawLoop (start_val, end_val, ste

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

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

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