左递归文法

编译原理期末速成-自上而下分析、消除文法的左递归问题 阅读详情
 一个文法G,若存在P经过一次或多次推导得到Pa(即能推导出以P开头的式子), 则称G是左递归的。

  左递归分为直接左递归和间接左递归。
  直接左递归经过一次推导就可以看出文法存在左递归,如P→Pa|b。
  间接左递归侧需多次推导才可以看出文法存在左递归,如文法:S→Qc|c,Q→Rb|b,R→Sa|a有S =>Qc =>Rbc =>Sabc

消除直接左递归的方法:

  1、把所有产生式写成候选式形式。如A→Aa1|Aa2……|Aan|b1|b2……|bm。其中每个a都不等于ε,而第个b都不以A开头。
  2、变换候选式成如下形式:
  A→b1A’|b2A’……|bmA’
  A’ →a1A’|a2A’……|anA’|ε

  例1:文法E→E+T|T,T→T*F|F,F →(E)|id消除直接左递归后有:
  E→TE’,E’ →+TE’|ε,T→FT’,T’ →*FT’|ε,F→(E)|id

消除间接左递归的方法:

  要求文法不存在A 经过一次或多次能推导出A和不存在ε产生式(形如A→ε)。 
  1、以某种顺序排列非终结符A1,A2,……,An;
  2、for i = 1 to n do
    {for j = 1 to i - l do
     { 用产生式Ai→a1b|a2b|……|akb代替每个开如Ai→Ajb的产生式,其中,Aj→a1|a2|……|ak是所有的当前Aj产生式;}
    消除关于Ai产生式中的直接左递归性}
   }
  3、化简由步骤2所得到的文法。

  例2:有文法S→Qc|c,Q→Rb|b,R→Sa|a,消除文法的左递归。
  以非终结符号排序为R,Q,S
  把R的产生式代入Q中有:
  Q → (Sa|a)b|b
  Q → Sa b|ab|b
  把Q的产生式代入S中有:
  S → (Sa b|ab|b)c|c   
  S → Sa bc|abc|bc|c
  消除直接左递归得到结果:
  S → abcS’|bc S’|cS’ 
  S’→ abcS’|ε
  Q → Sa b|ab|b 
  R → Sa|a 
  Q 和 R的产生式是多余的删除,得到最终结果:
  S → abcS’|bc S’|cS’ 

  S’→ abcS’|ε



-------------------------------------------------------------------------------



编译原理:消除左递归  

2010-07-14 21:18:10|  分类: 编译原理|字号 订阅

一个文法含有下列形式的产生式之一时:

1)A→Aβ,A∈VN,β∈V*

2)A→Bβ,B→Aα,A、B∈VN,α、β∈V*

则称该文法是左递归的。

然而,一个文法是左递归时,不能采取自顶向下分析法。

消除左递归方法有:

a)把直接左递归改写为右递归:

设有文法产生式:A→Aβ|γ。其中β非空,γ不以A打头。

可写为:A→γA'

A'→βA'|ε

一般情况下,假定关于A的产生式是:

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

其中,αi(1≤i≤m)均不为空,βj(1≤j≤n)均不以A打头。

则消除直接左递归后改写为:

A→ β1A'| β2 A' |…| βnA'

A'→ α1A' | α2A' |…| αmA' |ε

例4.12:有文法G(E):

E→E +T |T

T→T*F | F

F→i| (E)

消除该文法的直接左递归。

解:按转换规则,可得:

E→TE'

E'→+TE'|ε

T→FT '

T'→*FT'|ε

F→i| (E)

b)消除间接左递归:

对于间接左递归的消除需要先将间接左递归变为直接左递归,然后再按a)清除左递归。

例4.13:以文法G6为例消除左递归:

(1)A→aB

(2)A→Bb

(3)B→Ac

(4)B→d

解:用产生式(1),(2)的右部代替产生式(3)中的非终结A得到左部为B的产生式:

(1)B→aBc

(2)B→Bbc

(3)B→d

消除左递归后得到:

B→aBcB' |dB'

B'→bcB' |ε

再把原来其余的产生式A→aB,A→Bb加入,最终得到等价文法为:

(1) A→aB

(2) A→Bb

(3) B→(aBc|d)B'

(4) B'→bcB'|ε

c)消除文法中一切左递归的算法

设非终结符按某种规则排序为A1,A2,…,An。

For i﹕=1 to n do

begin

For j﹕=1 to i-1 do

begin

若Aj的所有产生式为:

Aj →δ1| δ2 | … | δn

替换形如Ai → Aj γ的产生式为:

Ai →δ1γ |δ2γ | … |δnγ

end

消除Ai中的一切直接左递归

end



编译原理笔记11:自上而下语法分析(1)基础概念、左递归和公共左因子处理、递归下降分析(咕咕咕) 编译原理 阅读详情

相关推荐

【编译原理】LL(1)文法

编译原理课程笔记,自上而下的语法分析,LL(1)分析法,FIRST集和FOLLOW集的求法

m0_61819793的博客 6063

消除左递归

消除左递归 为什么要消除左递归? 在自顶向下的分析中,如果不消除左递归,就会陷入死循环。例如,在后面要说到的递归向下的分析中,就是一个“从前有座山,山里有个庙…”这样,一直递归下去;使用非递归的时候也是一样,需要计算一个FIRST集合,这个集合本身也是一个递归的计算方式,如果有左递归,同样会无限的递归下去。 消除左递归,就是为了可以进行自顶向下的语法分析 1.消除直接左递归 有如下文法: A→...

qq2071114140的博客 4万+

电子设计实战:用MOS管手把手搭建D触发器电路(含时序分析避坑指南)

本文详细介绍了如何使用MOS管从零开始搭建D触发器电路,重点解析了建立时间和保持时间等关键时序参数对电路稳定性的影响。通过实测波形分析和避坑指南,帮助电子工程师掌握D触发器的实际搭建技巧与优化方法,提升数字电路设计的可靠性。

x1y2z的博客 1162

编译原理(三)直接左递归与间接左递归的消除

在进行语法分析的时候,如果采用自上而下的分析方法(从开始符开始,推句子),那么要求文法不是左递归的,进而如果是左递归的,则要求消除左递归,因此左递归只是在自上而下的那种文法里的。 左递归的定义:文法经过一次或多次推导之后,出现如下形式,原理是很简单了。 左递归的分类 直接左递归:P → Pa 简介左递归:P → Aa, A → …… → Pb 直接左递...

HeroIsUseless的博客 7365

Autosar Os降低CPU负载的方案总结

由于各个项目的实际场景不尽相同,可能需要有针对性的对症优化。如果你还有别的一些优化手段欢迎留言交流。

3678

非root用户如何在CentOS7集群上编译安装OpenFOAM6

本文详细介绍了在CentOS7集群上以非root用户身份编译安装OpenFOAM6的完整流程。通过环境准备、依赖包离线获取、源码编译安装等步骤,解决了集群环境下权限和依赖问题,特别针对OpenMPI和Boost库提供了优化配置建议,帮助用户高效完成安装并优化性能。

weixin_28826961的博客 681

消除左递归文法

无法根据左递归文法编写出递归下降分析器,因而把左递归文法等价变换为非左递归文法至关重要,以下是变换的算法: 1、消除直接左递归 原文法: E --> E a1 | E a2 | ... | E an | b1 | b2 | ... | bn 消除后: E --> b1 E' | b2 E' | ... | bn E'               E'--> a1 E' | a2 E' |

~动次~打次~动次~打次~ 1033

基于车辆运动学的规划算法 - Hybrid A*/ State Lattice Planning (前置知识:自行车模型、Dubins、Reeds Shepp、多项式曲线、螺旋曲线)

本文将按顺序讲解基于车辆运动学的规划算法,以及需要的前置知识:自行车模型、Dubins和Reeds Shepp曲线、多项式曲线和螺旋曲线

BigDavid123的博客 4860

编译原理-左递归文法

一个文法G,若存在P经过一次或多次推导得到Pa(即能推导出以P开头的式子), 则称G是左递归的。   左递归分为直接左递归和间接左递归。   直接左递归经过一次推导就可以看出文法存在左递归,如P→Pa|b。   间接左递归侧需多次推导才可以看出文法存在左递归,如文法:S→Qc|c,Q→Rb|b,R→Sa|a有S =>Qc =>Rbc =>Sabc 消除直接左递归的方法:   

Coding小飞侠的专栏 4752

MySQL安装最后启动报错--Job for mysqld.service failed because the control process exited with error code. See

MySQL安装最后启动报错: [root@localhost mysql]# systemctl start mysqld Warning: mysqld.service changed on disk. Run 'systemctl daemon-reload' to reload units. Job for mysqld.service failed because the control process exited with error code. See "systemctl status m

chenchen的博客 2746

生成式引擎优化(GEO):启动GEO优化的5个有效策略

随着生成式AI的普及,传统SEO正被GEO(生成式引擎优化)取代。本文提出GEO五大核心策略:用户意图解析、结构化内容设计、语义关键词优化、对话式内容创作和权威信源建设。研究表明,优化后的内容在AI答案中的引用率提升300%,点击率增长27%。文章还介绍了BERT模型、Schema标记等关键技术工具,并指出未来GEO将向多模态优化、实时数据更新方向发展。企业需避免简单堆砌关键词,应建立长期内容策略,通过结构化、权威性内容在AI时代保持竞争优势。

解锁AI流量新红利!🚀 GEO优化(生成引擎优化)助您掌控AI搜索,让AI成为您的品牌最佳代言人! 2786

左递归文法 不太懂

一个文法含有下列形式的产生式之一时: 1)A→Aβ,A∈VN,β∈V* 2)A→Bβ,B→Aα,A、B∈VN,α、β∈V* 则称该文法是左递归的。 然而,一个文法是左递归时,不能采取自顶向下分析法。 消除左递归方法有: a)把直接左递归改写为右递归: 设有文法产生式:A→Aβ|γ。其中β非空,γ不以A打头。 可写为:A→γA' A'→βA'|ε 一般情况下,假定关于A的产生式是

Flying cat 4231

自绘CListCtrl时发现ON_WM_MEASUREITEM_REFLECT和DrawItem(LPDRAWITEMSTRUCT lpMeasureItemStruct) 无响应

自绘CListCtrl时发现ON_WM_MEASUREITEM_REFLECT和DrawItem(LPDRAWITEMSTRUCT lpMeasureItemStruct) 无响应 一般情况下,我们都是在 dialog 里面 放一个 list 控件,然后 用自己的类绑定自己的自绘对象,如同下面: 1.  在 dialog 里面 加一个 list 列表 2. 然后 绑定这个列表 哈哈...

mfreesky的专栏 2171

左递归文法笔记

一个文法G,若存在P经过一次或多次推导得到Pa(即能推导出以P开头的式子), 则称G是左递归的。   左递归分为直接左递归和间接左递归。   直接左递归经过一次推导就可以看出文法存在左递归,如P→Pa|b。   间接左递归侧需多次推导才可以看出文法存在左递归,如文法:S→Qc|c,Q→Rb|b,R→Sa|a有S =>Qc =>Rbc =>Sabc 消除直接左递归的方法:

大鹏的专栏 7627

SystemUI-下拉去掉后去掉用户切换-去掉电源按键中的紧急呼叫

这里自己倒腾完成了两个常见需求:去除用户切换、去除紧急呼叫UI在去除用户切换时候,用到了Compose知识点,所以很难按照以前经验去找对应布局、找对应的View Item ,以往方法都只能部分借鉴的搞系统的还是要跟着谷歌学一点Compose技能了,方便日常开发调试。

十年饮冰,难凉热血 1459

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

怎么消除左递归、什么时候需要消除左递归、提取左因子—编译原理

SLR(1)、LR(1)、LALR(1)文法之间的关系,什么是LL(1)、LR(0)、LR(1)文法,什么是句柄、什么是自上而下、自下而上分析,何时需要消除左递归,如何消除左递归,如何判断二义文法及消除文法二义性,什么是上下文无关文法、最左推导和最右推导

我们都是被分成两半的人,一边热爱生活,一边憎恨生活。面对生活,我们总是在矛盾的两端摇摆,在反复的矛盾和犹豫中,一边踉跄前行,一边重振旗鼓。我渴望改变,渴望变得更好,渴望找到出口……就像一个溺水人的挣扎,就像一个救生圈。我是一个矛盾集合体,想要变得快乐,但是 8724

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

编译原理:实现LL(1)的语法分析,包括消除直接和间接左递归

实验二 预测分析算法的设计与实现 (10学时) 一、实验目的 通过预测分析算法的设计与实现,加深对自上而下语法分析方法的理解,尤其是对自上而下分析条件的理解。 二、实验内容 输入文法及待分析的输入串,输出其预测分析过程及结果。 参考数据结构 (1)/定义产生式的语法集结构/ typedef struct{ char formula[200];//产生式 }grammarElement; gra...

i6223671的博客 2047

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

语法分析--左递归的消除,FIRST集合FOLLOW集的求解

语法分析–左递归的消除,FIRST集合FOLLOW集的求解 左递归的消除 如果自一个文法中,存在一个非终端符号A,使得对某个串α,存在一个推导A→(*)Aα.(其中 →(*)表示可以经过多步推导。)则该文法为左递归文法(left recursive).由于自顶向下语法分析方法不能处理左递归的文法,因此需要一个转换方法来消除左递归。  对于左递归的产生式 A → Aα | β, 替换为非左递归...

zcb1592781470的博客 2223

MXNet Gluon 图像处理教程全指南:从 MNIST 手写数字识别到 GluonCV 视觉任务

本文基于 [docs/python_docs/python/tutorials/packages/gluon/image/index.rst](https://link.gitcode.com/i/9663876c5f11bee268f8266c9c720865) 整理,它是 MXNet 官方 Python 文档中 **Gluon 图像(Image)教程的入口索引**,统领两大类内容:一类是仓库内

gitblog_00487的博客 1079

实验2-1 无左递归文法的LL(1)分析表的构建--

求出文法的Follow集:对于任意一个非终结符号A,求出其可以出现在哪些符号后面,将这些符号加入到A的FOLLOW集中。需要逐个考虑每个产生式,将右部每个非终结符的FIRST集加入到其后继符号的FOLLOW集中,如果该非终结符后面还有其他符号,且后继符号的FIRST集中包含ε,则将该非终结符的FOLLOW集加入到后继符号的FOLLOW集中。构造LL(1)分析表:对于任意一个非终结符号A和终结符号a,如果存在A → α且a∈FIRST(α),则将A → α加入分析表M[A, a]中;2. 预测分析表的构造。

WJY2003IBDM的博客 477

【编译原理】文法左递归的消除

文法左递归消除.

Esperanto.的博客 2万+

设计一个编译器的基本思路

1.明确目标语言的语法 2.根据语法写出相应的词法分析程序,也可以用工具 LEX 生成 3.消除左递归文法,编写LL0下推自动机 4.根据自动机产生的语法树生成目标代码 5.目标代码优化 其中: 词法分析使用有状态自动机,遍历状态矩阵 语法分析使用LL0下推自动机,具体我也不懂 语法树完全不懂……但是貌似生成的时候要参考符号的优先级 目标代码就是按

madbunny的专栏 2175
上一篇: OSI的七层模型,网线,网卡,集线器,交换机,路由器分别工作在七层模型中的哪一层?
下一篇: 排序算法稳定性讨论
kavensu
博客等级 码龄15年 193粉丝 38原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值