编译原理------语法分析器(一) 自上而下的推导(LL1文法)

一、语法分析器功能

在词法分析识别出的单词符号的基础上,分析并判定程序的语法结构是否符合语法规则

二、语法分析工作方式

语法分析的过程:通过推导或者归约的方式构造一棵语法树。

  • 推导:从文法的起始符出发进行句子的推导,即自上而下的分析。
  • 归约:从句子本身出发,进行归约,看能否把句子约为到起始符,即自下而上的分析

三、自上而下分析的语法分析器的构造方法

  • 递归下降分析程序
  • 预测分析程序

四、自上而下分析面临的问题及解决

1、问题

  1. 文法的左递归问题。(直接左递归或间接左递归)
  2. 回溯的不确定性,要求我们将已经完成的工作推倒重来。
  3. 虚假匹配(自动匹配机制引起的)的问题。
  4. 不能准确的确定输入串中的出错位置。
  5. 效率低。

2、解决方法

通过将文法转化成 LL(1)型文法L:left->right扫描;L:最左推导

2.1 消除左递归

对于非终结符 P,有两种的候选式,包含左递归 和 不包含左递归。

P-> Pa1|Pa2||Pa1m| b1| b2 |…| bn

引入 P’,拆分 P的候选式

P -> b1 P’| b2 P’|…| bn P’ --不包含左递归。

P’->a1P’| a2P’| …| amP’| ɛ -- 包含左递归。

例子:

对于间接左递归,展开成直接左递归

2.2 提取公共左因子——解决回溯问题

要求:在使用非终结符对输入串进行匹配时,能根据输入字符准确地选择一个候选式。

即:对于任意终结符A 的所有候选式的First集两两不相交

First集,又称终结符首符集:First(ɑ) 是候选式 ɑ 的所有可能推导的开头终结符或者可能的ɛ。

例如:FIRST(E) = FIRST(TE') = FIRST(T) = FIRST(F) = FIRST((E)) ∪ FIRST(i)={ ( , i }

特殊情况:

当文法:

    E -> Tb | a

    T -> c | ɛ

由于:First(T) = { c, ɛ },即 T -> ɛ,因此 E -> Tb   ==>  E -> b;

First(Tb) = First(Tb) + First(a) = First(T) - ɛ + First(b) + First(a) = { c, b, a }

提取公共左因子:

2.3 Follow集——解决虚假匹配

造成原因:空字的自动匹配机制。

解决:对于候选式 含有空子 的非终结符,进行判定是否自动匹配。

Follow(非终结符):所有句型中出现在紧接A之后的终结符或‘#’。

计算Follow集:

  1. 对于文法起始符S,将‘#’置入Follow(S)。
  2. 对于A->ɑBβ,将 First(β) - ɛ 加入 Follow(B)。
  3. 对于A->ɑB,或者 A->ɑBβ且First(β)含有ɛ, 则 把 Follow(A) 加入 Follow(B)。

3、LL(1)文法

  1. LL(1)文法不含有左递归。
  2. 每一个非终结符的候选式,其First集两两互不相交。
  3. 对于具有A->ɛ的非终结符A,其 Follow(A) ∩ First(A) = ɸ。

五、基于LL(1)文法构造递归下降分析程序

一个非终结符编写一个含有递归的程序。

六、基于LL(1)文法构造预测分析程序

使用一张分析表和一个栈进行联合控制。

1、程序结构

  • 执行程序(总控程序)
  • 分析表

预测分析表:指导分析过程中候选式的选取。

  • 符号栈

四种工作状态:开始状态【#, 起始符】、工作状态、出错状态、结束状态【#】

2、分析表的构造

  1. 计算First(非终结符)集合

对于产生式规则,将其填写到(非终结符,a)的表格中,其中a ∈ First(非终结符)

  1. 计算Follow(非终结符)集合

若First(非终结符)包含 ɛ,则将 非终结符 -> ɛ,填写到 (非终结符, b),其中b∈Follow(非终结符)。

  1. 空白出填写出错标志

3、出错处理

  • 出错1:栈顶的终结符与当前输入符不匹配。

解决方法:直接将栈顶出栈。

  • 出错2:栈顶为非终结符A,输入符为a,而分析表M[A,a]为空。

解决方法:允许自动匹配,进行自动匹配,以推迟检测到错误的时间;或者跳过输入串的一些符号,直到遇到同步符号。

4、预测分析程序的分析过程

  1. 将‘#’和起始符入栈;输入符号为字符串的第一个字符。
  2. 查询分析表,决定操作:使用规则替换(产生式右部逆序入栈)、出栈且读入下一个符号、出错、接受。

例题:根据上面的预测分析表,分析 # i+i*i #的分析过程。(#...#,是一个句子的开始符和结束符)。

含有出错处理的分析过程:

七、总结

 -------------------------------------------------------END-------------------------------------------------------------------

任意门:

编译原理------概述-优快云博客

编译原理------文法-优快云博客

编译原理------词法分析器-优快云博客

编译原理------语法分析(二)自下而上的归约(算符优先,LR分析)-优快云博客

编译原理------语义规则的描述工具(属性文法)和属性计算过程(语法制导翻译)-优快云博客

 编译原理------语义分析器之中间代码的表示形式-优快云博客

 

递归下降分析法 、实验目的: 根据某文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。 二、实验说明 1、递归下降分析法的功能 词法分析器的功能是利用函数之间的递归调用模拟语法自上而下的构造过程。 2、递归下降分析法的前提 改造文法:消除二义性、消除左递归、提取左因子,判断是否为LL1文法, 3、递归下降分析法实验设计思想及算法 为G的每个非终结符号U构造个递归过程,不妨命名为U。 U的产生式的右边指出这个过程的代码结构: (1)若是终结符号,则和向前看符号对照, 若匹配则向前进个符号;否则出错。 (2)若是非终结符号,则调用与此非终结符对应的过程。当A的右部有多个产生式时,可用选择结构实现。 三、实验要求 ()准备: 1.阅读课本有关章节, 2.考虑好设计方案; 3.设计出模块结构、测试数据,初步编制好程序。 (二)上课上机: 将源代码拷贝到机上调试,发现错误,再修改完善。第二次上机调试通过。 (三)程序要求: 程序输入/输出示例: 对下列文法,用递归下降分析法对任意输入的符号串进行分析: (1)E->eBaA (2)A->a|bAcB (3)B->dEd|aC (4)C->e|dc 输出的格式如下: (1)递归下降分析程序,编制人:姓名,学号,班级 (2)输入以#结束的符号串:在此位置输入符号串例如:eadeaa# (3)输出结果:eadeaa#为合法符号串 注意: 1.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好); 2.对学有余力的同学,可以详细的输出推导的过程,即详细列出每步使用的产生式。 (四)程序思路 0.定义部分:定义常量、变量、数据结构。 1.初始化:从文件将输入符号串输入到字符缓冲区中。 2.利用递归下降分析法分析,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值