文法的左递归性和回溯的消除
文法的左递归性和回溯的消除
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 }
文法的左递归性和回溯的消除相关推荐
- 语法分析-自上而下分析 知识总结
语法分析-自上而下分析 基本思想 回溯与左递归 LL(1)文法 构建不带回溯的自上而下分析算法 消除文法的左递归性 克服回溯 1. FRIST集 2. 提取公共左因子 3. FOLLOW集 4. 构造 ...
- 编译原理(4):语法分析(自上而下)
上一篇说了词法分析这次说语法分析,这两部分是一脉相承的.(上一篇在这) 要进行语法分析,必须对语言的语法结构进行描述. 采用正规式和有限自动机可以描述和识别语言的单词符号: 用上下文无关文法(前面已经 ...
- 非LL(1)文法到LL(1)文法的等价变换
我们喜欢和需要使用是LL(1)文法,但是我们往往遇到的文法不是LL(1)文法这时候需要将它进行转换转换成LL(1)文法. 这里给出两种方法分别是提取左公因子和消除左递归 1 提取左公因子 含有左公共因 ...
- 语法分析--自上而下分析的基本问题
语法分析基本概念 语法分析的前提:对语言的语法结构进行描述,采用正规式和有限自动机描述和识别语言的单词符号, 用上下文无关文法来描述语法规则 语法分析的任务:分析一个文法的句子的结构 语法分析器的功能 ...
- 课程设计是计算机科学与技术专业的一门,计算机107编译原理课程设计.doc
淮阴工学院 编译原理课程设计指导书 王文豪 江苏·淮阴工学院·计算机工程系 二OO九年三月 前言 <编译原理>是计算机科学与技术专业最重要的一门专业基础课程,内容庞大,涉及面广,知识点多. ...
- 编译原理题练习题测试题
1.编译程序分为哪几个逻辑阶段,各阶段的主要功能是什么? 2.考虑文法 S(L) | a LL, S | S (1)给出(a,(a, a))的最右推导. (2)给出(a,(a, a))的语法分析树. ...
- 【编译原理】 实验三 LL(1)分析法(LL1分析表的自动生成)
写在前面 由于代码较长,csdn对文章总长度有字数限制,想只看完整代码的请移步另一篇博客. https://blog.csdn.net/qq_46640863/article/details/1257 ...
- 国防科学技术大学 编译原理国家级精品课程
国防科学技术大学 编译原理国家级精品课程 王挺 五十多年以来,随着编译技术的发展,有关编译原理和技术的内容被逐步引入到了计算机专业本科教学中.从早期各阶段 ACM 和 IEEE 的计 ...
- 语法分析器---预测分析程序
实验二 预测分析算法的设计与实现 (8学时) 一.实验目的 通过预测分析算法的设计与实现,加深对自上而下语法分析方法的理解,尤其是对自上而下分析条件的理解. 二.实验要求 输入文法及待分析的输入 ...
最新文章
- TensorFlow快餐教程:程序员快速入门深度学习五步法
- Thymeleaf在循环时设置递增序号
- OCM备考 一、Server config 之管理表空间
- php 正则第一个,为什么这个正则表达式与php中的第一个结果不匹配?
- Ubuntu 16.04 + Nginx + Django 项目部署
- Sound Ventures斥资百万美元举行NFT竞赛活动
- 深入理解 MVC 中的 M 与 C
- zabbix系列(八)zabbix添加对web页面url的状态监控
- 在windows、linux中开启nginx的Gzip压缩大大提高页面、图片加载速度转
- TCP的三次握手和四次挥手(超详解)
- php相册上传和删除吗,php上传与删除图片的简单范例
- Qt|表格代理的实现及使用代码qtableview和qtablewidget均适用
- python分割PDF
- 怎样在Mac上的Safari中观看YouTube画中画?
- 1byte、1KB、4KB,1MB、1GB用16进制表示的范围。任意地址范围求字节数
- 内容权限判断帝国cms教程
- 谷歌浏览器那些有趣的隐藏功能
- 破茧成蝶 醉在刹那间的浪漫 iGame G-ONE为爱而生
- Week 4.2 | Lecture 10 | 多态性设计通用方法、比较器 | CS61B-Spring-2018
- 你业余时间在做什么?