最完整的语法分析器的构造PPT课件_第1页
最完整的语法分析器的构造PPT课件_第2页
最完整的语法分析器的构造PPT课件_第3页
最完整的语法分析器的构造PPT课件_第4页
最完整的语法分析器的构造PPT课件_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2021/3/914.2 语法分析器的构造 主要工作:1设计函数绘图语言的文法,使适合递归下降分析;2设计语法树的节点,用于存放表达式的语法树;3设计递归下降子程序, 分析句子并构造表达式的语法树;4设计测试程序和测试用例,检验分析器是否正确。语法分析器的任务:分析语言的结构,构造语法树2021/3/924.2.1 函数绘图语言的文法 Program | Program Statement SEMICOStatement OriginStatment | ScaleStatment | RotStatment | ForStatmentOriginStatment ORIGIN IS L_BR

2、ACKET Expression COMMA Expression R_BRACKETScaleStatment SCALE IS L_BRACKET Expression COMMA Expression R_BRACKETRotStatment ROT IS ExpressionForStatment FOR T FROM Expression TO Expression STEP Expression DRAW L_BRACKET Expression COMMA Expression R_BRACKET2021/3/93Expression Expression PLUS Expres

3、sion| Expression MINUS Expression| Expression MUL Expression| Expression DIV Expression| PLUS Expression| MINUS Expression| Expression POWER Expression| CONST_ID| T| FUNC L_BRACKET Expression R_BRACKET| L_BRACKET Expression R_BRACKET2021/3/94 改写文法为无二义文法 表达式中的运算结合性非终结符- PLUS、MINUS(二元) 左结合Expression M

4、UL、DIV左结合Term PLUS、MINUS(一元)右结合Factor POWER右结合Component(原子表达式)无Atom2021/3/95Expression 的改写Expression对应最低优先级的运算,PLUS和MINUS:Expression Expression PLUS Expression | Expression MINUS Expression引入Term提高算符的优先级,保留左递归使得算符左结合:Expression Expression PLUS Term | Expression MINUS Term | TermTerm对应运算MUL和DIV,于是有:T

5、erm Term MUL Term | Term DIV Term反复改写,最终得到:2021/3/96无二义的表达式文法Expression Expression PLUS Term | Expression MINUS Term | TermTerm Term MUL Factor | Term DIV Factor | FactorFactor PLUS Factor | MINUS Factor | ComponentComponent Atom POWER Component | AtomAtom CONST_ID | T | FUNC L_BRACKET Expression R_

6、BRACKET | L_BRACKET Expression R_BRACKET PLUS、MINUS Expression MUL、DIV Term PLUS、MINUS Factor POWER Component(原子表达式)Atom2021/3/97 消除无左递归和提取左因子(消除Program、Expression和Term 的左递归)Program Statement SEMICO Program | 改写Expression Term ExpressionExpression PLUS Term Expression | MIMUS Term Expression |Term F

7、actor TermTerm MUL Factor Term | DIV Factor Term |(Factor和Componet对应的运算是右结合,故无左递归)2021/3/98 改写左结合的产生式为EBNF形式 (避免子程序调用) Program Statement SEMICO Program |的子程序:void Program() if (token = NONTOKEN) return; Statement(); MathchToken(SEMICO); Program();Program Statement SEMICO 的子程序:void Program() while (t

8、oken != NONTOKEN) Statement(); MathchToken(SEMICO); 文法的改写:2021/3/99 改写Expression产生式: Expression Term ExpressionExpression PLUS Term Expression | MIMUS Term Expression | Expression(PLUS|MIMUS)Term Expression|Program Statement SEMICO Program | Expression (PLUS|MIMUS)Term Expression Term (PLUS|MINUS)Te

9、rm void Expressin()Term(); while (token=PLUS | token=MINUS) MathchToken(token); Term(); Expression的递归子程序:2021/3/910表达式的产生式Expression Term ( PLUS | MINUS) Term Term Factor ( MUL | DIV ) Factor Factor PLUS Factor | MINUS Factor | ComponentComponent Atom POWER Component | AtomAtom CONST_ID | T | FUNC L

10、_BRACKET Expression R_BRACKET | L_BRACKET Expression R_BRACKET 2021/3/9114.2.2 表达式的语法树 语法树的节点表达式语法树的节点可以设计为以下三类:1. 叶节点:常数、参数T等。2. 两个孩子的内部节点:二元运算如Plus、Mul等。 一元加:+5转化为5; 一元减:-5转化为0-5。3. 一个孩子的内部节点:函数调用,如sin(t)等。2021/3/912 节点的数据结构: typedef double (* FuncPtr)(double);struct ExprNode enum Token_Type OpCod

11、e;/ 记号种类 union struct ExprNode *Left, *Right; CaseOperator;/ 二元运算 struct ExprNode * Child; FuncPtr MathFuncPtr; CaseFunc;/ 函数调用 double CaseConst; / 常数,绑定右值 double * CaseParmPtr; / 参数T,绑定左值 Content; ; 2021/3/913表达式:-16+5*3/cos(T)+- /0.0 16 * cos5 3 TMINUS Left RightPLUS Left RightDIV Left RightCONST_

12、ID 0.0CONST_ID 16POWER Left RightFUNC cos child CONST_ID 5CONST_ID 3 T ptrparameter2021/3/914 语法树的建立(78页) #include double Parameter;struct ExprNode * MakeExprNode(enum Token_Type opcode, .) struct ExprNode *ExprPtr = new (struct ExprNode); ExprPtr-OpCode = opcode; va_list ArgPtr;va_start(ArgPtr, opc

13、ode); switch(opcode) case CONST_ID:/ 常数节点 ExprPtr-Content.CaseConst =(double)va_arg(ArgPtr,double); break; case T:/ 参数节点 ExprPtr-Content.CaseParmPtr=&Parameter; break;2021/3/915 case FUNC: / 函数调用节点ExprPtr-Content.CaseFunc.MathFuncPtr = (FuncPtr)va_arg(ArgPtr, FuncPtr);ExprPtr-Content.CaseFunc.Ch

14、ild =(struct ExprNode *)va_arg(ArgPtr,struct ExprNode *);break;default:/ 二元运算节点ExprPtr-Content.CaseOperator.Left =(struct ExprNode *)va_arg(ArgPtr,struct ExprNode *);ExprPtr-Content.CaseOperator.Right =(struct ExprNode *)va_arg(ArgPtr,struct ExprNode *);break;va_end(ArgPtr);return ExprPtr;2021/3/916

15、4.2.3 语法分析器的递归下降子程序 分析器所需的辅助子程序 void FetchToken (); void MatchToken (enum Token_Type AToken); void SyntaxError (int case_of); 主要产生式的递归子程序 2021/3/917void Parser(char * SrcFilePtr) if(!InitScanner(SrcFilePtr)/ 初始化词法分析器 printf(Open Source File Error ! n); return; FetchToken();/ 获取第一个记号Program();/ 进行递归下

16、降分析CloseScanner();/ 关闭词法分析器a) Parser的递归子程序2021/3/918b) ForStatement的递归子程序static void ForStatement (void) 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

17、(STEP); step_ptr = Expression(); MatchToken (DRAW); MatchToken (L_BRACKET); x_ptr = Expression(); MatchToken (COMMA); y_ptr = Expression(); MatchToken (R_BRACKET);ForStatment FOR T FROM Expression TO Expression STEP Expression DRAW L_BRACKET Expression COMMA Expression R_BRACKET2021/3/919c) Expressi

18、on的递归子程序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 = MakeExprNode(token_tmp,left,right); return left;Expression Term ( PLUS |

19、MINUS) Term 2021/3/9204.2.4 语法分析器的测试 测试主程序与测试辅助子程序 a) 测试主程序b) 打印语法树的子程序#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开始,对语法树进行深度优先的先序遍历,并且根据缩进值i

20、ndent将当前被遍历的节点打印在适当的位置上。 2021/3/921例 -16+5*3/cos(T)的语法树+ - 0.000000 16.000000 / * 5.000000 3.000000 402da4 T+- /0.0 16 * cos5 3 T2021/3/922 测试语句的嵌入与测试结果 a) 测试语句的加入: 1. 上层子程序入口与出口加入“enter”和“exit” 2. 终结符匹配后加入“mathctoken *” 3. 表达式(Expression)构造后,打印语法树b) 被测试源程序:FOR T FROM 0 TO 2*PI STEP PI/50 DRAW (cos(

21、T),sin(T);-16+5*3/cos(T)c) 测试结果(看程序运行)2021/3/923/ 上届同学的解答:c_comments /* (*|*/)* */ 习题解答:c_comments /* (*|*/)* */ 多重入口:c_comments /*/ (YACC)多重入口:c_comments BEGIN c_comment_entry ;/ 注释开始*/BEGIN 0; / 注释结束.;nLineNo +;结 束2021/3/924改写Program产生式:对于产生式: Program Statement SEMICO Program |按其不同的右部候选项展开,会得到下述序列: , Statement SEMICO, Statement SEMICO Statement SEMICO,.即“Statement SEMICO”被重复0或若干次,于是有:Program Statement SEMICO 返回2021/3/925FetchToken源程序:其中,token是存放记号的全程量; GetToken()是词法分析器接口; SyntaxErroe(case_of)是出错处理。static void FetchToken() token = GetToken(); if (token.type = ERR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论