




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、14.2 语法分析器的构造 主要工作:1设计函数绘图语言的文法,使适合递归下降分析;2设计语法树的节点,用于存放表达式的语法树;3设计递归下降子程序, 分析句子并构造表达式的语法树;4设计测试程序和测试用例,检验分析器是否正确。语法分析器的任务:分析语言的结构,构造语法树24.2.1 函数绘图语言的文法 program | program statement semicostatement originstatment | scalestatment | rotstatment | forstatmentoriginstatment origin is l_bracket expression
2、 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_bracket3expression expression plus expression| expression minus e
3、xpression| 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_bracket4 改写文法为无二义文法 表达式中的运算结合性非终结符- plus、minus(二元) 左结合expression mul、div左结合term plus、minus(一元)右结合f
4、actor power右结合component(原子表达式)无atom5expression 的改写expression对应最低优先级的运算,plus和minus:expression expression plus expression | expression minus expression引入term提高算符的优先级,保留左递归使得算符左结合:expression expression plus term | expression minus term | termterm对应运算mul和div,于是有:term term mul term | term div term反复改写,最终
5、得到:6无二义的表达式文法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_bracket | l_bracket expression r_bracket plus、mi
6、nus expression mul、div term plus、minus factor power component(原子表达式)atom7 消除无左递归和提取左因子(消除program、expression和term 的左递归)program statement semico program | 改写expression term expressionexpression plus term expression | mimus term expression |term factor termterm mul factor term | div factor term |(facto
7、r和componet对应的运算是右结合,故无左递归)8 改写左结合的产生式为ebnf形式 (避免子程序调用) program statement semico program |的子程序:void program() if (token = nontoken) return; statement(); mathchtoken(semico); program();program statement semico 的子程序:void program() while (token != nontoken) statement(); mathchtoken(semico); 文法的改写:9 改写ex
8、pression产生式: 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)term void expressin()term(); while (token=plus | token=minus) mathchtoken(
9、token); term(); expression的递归子程序:10表达式的产生式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_bracket expression r_bracket | l_bracket expression r_bracket 114.2.2 表达式的语法树 语
10、法树的节点表达式语法树的节点可以设计为以下三类:1. 叶节点:常数、参数t等。2. 两个孩子的内部节点:二元运算如plus、mul等。 一元加:+5转化为5; 一元减:-5转化为0-5。3. 一个孩子的内部节点:函数调用,如sin(t)等。12 节点的数据结构: typedef double (* funcptr)(double);struct exprnode enum token_type opcode;/ 记号种类 union struct exprnode *left, *right; caseoperator;/ 二元运算 struct exprnode * child; funcp
11、tr mathfuncptr; casefunc;/ 函数调用 double caseconst; / 常数,绑定右值 double * caseparmptr; / 参数t,绑定左值 content; ; 13表达式:-16+5*3/cos(t)+- /0.0 16 * cos5 3 tminus left rightplus left rightdiv left rightconst_id 0.0const_id 16power left rightfunc cos child const_id 5const_id 3 t ptrparameter14 语法树的建立(78页) #inclu
12、de double parameter;struct exprnode * makeexprnode(enum token_type opcode, .) struct exprnode *exprptr = new (struct exprnode); exprptr-opcode = opcode; va_list argptr;va_start(argptr, opcode); switch(opcode) case const_id:/ 常数节点 exprptr-content.caseconst =(double)va_arg(argptr,double); break; case
13、t:/ 参数节点 exprptr-content.caseparmptr=¶meter; break;15 case func: / 函数调用节点exprptr-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 ex
14、prnode *)va_arg(argptr,struct exprnode *);exprptr-content.caseoperator.right =(struct exprnode *)va_arg(argptr,struct exprnode *);break;va_end(argptr);return exprptr;164.2.3 语法分析器的递归下降子程序 分析器所需的辅助子程序 void fetchtoken (); void matchtoken (enum token_type atoken); void syntaxerror (int case_of); 主要产生式的
15、递归子程序 17void parser(char * srcfileptr) if(!initscanner(srcfileptr)/ 初始化词法分析器 printf(open source file error ! n); return; fetchtoken();/ 获取第一个记号program();/ 进行递归下降分析closescanner();/ 关闭词法分析器a) parser的递归子程序18b) forstatement的递归子程序static void forstatement (void) struct exprnode *start_ptr, *end_ptr, *step
16、_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(); matchtok
17、en (r_bracket);forstatment for t from expression to expression step expression draw l_bracket expression comma expression r_bracket19c) expression的递归子程序static struct exprnode * expression() struct exprnode *left, *right; token_type token_tmp; left = term(); while (token.type=plus | token.type=minus)
18、 token_tmp = token.type; matchtoken(token_tmp); right = term(); left = makeexprnode(token_tmp,left,right); return left;expression term ( plus | minus) term 204.2.4 语法分析器的测试 测试主程序与测试辅助子程序 a) 测试主程序b) 打印语法树的子程序#include extern void parser(char * srcfileptr);void main(int argc, char *argv) if(argc2)print
19、f(“input source!n ); return; parser(test.txt); void printsyntaxtree(struct exprnode *root, int indent); 从root开始,对语法树进行深度优先的先序遍历,并且根据缩进值indent将当前被遍历的节点打印在适当的位置上。 21例 -16+5*3/cos(t)的语法树+ - 0.000000 16.000000 / * 5.000000 3.000000 402da4 t+- /0.0 16 * cos5 3 t22 测试语句的嵌入与测试结果 a) 测试语句的加入: 1. 上层子程序入口与出口加入
20、“enter”和“exit” 2. 终结符匹配后加入“mathctoken *” 3. 表达式(expression)构造后,打印语法树b) 被测试源程序:for t from 0 to 2*pi step pi/50 draw (cos(t),sin(t);-16+5*3/cos(t)c) 测试结果(看程序运行)23/ 上届同学的解答:c_comments /* (*|*/)* */ 习题解答:c_comments /* (*|*/)* */ 多重入口:c_comments /*/ (yacc)多重入口:c_comments begin c_comment_entry ;/ 注释开始*/be
21、gin 0; / 注释结束.;nlineno +;结 束24改写program产生式:对于产生式: program statement semico program |按其不同的右部候选项展开,会得到下述序列: , statement semico, statement semico statement semico,.即“statement semico”被重复0或若干次,于是有:program statement semico 返回25fetchtoken源程序:其中,token是存放记号的全程量; gettoken()是词法分析器接口; syntaxerroe(case_of)是出错处理。static void fetchtoken() tok
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宁夏中学宁县达标名校2025年中考生物试题仿真卷:生物试题试卷(6)含解析
- 辽宁理工学院《室内陈设设计》2023-2024学年第二学期期末试卷
- 厦门灌口中学2025年第二学期期中七校联考高三物理试题含解析
- 2025年中级经济师考试试题及答案参考
- 山东传媒职业学院《影视与文学作品创排》2023-2024学年第二学期期末试卷
- 2025年医学综合素质能力考试试卷及答案
- 山东旅游职业学院《市场营销学》2023-2024学年第二学期期末试卷
- 2025年影视创作与策划职业资格考试卷及答案
- 江苏省南京市玄武区重点达标名校2025届5月初三第三次联考物理试题试卷含解析
- 昆明医科大学海源学院《教育统计与SPSS应用》2023-2024学年第二学期期末试卷
- 商事仲裁协议合同模板
- 2025年房地产顾问合同8篇
- DB3208T 213-2024国有资产管理工作规范
- 2025北京九年级(上)期末语文汇编:句子默写
- 2025-2030中国浆果行业市场发展趋势与前景展望战略研究报告
- 重庆征信有限责任公司招聘笔试题库2025
- 2025-2030中国网络贷款(融资)行业市场发展现状及发展趋势与投资研究报告
- 湖北省武汉市2025届高中毕业生四月调研考试政治试题及答案(武汉四调)
- 基建招聘面试题及答案
- 华为测试面试题及答案
- 第三方人员管理制度(22篇)
评论
0/150
提交评论