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

下载本文档

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

文档简介

4.2语法分析器的构造

主要工作:1.设计函数绘图语言的文法,使适合递归下降分析;2.设计语法树的节点,用于存放表达式的语法树;3.设计递归下降子程序,分析句子并构造表达式的语法树;4.设计测试程序和测试用例,检验分析器是否正确。语法分析器的任务:分析语言的结构,构造语法树1最完整的语法分析器的构造4.2.1函数绘图语言的文法Program→ε|ProgramStatementSEMICOStatement→OriginStatment|ScaleStatment|RotStatment|ForStatmentOriginStatment→ORIGINISL_BRACKETExpressionCOMMAExpressionR_BRACKETScaleStatment→SCALEISL_BRACKETExpressionCOMMAExpressionR_BRACKETRotStatment→ROTISExpressionForStatment→FORTFROMExpressionTOExpressionSTEPExpressionDRAWL_BRACKETExpressionCOMMAExpressionR_BRACKET2最完整的语法分析器的构造Expression →ExpressionPLUSExpression |ExpressionMINUSExpression |ExpressionMULExpression |ExpressionDIVExpression |PLUSExpression |MINUSExpression |ExpressionPOWERExpression |CONST_ID |T |FUNCL_BRACKETExpressionR_BRACKET |L_BRACKETExpressionR_BRACKET3最完整的语法分析器的构造<2>改写文法为无二义文法

表达式中的运算 结合性 非终结符-----------------------------------------------PLUS、MINUS(二元) 左结合 ExpressionMUL、DIV

左结合 TermPLUS、MINUS(一元) 右结合

FactorPOWER

右结合

Component(原子表达式) 无

Atom4最完整的语法分析器的构造Expression的改写Expression对应最低优先级的运算,PLUS和MINUS:Expression→ExpressionPLUSExpression|ExpressionMINUSExpression引入Term提高算符的优先级,保留左递归使得算符左结合:Expression→ExpressionPLUSTerm|ExpressionMINUSTerm|TermTerm对应运算MUL和DIV,于是有:Term→TermMULTerm|TermDIVTerm反复改写,最终得到:5最完整的语法分析器的构造无二义的表达式文法Expression→ExpressionPLUSTerm|ExpressionMINUSTerm|TermTerm→TermMULFactor|TermDIVFactor|FactorFactor→PLUSFactor|MINUSFactor|ComponentComponent→AtomPOWERComponent|AtomAtom→CONST_ID|T|FUNCL_BRACKETExpressionR_BRACKET|L_BRACKETExpressionR_BRACKET

PLUS、MINUS

ExpressionMUL、DIV

TermPLUS、MINUSFactorPOWER

Component(原子表达式)Atom6最完整的语法分析器的构造<3>消除无左递归和提取左因子

(消除Program、Expression和Term

的左递归)Program→StatementSEMICOProgram|ε改写Expression→TermExpression'Expression'→PLUSTermExpression'|MIMUSTermExpression'|εTerm→FactorTerm'Term'→MULFactorTerm'|DIVFactorTerm'|ε(Factor和Componet对应的运算是右结合,故无左递归)7最完整的语法分析器的构造<4>改写左结合的产生式为EBNF形式

(避免子程序调用)

Program→StatementSEMICOProgram|ε的子程序:voidProgram(){ if(token==NONTOKEN)return; Statement();MathchToken(SEMICO);Program();}Program→{StatementSEMICO}的子程序:voidProgram(){while(token!=NONTOKEN){Statement();MathchToken(SEMICO);}}

文法的改写:8最完整的语法分析器的构造

改写Expression产生式:Expression→TermExpression'Expression'→PLUSTermExpression'|MIMUSTermExpression'|εExpression'→(PLUS|MIMUS)TermExpression'|εProgram→StatementSEMICOProgram|εExpression'→{(PLUS|MIMUS)Term}

Expression→Term{(PLUS|MINUS)Term}voidExpressin(){ Term();while(token==PLUS||token==MINUS) {MathchToken(token);Term();}}Expression的递归子程序:9最完整的语法分析器的构造表达式的产生式Expression→Term{(PLUS|MINUS)Term}Term→Factor{(MUL|DIV)Factor}Factor→PLUSFactor|MINUSFactor|ComponentComponent→AtomPOWERComponent|AtomAtom→CONST_ID|T |FUNCL_BRACKETExpressionR_BRACKET|L_BRACKETExpressionR_BRACKET10最完整的语法分析器的构造4.2.2表达式的语法树

<1>语法树的节点

表达式语法树的节点可以设计为以下三类:1.

叶节点:常数、参数T等。2.两个孩子的内部节点:二元运算如Plus、Mul等。

一元加:+5转化为5;一元减:-5转化为0-5。3.一个孩子的内部节点:函数调用,如sin(t)等。11最完整的语法分析器的构造<2>节点的数据结构:

typedefdouble(*FuncPtr)(double);structExprNode{ enumToken_TypeOpCode; //记号种类

union {struct{ExprNode*Left,*Right;}CaseOperator;//二元运算

struct{ExprNode*Child;FuncPtrMathFuncPtr;}CaseFunc; //函数调用

doubleCaseConst; //常数,绑定右值

double*

CaseParmPtr;//参数T,绑定左值

}Content;};12最完整的语法分析器的构造表达式:-16+5**3/cos(T)13最完整的语法分析器的构造<3>语法树的建立(78页)

#include<stdarg.h>doubleParameter; structExprNode*MakeExprNode(enumToken_Typeopcode,...){structExprNode*ExprPtr=new(structExprNode); ExprPtr->OpCode=opcode; va_listArgPtr; va_start(ArgPtr,opcode); switch(opcode) {caseCONST_ID: //常数节点

ExprPtr->Content.CaseConst=(double)va_arg(ArgPtr,double); break; caseT: //参数节点

ExprPtr->Content.CaseParmPtr=&Parameter; break;14最完整的语法分析器的构造caseFUNC: //函数调用节点

ExprPtr->Content.CaseFunc.MathFuncPtr=(FuncPtr)va_arg(ArgPtr,FuncPtr); ExprPtr->Content.CaseFunc.Child=(structExprNode*)va_arg(ArgPtr,structExprNode*); break; default: //二元运算节点

ExprPtr->Content.CaseOperator.Left=(structExprNode*)va_arg(ArgPtr,structExprNode*); ExprPtr->Content.CaseOperator.Right=(structExprNode*)va_arg(ArgPtr,structExprNode*); break; } va_end(ArgPtr); returnExprPtr;}15最完整的语法分析器的构造4.2.3语法分析器的递归下降子程序

<1>分析器所需的辅助子程序

voidFetchToken();voidMatchToken(enumToken_TypeAToken);voidSyntaxError(intcase_of);<2>主要产生式的递归子程序16最完整的语法分析器的构造voidParser(char*Src){if(!InitScanner(Src))//初始化词法分析器

{printf("OpenSource!\n");return;} FetchToken(); //获取第一个记号

Program(); //进行递归下降分析

CloseScanner(); //关闭词法分析器}a)Parser的递归子程序17最完整的语法分析器的构造b)ForStatement的递归子程序staticvoidForStatement(void){ structExprNode*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();MatchToken(COMMA);y_ptr=Expression();MatchToken(R_BRACKET);}ForStatment→FORTFROMExpressionTOExpressionSTEPExpressionDRAWL_BRACKETExpressionCOMMAExpressionR_BRACKET18最完整的语法分析器的构造c)Expression的递归子程序staticstructExprNode*Expression(){ structExprNode*left,*right;Token_Typetoken_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);}returnleft;}Expression→Term{(PLUS|MINUS)Term}19最完整的语法分析器的构造4.2.4语法分析器的测试

<1>测试主程序与测试辅助子程序

a)测试主程序b)打印语法树的子程序#include<stdio.h>externvoidParser(char*Src);voidmain(intargc,char*argv[]){if(argc<2){printf(“InputSource!\n");return;}Parser("test.txt"); }voidPrintSyntaxTree(structExprNode*root,intindent);

从root开始,对语法树进行深度优先的先序遍历,并且根据缩进值indent将当前被遍历的节点打印在适当的位置上。20最完整的语法分析器的构造例-16+5**3/cos(T)的语法树+ - 0.000000 16.000000 / ** 5.000000 3.000000 402da4 T21最完整的语法分析器的构造<2>测试语句的嵌入与测试结果

a)测试语句的加入:

1.上层子程序入口与出口加入“enter”和“exit”2.终结符匹配后加入“mathctoken***”3.表达式(Expression)构造后,打印语法树b)被测试源程序:FORTFROM0TO2*PISTEPPI/50DRAW(cos(T),sin(T));-16+5**3/cos(T)c)测试结果(看程序运行)22最完整的语法分析器的构造//上届同学的解答:

c_comments/*([^*]|**[^*/])****///习题解答:

c_comments/*([^*]|*[^/])**///多重入口:

c_comments/*//(YACC)多重入口:{c_comments} BEGINc_comment_entry;//注释开始<c_comment_entry>"*/" BEGIN0; //注释结束<c_comment_entry>. ;<c_comment_entry>\n LineNo++;结束23最完整的语法分析器的构造改写Program产生式:对于产生式:

Program→StatementSEMICOProgram|ε按其不同的右部候选项展开,会得到下述序列:

ε,

StatementSEMICO,

StatementSEMICOStatementSEMICO,...即“StatementSEMICO”被重复0或若干次,于是有:Program→{StatementSEMICO}

返回24最完整的语法分析器的构造FetchToken源程序:其中,token是存放记号的全程量;

GetToken()是词法分析器接口;

SyntaxErroe(case_of)是出错处理。staticv

温馨提示

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

评论

0/150

提交评论