版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026 学龄前自闭症居家实操课件
- 2026年新能源使用推广管理规范
- 2025年5月雅思考试回忆
- 2026年二级Java考试题库
- 六盘水市辅警招聘面试题及答案
- 连云港市辅警招聘考试题库及答案
- 2026年膀胱输尿管反流肾病诊疗试题及答案(肾内科版)
- 2026年胃神经内分泌肿瘤诊疗试题及答案(消化内科版)
- 获得性癫痫性失语Landau-Kleffner综合征护理查房
- 2026年国有资产管理考试题库
- 2026届江苏省苏北七市高三三模英语试题(含答案和音频)
- 山东省济南市2025-2026学年高一年级下学期期中检测物理试题(含答案)
- 2026年北京市大兴区初三一模物理试卷(含答案)
- 劳动项目五 《制作劳动作品集》 (教学设计)2023-2024学年人教版《劳动教育》五年级下册
- 医院安全知识培训课件
- DBJ15-22-2021-T 锤击式预应力混凝土管桩工程技术规程(广东省)
- 国开2024年秋《机械制图》形考作业1-4答案
- 年产10万吨正丁醇生产工艺的设计
- GJB438B《软件需求规格说明》
- 外科学课件:离体肠吻合
- Unit+3+Using+Language++Reducing+water+pollution+in+the+Li+Rive+课件【知识精讲精研+能力培优提升】高中英语人教版(2019)选择性必修第三册
评论
0/150
提交评论