lr0文法分析表示例_编译原理中的语法分析-自上而下分析的基本问题

本文介绍了编译原理中的自上而下的语法分析方法,包括其任务、问题(左递归和回溯)以及解决策略。重点讲解了如何消除文法的左递归,分为直接左递归和间接左递归的消除方法,同时阐述了FIRST和FOLLOW集合在消除回溯中的作用。
摘要由CSDN通过智能技术生成

3e8b279168d1aac7d482a7e2070c0eeb.png

目录

  • 目录
  • 1. 背景
  • 2. 语法分析
    • 2.1. 语法分析的前提
    • 2.2. 语法分析的任务
    • 2.3. 语法分析器在编译器中的地位
    • 2.4. 语法分析的方法
    • 2.5. 自上而下分析方法的问题
  • 3. 消除文法的左递归
    • 3.1. 直接左递归的消除
    • 3.2. 间接左递归的消除
  • 4. 消除回溯
    • 4.1. FIRST集合
    • 4.2. 提取公共左因子
    • 4.3. FOLLOW集合
  • 5. 参考文献

1. 背景

今天学习了编译原理中的语法分析-自上而下分析的基本问题这一章节,我参考了国防工业出版社《编译原理》教材1 和中国大学MOOC-国防科技大学《编译原理》的PPT,整理了这一章的内容,希望能够理解这部分的知识。

2. 语法分析

2.1. 语法分析的前提

  • 对语言的语法结构进行描述
  1. 采用正规式有限自动机描述和识别语言的单词符号
  2. 上下文无关文法来描述语法规则

2.2. 语法分析的任务

  • 语法分析的任务
    • 分析一个文法的句子的结构
  • 语法分析器的功能
    • 按照文法的产生式(语言的语法规则),识别输入符号串是否为一个句子(合式程序)

2.3. 语法分析器在编译器中的地位

c23cfd415d154f237f36648ae1c07c19.png
语法分析器在编译器中的地位

2.4. 语法分析的方法

2.4.1. 自下而上(Bottom-up)

  • 定义:从输入串开始,逐步进行归约,直到文法的开始符号
  • 归约:根据文法的产生式规则,把串中出现的产生式的右部替换成左部符号
  • 特点:从树叶节点开始,构造语法树
  • 方法:算符优先分析法、LR分析法

2.4.2. 自上而下(Top-down)

  • 定义:从文法的开始符号出发,反复使用各种产生式,寻找"匹配"的推导
  • 推导:根据文法的产生式规则,把串中出现的产生式的左部符号替换成右部
  • 特点:从树的根开始,构造语法树
  • 方法:递归下降分析法、预测分析程序

2.5. 自上而下分析方法的问题

2.5.1. 文法左递归问题

  • 定义:一个文法是含有左递归的,如果存在非终结符P

含有左递归的文法使上述的自上而下分析过程陷入无限循环。

2.5.2. 回溯问题

  • 定义:分析过程中,当一个非终结符用某一个候选匹配成功时,这种匹配可能是暂时的。出错时,不得不“回溯”。

3. 消除文法的左递归

3.1. 直接左递归的消除

  • 假定P关于的全部产生式是

(每个

都不等于
,每个
都不以
开头)
  • 左递归变右递归

3.2. 间接左递归的消除

  • 间接左递归定义:给定文法
    :

虽然不存在直接左递归,但

都是左递归的,例如有


  • 一个文法消除左递归的条件
    • 不含以ε为右部的产生式
    • 不含回路

  • 消除左递归的算法:
  1. 把文法G的所有非终结符按任一种顺序排列
  2. 按此顺序执行如下伪代码
FOR i:=1 TO n DO
BEGIN
    FOR j:=1 TO i-1 DO
        (1)
    (2)
END

(1) 把形如

的规则改写成

( 其中

是关于
的所有规则 )

(2) 消除关于

规则的直接左递归性

3. 化简由 2 所得的文法,去除从开始符号出发永远无法到达的非终结符的产生规则。


  • 举例:给定文法
    如下

  1. 将非终结符排序为
    。对于
    ,不存在直接左递归。
  2. 带入到
    的有关候选后,我们把
    的规则变为

现在

同样不包含直接左递归,把它带入到
的有关候选后,
变成

接着消除

的直接左递归,最后得到的文法为

3. 显然,其中关于

的规则已经多余了,我们可以对它们进行化简,最后得到的结果如下。

  • 注意:由于对非终结符排序的不同,最后所得的文法在形式上可能不一样。但不难证明,它们都是等价的。

4. 消除回溯

  • 条件:
    • 对文法的任何非终结符,当要它去匹配输入串时,能够根据它所面临的输入符号准确地指派它的一个候选去执行任务,并且此候选的工作结果应是确信无疑的。

即假设现在轮到非终结符

去执行匹配任务,
共有
个候选,即

面临一个输入符号
时,如果输入串是一个合法的句子,那么
能够指派某个唯一确定的候选
来匹配
,若不能匹配
,说明输入串不是合法的句子。

4.1. FIRST集合

  • 定义:令
    是一个不含左递归的文法,对
    的所有非终结符的每个候选
    定义它的终结首符集
    为:

特别是,若

, 则规定:

换句话说,

的所以可能推导的开头终结符 或可能的
。 如果非终结符
的所有候选首符集两两不相交,即
的任何两个不同候选

那么,当要求

匹配输入串时,
就能根据它所面临的第一个输入符号
,准确地指派某一个候选前去执行任务。这个候选就是那个终结首符集含
.

4.2. 提取公共左因子

假定关于A的规则是

(其中,每个

不以
开头)

那么,可以把这些规则改写成

经过反复提取左因子,就能够把每个非终结符(包括新引进者)的所有候选首符集变成为两两不相交。

如果空字

属于某个非终结符的候选首符集,那么问题就比较复杂。引入Follow集合。

4.3. FOLLOW集合

假定

是文法
的开始符号,对于
的任何非终结符
,我们定义
的FOLLOW集合

特别是,若

则规定

表示若

在句子的末尾,则标示句子末尾的
集合中。

注:部分内容整理自国防工业出版社《编译原理》教材和中国大学MOOC-国防科技大学《编译原理》PPT

5. 参考文献

[1] 陈火旺. 编译原理 [M]. 北京 : 国防工业出版社, 2010.


联系邮箱:curren_wong@163.com

Github:https://github.com/CurrenWong

欢迎转载/Star/Fork,有问题欢迎通过邮箱交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值