编译原理-左递归文法

编译原理期末速成-自上而下分析、消除文法的左递归问题 阅读详情
一个文法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

左递归文法

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

我只是坚持我的兴趣。 2万+

四则表达式的编译过程及生成汇编代码

1、前序 这是编译原理的实验,自认为是上大学以来做过的最难的一个实验。所以写篇博客记录一下。 实验用到的基础知识:C语言、数据结构、汇编(只需简单的了解)。 开发工具:VC   2、问题描述 编译整数四则运算表达式,将整数四则运算表达式翻译为汇编语言代码。 消除左递归后的文法: E→TE' E'→+TE' |ε T→FT' T'→*FT' |ε F→(E) | i 消除左

Touch_2011的专栏 1万+

消除左递归

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

qq2071114140的博客 4万+

山东大学编译原理复习提纲

山东大学编译原理课程的知识总结与期末复习提纲

Elford的博客 1万+

编译原理复习笔记

适用于编译原理课程的复习笔记

MarkPoloChina的博客 968

编译原理

公共做因子:  在文法的产生式中, 非终结符的候选式有相同的前缀 提取公共左因子:就是,把左因子写出来,然后用一个非终结符代替原来的不同项 消除左递归: 实际上就是改成右递归的形式, 首先把终结符提前,用新的非终结符代替原来的左递归的项, 以这个新的非终结符构造一个包含空串的又递归 文法 P→Pα|β   改变后: P→bP’ P’→αP’|ε 消除间接左递归

loudyten的专栏 4146

手把手教你用ESP32驱动MAX30102心率血氧传感器(含完整代码)

本文详细介绍了如何使用ESP32微控制器驱动MAX30102心率血氧传感器,构建智能健康监测系统。内容涵盖PPG原理、硬件连接、驱动配置、信号处理算法以及Web服务器数据可视化,提供完整代码实现,帮助开发者快速上手物联网健康设备开发。

weixin_29208077的博客 587

编译原理:消除左递归

编译原理:消除左递归 转自:http://guanjy0129.blog.163.com/blog/static/111549445201061491810507/ 时间:2010-07-14 21:18:10 一个文法含有下列形式的产生式之一时: 1) A→Aβ,A∈VN,β∈V* 2) A→Bβ,B→Aα,A、B∈VN,α、β∈V* 则称该文法是左递归的。 然而,...

Curtis’Blog 2708

告别F5失灵!手把手教你为Cursor配置.Net Core控制台项目专属调试环境

本文详细指导如何在Cursor编辑器中为.Net Core控制台项目配置专属调试环境,解决F5失灵等常见问题。从调试器选择到launch.json配置,再到高级调试技巧,帮助开发者高效搭建完整的调试工具链,提升开发效率。

weixin_28834765的博客 286

STM32学习笔记【江科协】【4-2】OLED显示屏

可以注意到接电源的GND和VCC同时和PB6、PB7号口连接,我们可以直接不初始化这两个引脚解决,因为STM32的引脚上电后,如果不初始化,默认是浮空输入的模式,在这个模式下,引脚不会输出电平,所以不会有什么影响,或者直接给PB6口输出低电平,PB7口输出高电平,用GPIO口直接给OLED供电,这个也是没问题的,因为OLED的功率很小这个也是可以驱动的,不过用GPIO口供电不是很规范,实际项目还是用电源供电。然后点击这里放大镜里面带d的图标,进入调试模式,这个界面里,

m0_74651303的博客 1595

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

文法左递归消除.

Esperanto.的博客 2万+

电商客服效率翻倍!手把手教你用影刀RPA+AI搭建智能回复系统(附实战配置)

本文详细介绍了如何利用影刀RPA+AI技术搭建电商智能客服系统,实现24小时在线回复,大幅提升客服效率。通过零代码配置、Excel词库管理和AI语义理解,系统能处理80%常规咨询,响应速度稳定在3秒内,特别适合中小电商降低成本并提升服务质量。

weixin_42520661的博客 550

左递归的消除

2.间接左递归的消除 消除间接左递归的方法是,把间接左递归文法改写为直接左递归文法,然后用消除直接左递归的方法改写文法。 如果一个文法不含有回路,即形如PP的推导,也不含有以ε为右部的产生式,那么就可以采用下述算法消除文法的所有左递归。 消除左递归算法: 把文法G的所有非终结符按任一顺序排列,例如,A1,A2,…,An。 for (i=1;i<=n;i++) for (j=1;j<=i-1;j++) { 把形如Ai→Ajγ的产生式改写成Ai→δ1γ /δ2γ /…/δk...

BLOG 6150

告别黑盒:深入解析西部数据UFS芯片的44个SMART健康参数(附高通XBL读取源码)

本文深入解析西部数据UFS芯片的44个SMART健康参数,结合高通XBL启动加载层源码,提供了一套完整的健康状态诊断方法论。从SCSI命令层封装到数据结构映射,详细介绍了如何在高通平台早期启动阶段捕获UFS健康状态,帮助工程师实现预测性维护。

weixin_30600197的博客 427

PowerBuilder 9.0安装组件全解析:Adaptive Server Anywhere、PowerDynamo、InfoMaker到底怎么选?

本文从技术架构师视角详细解析PowerBuilder 9.0安装组件选型策略,包括Adaptive Server Anywhere、PowerDynamo和InfoMaker的核心功能与应用场景。通过分析组件间的依赖关系和安装冲突机制,提供针对不同开发需求的最佳安装方案,帮助开发者高效配置PB9.0开发环境。

weixin_28700593的博客 441

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

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

i6223671的博客 2047

将 AMDP Function Implementations 讲透:从 SAP CDS View 表函数到 AMDP 方法的完整实战与最佳实践

AMDP函数实现:连接ABAP与HANA的高效桥梁 本文面向ABAP开发者,详细解析AMDP函数实现技术,帮助在SAP HANA环境中充分发挥数据库算力。核心内容包括: 技术价值:解决复杂计算场景(窗口函数、跨表聚合等)中Open SQL和CDS的局限性 两种实现类型:内部复用函数与CDS表函数实现,对比其声明规则和用途差异 关键语法要点:FOR TABLE FUNCTION绑定、只读约束、参数与返回类型自动生成机制 实战应用:以采购订单聚合为例,展示AMDP在实时报表中的性能优势 完整示例:提供基于航线数

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 386

别再死记硬背了!图解递归下降分析:用C++实现一个表达式语法检查器

本文通过图解方式详细解析递归下降分析法在C++中的实现,帮助读者理解编译原理中的表达式语法检查器。文章结合Visual Studio 2019的调试技巧,展示如何从文法设计到代码实现的完整过程,适合编译原理学习者和C++开发者。

weixin_30387423的博客 791

从Raw图像到超分辨率:真实场景下的图像增强全流程指南

通过本文的学习,您已掌握了利用Raw图像实现真实场景超分辨率的完整技术链——从数据生成的“真实感模拟”,到双分支CNN的“细节+色彩”协同建模,再到模型的训练与落地。本文将带您从理论到实践,掌握利用Raw图像实现真实场景超分辨率的核心技术,让您的图像在细节和色彩上都能“更上一层楼”。是相机传感器直接输出的原始数据,保留了最完整的亮度、色彩信息(如Bayer阵列的原始采样),这为超分辨率提供了“富矿级”的信息基础。该分支以低分辨率RGB图像为参考,学习“色彩变换矩阵”,让恢复的细节拥有真实的色彩表现。

FJN110的博客 143

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

编译原理总结

一、编译程序架构二、词法分析从左至右扫描字符序列,识别出单词(关键字、标示符、常数、特殊符号)。三、语法分析按照语言语法的规则,将词法分析所得的单词分解为各个语法成分。(分析单词串是否构成短语和句子)四、 语义分析:源程序进行上下文有关性质的检查,看源程序有无语义错误。例如:变量是否定义、类型是否正确五、中间代码生成含义明确、便于处理的记号系统。这种记号系统于源程序和机器语言之间,容易将它翻译成目标

Jerry的专栏 2551

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

用C语言手写一个迷你编译器(一):从消除左递归到递归下降分析实战

本文详细介绍了如何使用C语言从零开始构建一个迷你编译器,重点讲解了消除左递归的技巧和递归下降分析法的实现。通过实战案例,帮助开发者理解编译原理基础,掌握如何用C语言处理简单算术表达式的语法分析,为后续代码生成奠定基础。

weixin_30388677的博客 325

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

编译原理学习基本概念汇总

对于计算机专业的学生来说,肯定听说过或者上过一门课,叫做——编译原理,被称为计算机专业的天书,反正不管是学习这门课的时候,还是现在,我都是没搞懂其中的技术和知识。但就期末考试而言,提前做了几道题目,得到了90+的分数,也算是可喜可贺。各位ITer如果想检验自己的智商的话,大可以去学习编译原理,你会收获很多的。现在我把大学时整理的编译原理最基本的概念分享出来。 第一章-绪论 1. 翻译,是指

乞力马扎罗的雪CYF的博客 5789

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

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

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

消除左递归文法

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

chiyinde3456的博客 3538

编译原理总结,看这一篇就够了!

编译原理总结第一章 编译概述一.翻译程序的三种方式二.编译程序的五个阶段第二章 文法与语言2.1 符号串和语言2.1.1 字母表2.1.2 符号串2.1.3 语言2.2 文法和语言的形式化定义2.2.1 文法的形式化定义2.2.2 语言的形式化定义2.2.3 短语、直接短语、句柄2.2.4 规范推导和规范归约2.3 语法分析树与文法的二义性2.3.1 语法分析树2.3.2 文法的二义性2.3.4 ...

LeeDuoZuiShuai的博客 13万+
上一篇: secure CRT常用的查看服务器日志命令
下一篇: SQL语句执行顺序
Coding小飞侠
博客等级 码龄18年 57粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值