版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,编译原理实验,黄诚449557241,2,内容,实验目的 函数绘图语言 题目与要求 参考解决方案:递归子程序方法 词法分析器 语法分析器 语法制导翻译 改进建议,3,1 实验目的,通过做上机题加深对编译器构造原理和方法的理解,巩固所学知识 会用正规式和产生式设计简单语言的语法 会用编写编译器或解释器 会写上机实验报告,4,2 函数绘图语言,函数绘图语言简介 函数绘图语句 循环绘图(FOR-DRAW)、比例设置(SCALE)、角度旋转(ROT)、坐标平移(ORIGIN)、注释(- 或 /) 屏幕(窗口)的坐标系 左上角为原点,x方向从左向右增长,y方向从上到下增长(
2、与一般的坐标系方向相反) 源程序示例 origin is (100, 300);- 设置原点 rot is 0;- 设置旋转角度(不旋转) scale is (1, 1);- 设置横纵坐标的比例 for T from 0 to 200 step 1 draw (t, 0);- 画横坐标 for T from 0 to 150 step 1 draw (0, -t);- 画纵坐标 for T from 0 to 120 step 1 draw (t, -t);- 画函数f(t)=t,5,2 函数绘图语言,语法和语义 语句满足下述规定: 各类语句按任意次序书写,且以分号结尾,以出现的先后顺序处理;
3、 ORIGIN、ROT和SCALE 语句只影响其后的绘图语句,且遵循最后语句有效的原则; 无论ORIGIN、ROT和SCALE语句的出现顺序如何,图形的变换顺序总是:比例变换旋转变换平移变换; 语言对大小写不敏感,例如for、For、FOR等,均被认为是同一个保留字; 表达式的值均为双精度类型,旋转角度单位为弧度且为逆时针旋转,平移单位为点。,6,2 函数绘图语言,循环绘图(FOR-DRAW) 语法: FOR T FROM 起点 TO 终点 STEP 步长 DRAW(横坐标, 纵坐标); 语义: 令T从起点到终点每次改变一个步长,绘制点(横坐标,纵坐标); 示例: FOR T FROM 0 T
4、O 2*PI STEP PI/50 DRAW (cos(T), sin(T); 说明: 令T从0到2*PI、步长 PI/50,绘制出各个点 (cos(T), sin(T),即一个单位圆,实际是左上角的一个点。因为绘图系统的默认值是 ORIGIN IS (0,0); ROT IS 0; SCALE IS (1, 1);,7,2 函数绘图语言,比例设置(SCALE) 语法:SCALE IS (横坐标比例因子,纵坐标比例因子); 语义:设置横坐标和纵坐标的比例,并分别按照比例因子进行缩放; 示例:SCALE IS (100, 100); 说明:将横坐标和纵坐标的比例设置为1:1,且放大100倍。 坐
5、标平移(ORIGIN) 语法:ORIGIN IS (横坐标,纵坐标); 语义:将坐标系的原点平移到横坐标和纵坐标规定的点处; 示例:ORIGIN IS (360, 240); 说明:将原点从(0, 0)平移到(360, 240) 处;,8,2 函数绘图语言,角度旋转(ROT) 语法:ROT IS 弧度; 语义:逆时针旋转角度所规定的弧度值。具体计算公式: 旋转后X = 旋转前X*COS(角度) + 旋转前Y*SIN(角度) 旋转后Y = 旋转前Y*COS(角度) - 旋转前X*SIN(角度) 示例:ROT IS PI/2; 说明:逆时针旋转PI/2,即逆时针旋转90度。 注释(- 或 /) 语
6、法:/ This is a comment line - 此行是注释 语义:/ 或 - 之后,直到行尾,均是注释 说明:便于理解,也用于屏蔽暂时不需要的语句。,9,2 函数绘图语言,语句功能的测试 ORIGIN IS (360, 240);/ (1) 原点移至(360, 240) SCALE IS (100, 100);/ (2) 图形放大100 SCALE IS (100, 100/3);/ (3) 纵坐标缩小为三分之一 ROT IS PI/2;/ (4) 逆时针旋转90度 - 绘制圆的轨迹 FOR T FROM 0 TO 2*PI STEP PI/50 DRAW (cos(T), sin(
7、T);,仅(1)和(2),加入(3),加入(4),10,2 函数绘图语言,其他函数图形,11,2 函数绘图语言,记号的语法和语义 记号种类:常数、参数、函数、保留字、运算符、分隔符 常数 常数字面量和标识符形式的常量名均称为常数。字面量的形式为普通的数值,如果没有小数,可省略小数点,如2、2.、2.0。PI、E也是常数,代表圆周率和自然对数的底。常数不能有符号位,如-1、+2处理为一元运算的表达式。 参数 唯一的、已经被定义好的变量名T。T也是一个表达式。作图语言中无需变量或参数的声明和定义语句。 函数 当前仅支持Sin、Cos、Tan、Sqrt、Exp和Ln。可自行加入其他函数。,12,2
8、函数绘图语言,保留字 语句中具有固定含义的标识符,包括: ORIGIN, SCALE, ROT, IS, TO, STEP, DRAW, FOR, FROM 运算符 PLUS, MINUS, MUL, DIV, POWER 即:+ - * /* 分隔符 SEMICO, L_BRACKET, R_BRACKET, COMMA 即:; () ,13,3 题目与要求,题目:函数绘图语言的解释器 为函数绘图语言编写一个解释器,解释器接受用绘图语言编写的源程序,经语法和语义分析之后,将源程序所规定的图形显示在显示屏(或窗口)中 目的:通过编写解释器,掌握语言翻译特别是语言识别的基本方法 解释器的实现 用
9、某种程序设计语言(如C+、C#、Java等)和递归下降子程序方法编写完整的解释器(参考程序统一采用VC+6.0实现),14,3 题目与要求,实 验 成 果,实验任务:手工编写,15,3 题目与要求,任务划分与上机报告 任务划分:词法分析器、语法分析器、语义分析器 要求:验收经过测试的程序,提交上机报告,包括: 任务与目的 软件设计 软件的总体结构与模块划分 关键算法与重要数据结构 测试例程设计与测试结果分析 总结、体会、改进建议等 建议:每个阶段均进行设计与测试,并且写出报告;采用增量式设计;工作全部完成后进行总结,16,4 参考解决方案递归子程序方法,4.1 词法分析器 步骤:正规式NFAD
10、FA最小DFA编写程序测试 记号的设计 词法分析器的三个任务:滤掉源程序中的无用成分;输出记号供语法分析器使用;识别非法输入,标记为出错记号 记号的组成:记号的类别和属性。 记号的数据结构: struct Token/ 记号的数据结构 Token_Type type;/ 类别 char * lexeme;/ 属性,原始输入的字符串 double value;/ 属性,若记号是常数则是常数的值 double (* FuncPtr)(double);/ 属性,若记号是函数则是函数指针 ;,17,4.1 词法分析器,函数绘图语言中记号的分类与表示 enum Token_Type / 记号的类别 OR
11、IGIN, SCALE, ROT, IS, / 保留字(一字一码) TO, STEP, DRAW,FOR, FROM, / 保留字 T, / 参数 SEMICO, L_BRACKET, R_BRACKET, COMMA,/ 分隔符 PLUS, MINUS, MUL, DIV, POWER,/ 运算符 FUNC, / 函数 CONST_ID, / 常数 NONTOKEN, / 空记号(源程序结束) ERRTOKEN / 出错记号(非法输入) ;,18,4.1 词法分析器,记号的正规式 letter= a|b|z|A|B|Z digit= 0|1|9 digits = digit digit* C
12、OMMENT = / | - WHITE_SPACE = ( | t | n )+ SEMICO = ; L_BRACKET = ( R_BRACKET = ) COMMA = , PLUS = + MINUS = - MUL = * DIV = / POWER = * CONST_ID = digits | digits.digits ID = letter ( letter | digit )*,手工构造词法分析器,正规式个数越少越便于程序编写,因而设计时模式相同的记号可共用一个正规式 常数的字面量部分设计为CONST_ID,而常量名则合并到ID中。 问题:函数绘图语言中的保留字、常量名、
13、参数名、以及函数名均被描述为ID,当识别为ID后如何区分?,19,区分记号的符号表,static Token TokenTab = CONST_ID,PI,3.1415926,NULL, CONST_ID,E,2.71828,NULL, T,T,0.0,NULL, FUNC,SIN,0.0,sin, FUNC,COS,0.0,cos, FUNC,TAN,0.0,tan, FUNC,LN,0.0,log, FUNC,EXP,0.0,exp, FUNC,SQRT,0.0,sqrt, ORIGIN,ORIGIN,0.0,NULL, SCALE,SCALE,0.0,NULL, ROT,ROT,0.0,
14、NULL, IS,IS,0.0,NULL, FOR,FOR,0.0,NULL, FROM,FROM,0.0,NULL, TO,TO,0.0,NULL, STEP,STEP,0.0,NULL, DRAW,DRAW,0.0,NULL;,20,4.1 词法分析器,例 语句 ROT IS PI/6 的记号流 ,21,4.1 词法分析器,正规式的DFA letter= a|b|z|A|B|Z digit= 0|1|9 digits = digit digit* COMMENT = - | / WHITE_SPACE = ( | t | n )+ SEMICO = ; L_BRACKET = ( R_BR
15、ACKET = ) COMMA = , PLUS = + MINUS = - MUL = * DIV = / POWER = * CONST_ID = digits | digits.digits ID = letter ( letter | digit )*,22,4.1 词法分析器,正规式的DFA COMMENT = - | /,注释1,注释2,23,4.1 词法分析器,正规式的DFA WHITE_SPACE = ( | t | n )+,空白,24,4.1 词法分析器,正规式的DFA COMMENT = - | / MINUS = - DIV = /,25,4.1 词法分析器,正规式的D
16、FA POWER = * MUL = *,26,4.1 词法分析器,正规式的DFA COMMA = , SEMICO = ; R_BRACKET = ) PLUS = + L_BRACKET = (,27,4.1 词法分析器,正规式的DFA letter= a|b|z|A|B|Z digit= 0|1|9 ID = letter ( letter | digit )*,28,4.1 词法分析器,正规式的DFA digit= 0|1|9 digits = digit digit* CONST_ID = digits | digits.digits,29,4.1 词法分析器,测试实例与测试结果 词
17、法分析器的测试比较简单,可以分为三个部分: 全部合法的输入 各种组合的非法输入 由记号组成的句子 如: FOR T FROM 0 TO 2*PI STEP PI/50 DRAW (cos(T),sin(T);,30,4.1 词法分析器,词法分析上机要点 分析研究函数绘图语言,深刻理解语句的语法和语义;深刻理解记号的语法和语义; 分析上机题目与要求,思考词法分析器的设计; 参考记号设计与DFA的实现方案,设计并实现词法分析器,并自己设计测试例程,进行详细测试; 写出词法分析器部分的上机报告。,31,4.2 语法分析器,语法分析器的任务:分析语言的结构 为句子构造语法树; 检查输入序列中的错误。
18、主要工作 设计函数绘图语言的文法,使其适合递归下降分析; 设计语法树的节点,用于存放表达式的语法树; 设计递归下降子程序,分析句子并构造表达式的语法树; 设计测试程序和测试用例,检验分析器是否正确。,32,4.2 语法分析器,函数绘图语言的文法 文法 Program | Program Statement SEMICO Statement OriginStatment | ScaleStatment | RotStatment | ForStatment OriginStatment ORIGIN IS L_BRACKET Expression COMMA Expression R_BRACK
19、ET ScaleStatment SCALE IS L_BRACKET Expression COMMA Expression R_BRACKET RotStatment ROT IS Expression,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
20、1 draw (t, t);- f(t)=t,33,4.2 语法分析器,ForStatment FOR T FROM Expression TO Expression STEP Expression DRAW L_BRACKET Expression COMMA Expression R_BRACKET Expression Expression PLUS Expression | Expression MINUS Expression | Expression MUL Expression | Expression DIV Expression | PLUS Expression | MIN
21、US Expression | Expression POWER Expression | CONST_ID | T | FUNC L_BRACKET Expression R_BRACKET | L_BRACKET Expression R_BRACKET,34,4.2 语法分析器,改写文法为无二义文法 表达式中的运算结合性非终结符 PLUS、MINUS(二元) 左结合Expression MUL、DIV左结合Term PLUS、MINUS(一元)右结合Factor POWER右结合Component (原子表达式)无Atom Expression Expression PLUS Expre
22、ssion | Expression MINUS Expression 引入Term提高算符的优先级,保留左递归使得算符左结合: Expression Expression PLUS Term | Expression MINUS Term | Term Term对应运算MUL和DIV,于是有: Term Term MUL Term | Term DIV Term,35,4.2 语法分析器,无二义的表达式文法 Expression Expression PLUS Term | Expression MINUS Term | Term Term Term MUL Factor | Term DI
23、V Factor | Factor Factor PLUS Factor | MINUS Factor | Component Component Atom POWER Component | Atom Atom CONST_ID | T | FUNC L_BRACKET Expression R_BRACKET | L_BRACKET Expression R_BRACKET,ExpressionPLUS、MINUS TermMUL、DIV FactorPLUS、MINUS ComponentPOWER Atom (原子表达式),36,4.2 语法分析器,消除左递归和提取左因子 消除prog
24、ram产生式的左递归 Program Program Statement SEMICO | Program Program Program Statement SEMICO Program| Program Statement SEMICO Program | 消除Expression和Term的左递归 Expression Term Expression Expression PLUS Term Expression | MINUS Term Expression | Term Factor Term Term MUL Factor Term | DIV Factor Term | Fact
25、or和Componet对应的运算是右结合,故无左递归.,37,4.2 语法分析器,改写左结合的产生式为EBNF形式(避免子程序调用) 递归子程序仅要求产生式没有左递归。 Program Statement SEMICO Program | void Program() if (token = NONTOKEN) return; Statement(); MathchToken(SEMICO); Program(); 改写为EBNF形式,以减少不必要的子程序调用。 Program Statement SEMICO void Program() while (token != NONTOKEN)
26、Statement(); MathchToken(SEMICO); ,38,4.2 语法分析器,改写Expression产生式: Expression Term Expression Expression PLUS Term Expression | MINUS Term Expression | Expression(PLUS|MINUS)Term Expression| Expression (PLUS|MINUS)Term Expression Term (PLUS|MINUS)Term Expression的递归子程序: void Expression() Term(); while
27、(token=PLUS | token=MINUS) MathchToken(token); Term(); ,39,4.2 语法分析器,最终表达式的产生式 Expression Term ( PLUS | MINUS) Term Term Factor ( MUL | DIV ) Factor Factor PLUS Factor | MINUS Factor | Component Component Atom POWER Component | Atom Atom CONST_ID | T FUNC L_BRACKET Expression R_BRACKET | L_BRACKET E
28、xpression R_BRACKET,40,4.2 语法分析器,表达式的语法树 语法树的节点 表达式语法树的节点可以设计为以下三类: 叶节点:常数、参数T等。 两个孩子的内部节点:二元运算如Plus、Mul等。 一元加:+5转化为5; 一元减:-5转化为0-5。 一个孩子的内部节点:函数调用,如sin(t)等。,41,4.2 语法分析器,节点的数据结构 typedef double (* FuncPtr)(double); struct ExprNode enum Token_Type OpCode;/ 记号种类 union struct ExprNode *Left, *Right; Ca
29、seOperator;/ 二元运算 struct ExprNode * Child; FuncPtr MathFuncPtr; CaseFunc;/ 函数调用 double CaseConst; / 常数,绑定右值 double * CaseParmPtr; / 参数T,绑定左值 Content; ;,42,4.2 语法分析器,表达式-16+5*3/cos(T)的语法树,43,4.2 语法分析器,建立语法树的程序框架 #include double Parameter;/ 参数 struct ExprNode * MakeExprNode(enum Token_Type opcode, .)
30、struct ExprNode *ExprPtr = new (struct ExprNode); va_list ArgPtr; ExprPtr-OpCode = opcode; va_start(ArgPtr, opcode); switch(opcode) case CONST_ID:/ 常数节点 ExprPtr-Content.CaseConst = (double)va_arg(ArgPtr,double); break; case T:/ 参数节点 ExprPtr-Content.CaseParmPtr = ,44,4.2 语法分析器,case FUNC:/ 函数调用节点 Expr
31、Ptr-Content.CaseFunc.MathFuncPtr = (FuncPtr)va_arg(ArgPtr, FuncPtr); ExprPtr-Content.CaseFunc.Child =(struct ExprNode *)va_arg(ArgPtr,struct ExprNode *); break; default:/ 二元运算节点 ExprPtr-Content.CaseOperator.Left =(struct ExprNode *)va_arg(ArgPtr,struct ExprNode *); ExprPtr-Content.CaseOperator.Right
32、 =(struct ExprNode *)va_arg(ArgPtr,struct ExprNode *); break; / end of switch va_end(ArgPtr); return ExprPtr; / end of MakeExprNode,45,4.2 语法分析器,递归下降子程序 辅助子程序 void FetchToken (); void MatchToken (enum Token_Type AToken); void SyntaxError (int case_of); FetchToken源程序: static void FetchToken() token =
33、 GetToken(); if (token.type = ERRTOKEN) SyntaxError(1); 其中token是存放记号的全程量; GetToken()是词法分析器接口; SyntaxError(case_of)是出错处理。,46,4.2 语法分析器,主要产生式的递归子程序 void Parser(char * SrcFilePtr); void Program(); void Statement(); void OriginStatement(); void RotStatement(); void ScaleStatement(); void ForStatement();
34、 struct ExprNode * Expression(); struct ExprNode * Term(); struct ExprNode * Factor(); struct ExprNode * Component(); struct ExprNode * Atom();,47,4.2 语法分析器,Parser的递归子程序 void Parser(char * SrcFilePtr) if(!InitScanner(SrcFilePtr)/ 初始化词法分析器 printf(Open Source File Error ! n); return; FetchToken();/ 获取
35、第一个记号 Program();/ 进行递归下降分析 CloseScanner();/ 关闭词法分析器 / end of Parser,48,4.2 语法分析器,ForStatement的递归子程序 ForStatment FOR T FROM Expression TO Expression STEP Expression DRAW L_BRACKET Expression COMMA Expression R_BRACKET static void ForStatement (void) struct ExprNode *start_ptr, *end_ptr, *step_ptr, *x
36、_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(); MatchToken (COMMA);y_ptr = Expression(); MatchToken (R_BRACKET)
37、; ,49,4.2 语法分析器,Expression的递归子程序 Expression Term ( PLUS | MINUS) Term static struct ExprNode * Expression() struct ExprNode *left, *right; Token_Type token_tmp; left = Term(); while (token.type=PLUS | token.type=MINUS) token_tmp = token.type; MatchToken(token_tmp); right = Term(); left = MakeExprNod
38、e(token_tmp, left,right); return left; ,其他产生式的递归子程序采用类似方法得到。,50,4.2 语法分析器,测试 测试主程序 #include extern void Parser(char * SrcFilePtr); void main(int argc, char *argv) if(argc2) printf(“Input Source!n ); return; Parser(test.txt); 测试辅助子程序 void PrintSyntaxTree(struct ExprNode *root, int indent); 从root开始,对语
39、法树进行深度优先的先序遍历,并且根据缩进值indent将当前被遍历的节点打印在适当的位置上。,51,4.2 语法分析器,-16+5*3/cos(T)的语法树:,+ - 0.000000 16.000000 / * 5.000000 3.000000 402da4 T,52,4.2 语法分析器,测试 测试语句: 子程序入口与出口加入“enter”和“exit” 终结符匹配后加入“mathctoken *” 表达式(Expression)构造后,打印语法树 测试内容: 重要语言结构:各类语句、各种算术表达式 典型的语法错误:语句错误、算术表达式错误等,53,4.3 语法制导翻译,- 函数f(t)=
40、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的轨迹 词法分析器 识别输入序列,并为语法分析器提供记号。 语法分析器 根据记号流识别句子,并为表达式构造语法树。 语义分析器
41、 根据语言结构,处理函数绘图语言程序的语义。,54,4.3 语法制导翻译,绘图语言的语义 表达式值的计算:深度优先后序遍历语法树 图形的绘制:画出每个坐标点 绘图所需的语义处理: 从origin、rot和scale中得到坐标变换所需的信息; for_draw语句根据t的每一个值进行如下处理: 计算被绘制点的横、纵坐标值; 根据坐标变换信息进行坐标变换,得到实际坐标; 根据点的实际坐标画出该点。,55,4.3 语法制导翻译,语法制导翻译的基本步骤: 为文法符号设计属性; 设计语义规则中所需的辅助函数; 为产生式设计语义规则。 比例设置语句的文法: ScaleStatment SCALE IS L
42、_BRACKET Expression COMMA Expression R_BRACKET 简写:S SCALE IS (E1,E2) 作用是提供横、纵坐标的比例因子,需要: 设计属性:.x和.y,分别保存比例因子; 设计辅助函数:get_value(nptr),它返回表达式树的值; 设计语义规则:S.x:=get_value(E1.nptr); S.y:=get_value(E2.nptr);,56,4.3 语法制导翻译,语义函数的设计 全程变量(类似于设计属性) double Parameter=0; / 为参数T分配的变量 double Origin_x=0.0, Origin_y=0
43、.0;/ 用于记录平移距离 double Rot_ang=0.0; / 用于记录旋转角度 double Scale_x=1, Scale_y=1; / 用于记录比例因子 例:以点(350, 220)为圆心绘制两个同心园 origin is (350, 220); / Origin_x=350,Origin_y=220 scale is (50, 50); / Scale_x=50,Scale_y=50 for t from 0 to 2*pi step pi/100 draw(cos(t), sin(t); scale is (100, 100); / Scale_x=100,Scale_y=
44、100 for t from 0 to 2*pi step pi/200 draw(cos(t), sin(t);,57,4.3 语法制导翻译,辅助语义函数 a) 计算表达式的值:深度优先后序遍历语法树 double GetExprValue(struct ExprNode * root); b) 计算点的坐标值:首先获取坐标值,然后进行坐标变换 static void CalcCoord( struct ExprNode * Hor_Exp, struct ExprNode * Ver_Exp, double ,58,辅助语义函数设计举例 a) 表达式值的计算: double GetExpr
45、Value(struct ExprNode * root) 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 POWER : return pow( GetExprValue(root-Content.CaseOperator.Left), GetEx
46、prValue(root-Content.CaseOperator.Right); case FUNC : return (* root-Content.CaseFunc.MathFuncPtr) (GetExprValue(root-Content.CaseFunc.Child) ); case CONST_ID : return root-Content.CaseConst ; case T : return *(root-Content.CaseParmPtr); default : return 0.0 ;,59,4.3 语法制导翻译,b) 计算点的坐标值: static void C
47、alcCoord (struct ExprNode * Hor_Exp, struct ExprNode * Ver_Exp, double /返回坐标 ,60,4.3 语法制导翻译,c) 点轨迹的循环绘制: void DrawLoop(double Start,double End,double Step, struct ExprNode * HorPtr, struct ExprNode * VerPtr) extern double Parameter;/ 参数T的存储空间 double x, y; for(Parameter=Start; Parameter=End; Paramete
48、r+=Step) CalcCoord(HorPtr, VerPtr, x, y); / 计算实际坐标 DrawPixel(unsigned long)x, (unsigned long)y);/ 绘制点 ,61,4.3 语法制导翻译,递归子程序中语义规则的嵌入 语义规则可以嵌入在递归子程序的任何位置。根据语法制导翻译的基本思想,如果希望从某部分语言结构中获取语义,则相应的语义规则可以紧跟在该结构的语法分析之后。 a) OriginStatement b) ForStatement,62,4.3 语法制导翻译,a) OriginStatement static void OriginStatem
49、ent (void) double x, y;struct ExprNode *tmp; MatchToken(ORIGIN);MatchToken(IS); MatchToken(L_BRACKET); tmp = Expression(); x = GetExprValue(tmp);/ 获取横坐标的平移值 MatchToken(COMMA); tmp = Expression(); y = GetExprValue(tmp);/ 获取纵坐标的平移值 MatchToken(R_BRACKET); SetOrigin(x, y); / 置坐标平移全程量 ,63,b) ForStatement
50、 static void ForStatement (void) double Start, End, Step; struct ExprNode *start_ptr, *end_ptr, *step_ptr, *x_ptr, *y_ptr; MatchToken (FOR); MatchToken(T); MatchToken (FROM); start_ptr=Expression();Start = GetExprValue(start_ptr); MatchToken (TO); end_ptr=Expression();End = GetExprValue(end_ptr); Ma
51、tchToken (STEP); step_ptr=Expression();Step = GetExprValue(step_ptr); MatchToken (DRAW); MatchToken (L_BRACKET);x_ptr = Expression(); MatchToken (COMMA); y_ptr=Expression(); MatchToken (R_BRACKET); DrawLoop (Start, End, Step, x_ptr, y_ptr); ,64,4.3 语法制导翻译,解释器的源程序组织 程序的冗余比数据的冗余更危险 资源的物理位置与逻辑位置无关 合理组织
52、资源,利于团队合作与回归测试 辅助信息同等重要,Source Codes,65,4.3 语法制导翻译,解释器主程序的生成 测试例程与测试结果(略) 绘图主程序与词法分析和语法分析器主程序的区别:需要在窗口环境中运行,因此需要建立选项为Win32 Application的主程序。具体步骤和主程序见参考程序,66,5 改进建议,函数绘图语言的扩充 修改显示屏的直角坐标系,使与习惯上的坐标系一致 扩充语句类型,使得用户可以规定图形颜色 扩展循环绘图语句,使得for_draw语句可以嵌套 增加文本框,使得用户可以在图形中添加文字说明 增加清图功能,使得图形可以具有简单的动画效果,67,5 改进建议,采
53、用面向对象技术实现解释器 语法制导翻译的本质反映在面向对象的程序设计方法上就是一种继承关系。 习惯上: 提供服务者(server)类 请求服务者(client)主程序,类主程序,词法分析 语法分析 语义分析,68,static void ForStatement (void) tree_node_ptr start_ptr, end_ptr, step_ptr, x_ptr, y_ptr; #ifndef PARSER_DEBUG double start_val, end_val, step_val;/ 起点、终点、步长 #endif 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(); MatchToken (COMMA); y_ptr = Expression(); MatchToken (R_BRAC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026广西南宁市第三职业技术学校招聘编外聘用教师2人考试备考试题及答案解析
- 2026重庆市綦江区郭扶镇招聘公益性岗位人员1人考试备考试题及答案解析
- 北辰集团2026届校园招聘考试参考题库及答案解析
- 2026年红河州个旧市城市发展集团有限公司就业见习基地招募见习生(20人)考试备考题库及答案解析
- 2026海南省航天技术创新中心招聘5人考试参考题库及答案解析
- 2026年淄博市博山区教育和体育局所属事业单位公开招聘工作人员(16人)考试备考试题及答案解析
- 2026重庆医科大学附属第一医院人员(编制外)招聘4人考试备考题库及答案解析
- 2026年安康市汉滨区第三人民医院招聘(22人)笔试备考试题及答案解析
- 2026春季河南新乡工商职业学院招聘考试参考试题及答案解析
- 2026河北保定市雄安新区某国有企业招聘1人考试备考试题及答案解析
- 基坑回填施工措施方案
- 电子商务团队年度总结课件
- 11251《操作系统》国家开放大学期末考试题库
- 机器人及具有独立功能专用机械项目融资计划书
- 箱式变电站安装施工工艺
- 2026届八省联考(T8联考)2026届高三年级12月检测训练物理试卷(含答案详解)
- 江苏省南京市鼓楼区2024-2025学年七年级上学期期末考试语文试题
- ISO9001质量管理体系课件
- 2025年员额法官检察官考试之政治理论测试题(含答案)
- 油罐围栏施工方案(3篇)
- 2026泰安银行股份有限公司校园招聘70人备考题库附答案详解(综合题)
评论
0/150
提交评论