4 2 1递归下降分析程序构造 - 递归下降分析程序构造_第1页
4 2 1递归下降分析程序构造 - 递归下降分析程序构造_第2页
4 2 1递归下降分析程序构造 - 递归下降分析程序构造_第3页
4 2 1递归下降分析程序构造 - 递归下降分析程序构造_第4页
4 2 1递归下降分析程序构造 - 递归下降分析程序构造_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、1,编译原理,第四章 语法分析自上而下分析,2,第四章 语法分析自上而下分析,语法分析器的功能 自上而下分析面临的问题 LL(1)分析法 递归下降分析程序构造 预测分析程序,3,第四章 语法分析自上而下分析,语法分析器的功能 自上而下分析面临的问题 LL(1)分析法 消除文法的左递归 克服回溯 递归下降分析程序构造 预测分析程序,4,4.4 递归下降分析程序构造,构造不带回溯的自上而下分析程序 要消除文法的左递归性 克服回溯,5,构造不带回溯的自上而下分析器,主要思路 分析程序由一组递归过程组成, 对每一语法变量(非终结符)构造一个相应的子程序,识别对应的语法单位 通过子程序间的相互调用实现对

2、输入串的识别 这样的分析程序称为递归下降分析器(因为文法的定义通常是递归的) 几个全局过程和变量 ADVANCE,把输入串指示器IP指向下一个输入符号,即读入一个单字符号 SYM,IP当前所指的输入符号 ERROR,出错处理子程序,6,例:文法G(E): ETE E+TE | TFT T*FT | F(E) | i 每个非终结符有对应的子程序的定义,首先在分析过程中,当需要从某个非终结符出发进行展开(推导)时,就调用这个非终结符对应的子程序。,7,递归下降子程序,ATE | BC | 对应的递归下降子程序为 PROCEDURE A; BEGIN IF SYM FIRST(TE) THEN BE

3、GIN T;E END ELSE IF SYM FIRST(BC) THEN BEGIN B; C END ELSE IF SYM FOLLOW(A) THEN BEGIN END ELSE ERROR END;,ELSE IF SYM FOLLOW(A) THEN ERROR,8,例:文法G(E): ETE E+TE | TFT T*FT | F(E) | i 对应的递归下降子程序为,PROCEDURE F; IF SYM=i THEN ADVANCE ELSE IF SYM=( THEN BEGIN ADVANCE; E; IF SYM=) THEN ADVANCE ELSE ERROR

4、END ELSE ERROR;,9,例:文法G(E): ETE E+TE | TFT T*FT | F(E) | i 对应的递归下降子程序为,PROCEDURE E; BEGIN T;E END;,PROCEDURE E; IF SYM=+ THEN BEGIN ADVANCE; T;E END,PROCEDURE E; IF SYM=+ THEN BEGIN ADVANCE; T;E END ELSE IF SYM# AND SYM) THEN ERROR,E实现了吗 ? 实现了 没实现,FOLLOW(E)= ), # ,10,例:文法G(E): ETE E+TE | TFT T*FT |

5、F(E) | i 对应的递归下降子程序为,PROCEDURE E; BEGIN T;E END;,PROCEDURE E; IF SYM=+ THEN BEGIN ADVANCE; T;E END,E不考虑Follow集合有问题吗 ? 有问题 没有问题,PROCEDURE E; IF SYM=+ THEN BEGIN ADVANCE; T;E END ELSE IF SYM# AND SYM) THEN ERROR,11,PROCEDURE T; BEGIN F;T END,PROCEDURE T; IF SYM=* THEN BEGIN ADVANCE; F;T END;,例:文法G(E):

6、 ETE E+TE | TFT T*FT | F(E) | i 对应的递归下降子程序为,PROCEDURE T; IF SYM=* THEN BEGIN ADVANCE; F;T END ELSE IF SYM# AND SYM) AND SYM+ THEN ERROR,12,主程序: PROGRAM PARSER; BEGIN ADVANCE; E; IF SYM # THEN ERROR END;,13,在元符号“”和“|”的基础上,扩充几个元语言符号: 1. 用花括号表示闭包运算*。 2. 用表示0n可任意重复0次至n次,。 3. 用方括号表示01 ,即表示的出现可有可无(等价于|)。

7、引入上述元符号的文法亦称扩充的巴科斯范式。,文法的另一种表示法和转换图,14,例如,通常的“实数”可定义为: decimalsigninteger.digitexponent exponentEsigninteger integerdigitdigit sign + | - 用扩充的巴科斯范式来描述语法,直观易懂,便于表示左递归消去和因子提取。,15,例4.5 文法 ET | E+T TF | T*F Fi | (E) 可表示成 ET+T TF*F Fi | (E) (4.6),16,ET+T TF*F Fi | (E) (4.6) 可以用语法图来表示语言的文法,17,ET+T TF*F Fi

8、 | (E) (4.6) 可构造一组递归下降分析程序,PROCEDURE E; BEGIN T; WHILE SYM=+ DO BEGIN ADVANCE; T END END;,18,PROCEDURE T; BEGIN F; WHILE SYM=* DO BEGIN ADVANCE; F END END;,ET+T TF*F Fi | (E) (4.6) 可构造一组递归下降分析程序,19,ET+T TF*F Fi | (E) (4.6) 可构造一组递归下降分析程序,PROCEDURE F; IF SYM=i THEN ADVANCE ELSE IF SYM=( THEN BEGIN ADV

9、ANCE; E; IF SYM=) THEN ADVANCE ELSE ERROR END ELSE ERROR;,20,JavaCC,Java Compiler Compiler (JavaCC) - The Java Parser Generator ,JavaCC编译器,LL(K)语法分析源程序(含词法分析) Parser.java,JavaCC源程序 Parser.jj,Java编译器javac,LL(K)语法分析程序(含词法分析) Parser.class,运行LL(K)语法分析程序(含词法分析) java Parser.class,分析结果,输入串,LL(K)语法分析源程序(含词法

10、分析) Parser.java,21,JavaCC,.java Constants.java TokenManager.java ParseException.java SimpleCharStream.java Token.java TokenMgrError.java,22,JavaCC,JJTree 构建分析树的附加工具,23,实验作业,JavaCC实验 阅读:Howard Katz,JavaCC, parse trees, and the XQuery grammar (Part 1 /Part2) 运行其中的例子SimpleLang 用JavaCC构建一个C语言的语法分析程序 阅读C.JJ(在repository of JavaCC grammars中) 用JavaCC编译C.JJ,产生一个C的语法分析程序 运行该语法分析程序,输入一个C程序,观察输出结果 PL语言编译器实验 阅读实验指南的“第

温馨提示

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

评论

0/150

提交评论