文法的左递归性和回溯的消除

1. 文法左递归的消除

当一个文法是左递归文法时,采用自上而下分析法会使分析过程进入无穷循环之中。文法左递归是指文法中的某个非终结符 A 存在推导 A ⇒+ Aα ,而自上而下分析法是施行最左推导,即每次替换都是当前句型中的最左非终结符,当试图用非终结符 A 去匹配输入串时,结果使当前句型的最左非终结符仍然为 A ,也就是说,在没有读进任何输入符号的情况下,又重新要求 A 去进行新的匹配,于是造成无穷循环。所以采用自上而下分析法进行语法分析需要消除文法的左递归性。

对含直接左递归的规则进行等价变换,消除左递归。

(1 )引进一个新的非终结符,把含左递归的规则改写成右递归。
设关于非终结符 A 的直接左递归的规则为
A → Aα | β
其中 α ,β 是任意的符号串,且 β 不以 A开头,对 A 的规则可改写成如下右递归形式:

A → β A'
A' → αA' | ε

改写以后的形式和原来形式是等价的。也就是说,从 A 推出的符号串的集合是相同的。
一般情况下,设文法中关于 A 的规则为

A → Aα 1 | Aα 2 | … | Aα m | β 1 | β 2 | … | β n

其中每个 α 都不等于 ε ,而每个 β 都不以 A 开头,消除直接左递归后改写为

A → β 1 A' | β 2 A' | … | β n A'
A' → α 1 A' | α 2 A' | … | α m A' | ε

【例 4.2 】设有文法 G [ E ]:

E → E + T | E - T | T
T → T * F | T / F | F
F → ( E ) | id

消去非终结符 E , T 的直接左递归后,文法 G [ E ]改写为

E → TE'
E' →+ TE' |- TE' | ε
T → FT'
T' → * FT' | / FT' | ε
F → ( E ) | id

【例 4.3 】设有文法 G [ A ]:

A → Ac | Aad | bd | e

消去直接左递归后文法 G [ A ]改写为

A → bdA' | eA'A' → cA' | adA' | ε

(2 )采用扩充 BNF 表示法改写含直接左递归的规则。
在扩充的 BNF 表示中,有如下约定:
① 使用花括号{ α }表示符号串 α 的出现可 0 次或多次,即表示 α* 。

例如,定义标识符的文法<标识符> → l | <标识符> l | <标识符>d ,使用扩充 BNF 表示可改写成<标识符> → l {l | d }形式。

② 使用方括号[ α ]表示 α 的出现可有可无,它用来表示可供选择的符号串。例如,定义 C 语
言中条件语句的文法是
<条件语句> →if <布尔表达式><语句> |if <布尔表达式><语句>; else <语句>
用扩充 BNF 表示可改写成如下形式:
<条件语句> →if <布尔表达式><语句>[; else <语句>]

③ 使用圆括号可在规则中提取因子。例如
A → xα 1 | xα 2 | … | xα m 可写为 A → x ( α 1 | α 2 | … | αm )

【例 4.4 】对例 4.2 中文法用扩充 BNF 表示法对其进行改写。
分析 规则 E → E + T | E - T | T 和 T → T * F | T / F | F 表示了 E 所生成的符号串由 T 开头且后跟 0 个或多个 + T 或 - T ; T 所生成的符号串由 F 开头且后面跟 0 个或多个 * F或/ F ,所以原文法可改写成如下形式:

E → T { + T |- T }
T → F { * F | / F }
F → ( E ) | id

【例 4.5 】对例 4.3 中文法用扩充 BNF 表示法对其进行改写。
分析 规则 A → Ac | Aad | bd | e 表示了 A 所生成的符号串是以 bd 或 e 开头,后面跟 0个或多个 c 或 ad ,所以原文法可以改写成如下形式:

A → ( bd | e ){ c | ad }

文法的左递归性和回溯的消除相关推荐

  1. 语法分析-自上而下分析 知识总结

    语法分析-自上而下分析 基本思想 回溯与左递归 LL(1)文法 构建不带回溯的自上而下分析算法 消除文法的左递归性 克服回溯 1. FRIST集 2. 提取公共左因子 3. FOLLOW集 4. 构造 ...

  2. 编译原理(4):语法分析(自上而下)

    上一篇说了词法分析这次说语法分析,这两部分是一脉相承的.(上一篇在这) 要进行语法分析,必须对语言的语法结构进行描述. 采用正规式和有限自动机可以描述和识别语言的单词符号: 用上下文无关文法(前面已经 ...

  3. 非LL(1)文法到LL(1)文法的等价变换

    我们喜欢和需要使用是LL(1)文法,但是我们往往遇到的文法不是LL(1)文法这时候需要将它进行转换转换成LL(1)文法. 这里给出两种方法分别是提取左公因子和消除左递归 1 提取左公因子 含有左公共因 ...

  4. 语法分析--自上而下分析的基本问题

    语法分析基本概念 语法分析的前提:对语言的语法结构进行描述,采用正规式和有限自动机描述和识别语言的单词符号, 用上下文无关文法来描述语法规则 语法分析的任务:分析一个文法的句子的结构 语法分析器的功能 ...

  5. 课程设计是计算机科学与技术专业的一门,计算机107编译原理课程设计.doc

    淮阴工学院 编译原理课程设计指导书 王文豪 江苏·淮阴工学院·计算机工程系 二OO九年三月 前言 <编译原理>是计算机科学与技术专业最重要的一门专业基础课程,内容庞大,涉及面广,知识点多. ...

  6. 编译原理题练习题测试题

    1.编译程序分为哪几个逻辑阶段,各阶段的主要功能是什么? 2.考虑文法 S(L) | a LL, S | S (1)给出(a,(a, a))的最右推导. (2)给出(a,(a, a))的语法分析树. ...

  7. 【编译原理】 实验三 LL(1)分析法(LL1分析表的自动生成)

    写在前面 由于代码较长,csdn对文章总长度有字数限制,想只看完整代码的请移步另一篇博客. https://blog.csdn.net/qq_46640863/article/details/1257 ...

  8. 国防科学技术大学 编译原理国家级精品课程

    国防科学技术大学 编译原理国家级精品课程          王挺 五十多年以来,随着编译技术的发展,有关编译原理和技术的内容被逐步引入到了计算机专业本科教学中.从早期各阶段 ACM 和 IEEE 的计 ...

  9. 语法分析器---预测分析程序

    实验二  预测分析算法的设计与实现 (8学时) 一.实验目的 通过预测分析算法的设计与实现,加深对自上而下语法分析方法的理解,尤其是对自上而下分析条件的理解. 二.实验要求   输入文法及待分析的输入 ...

最新文章

  1. TensorFlow快餐教程:程序员快速入门深度学习五步法
  2. Thymeleaf在循环时设置递增序号
  3. OCM备考 一、Server config 之管理表空间
  4. php 正则第一个,为什么这个正则表达式与php中的第一个结果不匹配?
  5. Ubuntu 16.04 + Nginx + Django 项目部署
  6. Sound Ventures斥资百万美元举行NFT竞赛活动
  7. 深入理解 MVC 中的 M 与 C
  8. zabbix系列(八)zabbix添加对web页面url的状态监控
  9. 在windows、linux中开启nginx的Gzip压缩大大提高页面、图片加载速度转
  10. TCP的三次握手和四次挥手(超详解)
  11. php相册上传和删除吗,php上传与删除图片的简单范例
  12. Qt|表格代理的实现及使用代码qtableview和qtablewidget均适用
  13. python分割PDF
  14. 怎样在Mac上的Safari中观看YouTube画中画?
  15. 1byte、1KB、4KB,1MB、1GB用16进制表示的范围。任意地址范围求字节数
  16. 内容权限判断帝国cms教程
  17. 谷歌浏览器那些有趣的隐藏功能
  18. 破茧成蝶 醉在刹那间的浪漫 iGame G-ONE为爱而生
  19. Week 4.2 | Lecture 10 | 多态性设计通用方法、比较器 | CS61B-Spring-2018
  20. 你业余时间在做什么?

热门文章

  1. [笔试补完计划]澜起科技2022数字验证笔试
  2. 计算机excel没点保存,电脑突然关机excel没保存
  3. Editplus 激活码
  4. (函数)JavaScript中延迟毫秒执行
  5. 【热门主题:快乐海贼王动漫主题】
  6. 7年老Java一次坑爹的面试经历,鸟哥的linux私房菜
  7. c++语言基础:delete和delete[]
  8. SI Engineer眼里的USB信号
  9. MCSE2000认证专题
  10. 地图参考系的那些事儿+你可能忽略的小知道