Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使没有左递归的上下文无关文法包含左递归(而不改变语法的语言)?

要使没有左递归的上下文无关文法包含左递归,可以通过引入新的非终结符和产生式来实现。下面是一种常见的方法:

  1. 首先,将原始文法中的所有直接左递归消除。对于每个产生式A -> Aα,可以将其拆分为A -> βB和B -> α,其中B是一个新的非终结符,β是一个不包含A的符号串。
  2. 接下来,对于每个非终结符A,检查其所有的产生式是否存在间接左递归。如果存在间接左递归,需要进行进一步处理。
  3. 对于存在间接左递归的非终结符A,可以使用左因子提取的方法来消除。具体步骤如下: a. 找到A的所有产生式中的公共前缀,将其提取为一个新的非终结符B。 b. 将原始产生式中的公共前缀替换为B,并为B添加一个新的产生式B -> α,其中α是原始产生式中去除公共前缀后的部分。 c. 对于原始产生式中以公共前缀开头的产生式,将其替换为B。
  4. 重复步骤3,直到所有的间接左递归都被消除。

通过以上步骤,可以将没有左递归的上下文无关文法包含左递归,而不改变语法的语言。

请注意,以上方法是一种常见的处理方式,但并不是唯一的方法。在实际应用中,可能会根据具体情况采用不同的处理策略。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

65.精读《手写 SQL 编译器 - 文法介绍》

1 引言 文法用来描述语言的语法规则,所以不仅可以用在编程语言上,也可用在汉语、英语上。...上下文无关文法 根据是否依赖上下文,文法分为 上下文相关文法 与 上下文无关文法,一般来说 上下文相关文法 都可以转换为一堆 上下文无关文法 来处理,而用程序处理 上下文无关文法 相对轻松。...附上一个 mysql 上下文无关文法集合。 左推导与右推导 上面提到的推导符号 => 在实际运行过程中,显然有两种方向左和右: E + E => ?...消除左递归 消除左递归一般通过转化为右递归的方式,因为左递归完全不消耗 Token,而右递归可以通过消耗 Token 的方式跳出死循环。...> 提取左公因式 即便是上下文无关的文法,通过递归下降方式,许多时候也必须从左向右超前查看 K 个字符才能确定使用哪个产生式,这种文法称为 LL(k)。

57220

编译原理学习笔记-5:自顶向下语法分析

本篇笔记将继续讲解编译的第二步:自顶向下语法分析。 下面是这篇笔记的思维导图: 注意:以下的所有分析基于上下文无关文法。 1....更直接点,我们可以说语法分析器是用来判断句子是否符合某个给定的上下文无关文法的。 1.2 语法分析的方法 本篇笔记主要讲解自顶向下语法分析。...要判断句子是否符合某个给定的上下文无关文法,可以尝试从文法的开始符号出发,若经过一系列推导之后可以得到完全匹配原句子的句子,则可以说原句子来自于给定的文法。 2....首先将第一条产生式代入第二条,得到 Q → Sab|ab|b,它仍然不包含左递归,所以继续代入第三条,得到 S → Sabc|abc|bc|c,它包含直接左递归,所以按照前面说过的一般左递归的消除方法对其进行处理...我们试着用预测分析程序进行语法分析。 ① LL(1) 判断 有没有左递归? 很明显,这个文法存在直接左递归,为了方便后续工作的开展,这里先消除左递归。

5.2K72
  • 编译原理文法详解_编译原理为什么存在递归文法

    这里主要讨论上下文无关文法构成的语法和自顶向下、自底向上的语法分析。...上下文无关文法 定义为一个四元组(VT,VN,S,P) VT:终结符的有限集合 VN:非终结符的有限集合,与VT无交集 S:开始符号 P:产生式的有限集合。...形如A->α,α∈(VN∪VT)* 类似自动机的定义,不过是语法的产生式。 为什么要叫上下文无关文法呢?...左递归的判定和消除 左递归的判定:一个文法G,若存在P经过一次或多次推导得到Pa(即能推导出以P开头的式子), 则称G是左递归的。...总结 这一节的主要内容应该是自顶向下分析,为了构建这一棵语法树,我们使用上下文无关文法,定义了推导的概念,发现我们要使用左推导,并且解决了二义性,顺便消除了左递归,这才成功构建出这样一棵语法树。

    77310

    2016腾讯软件开发面试题之不定项选择题

    该类型的文法能够产生所有可被图灵机识别的语言。可被图灵机识别的语言是指能够使图灵机停机的字串,这类语言又被称为递归可枚举语言。...注意递归可枚举语言与递归语言的区别,后者是前者的一个真子集,是能够被一个总停机的图灵机判定的语言。 1-型文法(上下文相关文法)生成上下文相关语言。...这里的A 是非终结符号,γ 是包含非终结符号与终结符号的字串。这种文法规定的语言可以被非确定下推自动机接受。上下文无关语言为大多数程序设计语言的语法提供了理论基础。...正规语言类包含于上下文无关语言类,上下文无关语言类包含于上下文相关语言类,上下文相关语言类包含于递归可枚举语言类。...这里的包含都是集合的真包含关系,也就是说:存在递归可枚举语言不属于上下文相关语言类,存在上下文相关语言不属于上下文无关语言类,存在上下文无关语言不属于正规语言类。 四种类型的文法的主要特点: ?

    1.5K100

    【编译原理】第二讲:程序设计语言及其文法【笔记】

    ,最后的形式是一个字母数字串 而 S 可推出,是一个字母开头的字母数字串 (4) 文法的分类 A:0型文法 α --> β 无限制文法 ∀ α --> β ∈ P,α中至少包含一个非终结符 0型语言 由...0型文法G生成的语言L(G) B:1型文法 上下文有关文法 ∀ α --> β ∈ P,|α|≤|β| 产生式的一般形式:α1 A α2 --> α1 β α2 上下文有关语言 由上下文有关文法G构成的语言...L(G) 不包含 ε-产生式 C:2型文法 上下文无关文法 ∀α → β ∈P,α ∈ 非终结符 产生式的一般形式:A --> β 上下文无关语言 由上下文无关文法G构成的语言L D:3型文法 正则文法...句子 5、若文法G定义的语言是无限集,则文法必然是( ) 正确答案(A) A. 递归的 B. 上下文无关的 C. 二义性的 D....句型 8、若一个文法是递归的,则它所产生的语言的句子( ) 正确答案(A) A. 是无穷多个 B. 是有穷多个 C. 是可枚举的 D.

    1.6K40

    懂前端的你也可以轻松定义自己业务的DSL

    上面这一堆精准定义的规则都是一些上下文无关文法,要准确写出flex可以用的规则,必须对上下文无关文法比较熟悉,比如不能出现左递归、不能出现空规则等等:上下文无关文法上下文无关文法(Context-Free...Grammar)指的是一种形式文法,其中所有规则的左部只包含一个非终结符号,而右部可以是任意长度的终结符和非终结符序列。...上下文无关文法是自然语言处理、编译原理和计算机语言设计等领域中广泛使用的一种形式化表示方法。要轻松写一个上下文无关文法,可以按照以下步骤进行:1. 确定终结符号集和非终结符号集。...例如,一个简单的上下文无关文法可以表示一个简单的算术表达式:1. 终结符号集:数字(0-9)、加号(+)、减号(-)、左括号(()、右括号())2....起始符号:E这个文法可以生成类似于“3+4*5”的算术表达式。左递归和空规则左递归:在一个产生式的右部出现了该产生式本身作为左部的情况,例如:A->Aα(α为任意串)。

    2.5K41

    编译原理复习总结-耗子尾汁

    上下文无关法 一个上下文无关法G是一个四元式 ,其中 :终结符集合(非空) :非终结符集合(非空),且 :文法的开始符号, :产生式集合(有限),每个产生式形式为...{1}和{2,4}包含于{0,1}、{2,3,4,5},故{0,1}不拆分; {0,1,3,5}没有包含于{0,1}、{2,3,4,5};又状态24经弧a到达状态10,包含于{0,1},应拆24为一组...语法分析 自上向下分析 消除左递归 含有左递归的文法将使自上而下的分析过程写入无限循环,如 , 消除左递归可以在原产生式中增加一个非终结符,如 改写为(注意 不以 开头):...安利DZ大佬的讲解 4.LL(1)文法 ①文法不含左递归 ②对于文法中每一个非终结符A的各个产生式的候选首符集两两不相交 即,若 则 ③对文法中的每个非终结符A,若它存在某个候选首符集合包含...语义分析和是中间代码产生 中间代码生成对编译器构造的意义 便于进行与机器无关的代码优化工作; 使编译程序改变目标机更容易; 使编译程序的结构在逻辑上更为简单明确。

    1.2K30

    侃一侃编译原理的“文法”

    一.文法涉及的几个简单概念 假设Σ是一个有限的字母表集合,它的每一元素都是一个符号。Σ上的一个符号串就是指由Σ中的符号组成的一个有限序列。如果一个符号串不包含任何符号,就叫它空串,记为ε。...可能你一脸黑人问号…… 其实,就是指怎么由一堆符号组成一个有含义的句子的规则和协议。 所谓的上下文无关文法就是文法的一种,它所定义的语法单位是完全上下文无关的。...(ˇˍˇ) 想~ 所以说,上下文无关文法不能用来描述自然语言,但是对于当今的程序语言来说,上下文无关文法基本够用了。下文中的“文法”,如果没有特殊说明,都是之指“上下文无关文法”。...或者这么说,有了这些规则,我们可以这么干: 我们可以画一个更形象的图(语法分析树)来说明这种推导。 上面定义英文句子的规则就可以说是一个上下文无关文法。...下面上精确定义: 二.递归定义的例子 有时候,只用一个产生式是不足以定义一个语法单位的,需要几个产生式的相互配合。有时候会需要递归的形式。

    71820

    编译原理 第二章下: 推导,规约,句型句子,语言,文法分类,二义性

    例:2.6 文法的分类对文法中的不同规则施加不同的限制,将文法和语言分为四大类0型文法:0型语言或短语结构语言1型文法:1型语言或上下文有关语言==2型文法==:2型语言或上下文无关语言2型文法是程序设计语言语法规则...==3型文法==:3型语言或正则语言3型文法是程序设计语言构词规则2.6.1 0型文法对产生式基本无限制2.6.2 1型文法文法左部符号个数不超过右部符号个数2.6.3 2型文法任意产生式A→B,A属于非终结符号...如上小节给出语法树中,包含根节点S,S1,S2,S3,S4的五棵子树注意叶子结点不算子树短语短语是相对一个句型的,一个句型对应多个短语。短语就是该句型子树的叶子结点如何寻找一个句型短语?...→TF*|F , F→F^|a 求证FF^^*是文法的句型,指出短语,简单短语和句柄2.8 递归规则和递归文法递归规则指的是在规则右部含有和左部相同符号的规则,如U→xUy;其中这种U→Uy称为左递归,...递归文法使人们能用有穷的文法刻画无穷语言。2.9 文法的二义性若一个文法存在某个句子或句型,它存在两棵不同的语法树,则称该句子或句型是二义性的,对应的文法也是二义性的。

    39610

    2016 腾讯软件开发面试题(部分)

    该类型的文法能够产生所有可被图灵机识别的语言。可被图灵机识别的语言是指能够使图灵机停机的字串,这类语言又被称为递归可枚举语言。...注意递归可枚举语言与递归语言的区别,后者是前者的一个真子集,是能够被一个总停机的图灵机判定的语言。 1-型文法(上下文相关文法)生成上下文相关语言。...这里的A 是非终结符号,γ 是包含非终结符号与终结符号的字串。这种文法规定的语言可以被非确定下推自动机接受。上下文无关语言为大多数程序设计语言的语法提供了理论基础。...正规语言类包含于上下文无关语言类,上下文无关语言类包含于上下文相关语言类,上下文相关语言类包含于递归可枚举语言类。...这里的包含都是集合的真包含关系,也就是说:存在递归可枚举语言不属于上下文相关语言类,存在上下文相关语言不属于上下文无关语言类,存在上下文无关语言不属于正规语言类。 四种类型的文法的主要特点: ?

    90580

    编译原理 | 期末复习笔记

    编译前端:与源语言有关,如词法分析、语法分析、语义分析、与目标机无关的代码优化等与机器无关的事务 编译前端:与目标机器有关,如目标代码生成、与目标机有关的代码优化 好处:可组装、省力、有利于移植 --...,P,S)V_N:非终结符集V_T:终结符集P:产生式集S:开始符(识别符) 文法分类0型文法(短语文法)1型文法(上下文有关文法)2型文法(上下文无关文法)形如 \alpha \rightarrow...形式化定义为:一个上下文无关文法是LL(1)文法的充分必要条件是,对每个非终结符A的两个不同产生式,A→α, A→β,满足SELECT(A→α)∩SELECT(A→β)=空集 其中α,β不同时能推导出ε...4.2 非LL(1)文法转换为LL(1)文法 一个文法若含直接或间接左递归,或含有左公共因子,则该文法肯定不是LL(1)文法。...常用的LR文法有:LR(0),SLR(1)、LALR(1)、LR(1) 其包含关系结构如图: 一个文法G[S],若列出LR(0)项目集规范族C后,C中没有项目集中有移进-规约冲突,那么该文法G[S

    1.7K20

    看懂编译原理:词法语法语义分析阶段 原理

    :使用上下文无关语法-文法规则词法分析用的是正则表达式(也就是状态机),而语法分析用的是文法规则进行匹配使用文法规则不是正则,是因为单纯的正则已经无法表示复杂的算数表达式的语法ast结构。...无上下文因为预读peek的token只能够用于生成ast,没有额外的token作为上下文进行优化ast,优化ast和上下文token信息读取是在语义阶段进行的)此处语法分析用的是无上下文的文法结构 只是为了生成正确的...耗时长且优化效果很差因此将ast的优化放置在了分析阶段的最后一个阶段:语义分析语法分析阶段:左递归问题左递归问题定义左递归问题:匹配加法文法时 由于第二个文法(add+mutil)的第一个条件也是加法文法...(也叫回溯)注意:文法结构只表达对应的构成规则,对于如何用算法实现文法结构规则是算法的事情(如出现左递归 说明左文法节点结构中第一个条件就是再次判断是否符合该文法父节点,如此循环。)...语法分析阶段使用上下文无关语法产生ast;语义分析阶段通过生成的ast节点,使用上下文有关语法对其进行转换字节码(上下文有关意味着要预读取更多的节点并解析这些节点)。

    1.2K20

    漫谈模式之解释器模式

    解释(Interprete)一般要递归地调用表示R1到Rn的那些对象的操作。 Context(上下文) 包含解释器之外的一些全局信息。...Client(客户端) 构建(或被给定)表示该文法定义的语言中的一个特定的句子的抽象语法树。...2、每一个非终结符表达式节点定义相应子表达式的解释操作。而各终结符号表达式的解释操作构成了递归的基础。 3、每一个节点的解释操作用上下文来存储和访问解释器的状态。...因为该模式使用类来表示文法规则,你可以使用继承来改变或扩展该文法。已有的表达式可被增量式地改变,而新的表达式可被定义为旧表达式的变体。 也易于实现文法。定义抽象语法树中各节点的类的实现大体类似。...这些类易于直接编写,通常它们也可用一个编译器或语法分析程序生成器自动生成。 缺点: 复杂的文法难以维护。解释器模式为文法中的每一条规则至少定义一个类。因此包含许多规则的文法可能难以维护。

    55360

    Stanford公开课《编译原理》学习笔记(2)递归下降法

    需要注意左递归文法会使得递归下降遍历进入死循环,在文法设计时应该避免,龙书中也提供了一种通用的拆分方法来解决这个问题。 二....由于Javascript语言中涉及的文法非常多,本节只筛选出与目标解析式相关的一部分简化的语法规则(图中标记为蓝色的部分): ?...的产生式,E的判断规则里需要判断A,而A的逻辑里又再次调用了E,这里就是一种左递归,如果不进行任何处理,在代码运行时就会陷入死循环然后爆栈,这也就是前文强调的需要在语法产生式设计时消除左递归的场景。...这里并不是说spiderMonkey的parserAPI是错的,因为消除左递归的语法改造只是一种等价形式的转换,是为了防止产生式产生无限递推(或者说程序实现时进入无限递归的死循环)而做的一种形式处理,改造的过程可能只是引入了某个中间集合来消除这种场景的影响...三.小结 单纯地递归下降法最终的结果只找出了不满足任何语法规则的语句,或是最终所有语句都符合语法规则时给出提示,但并没有得到一个树结构的对象,也没有向下一个环节提供输出,如何在编译过程中与后续环节进行连接还有待探索

    1.1K10

    用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(4)- 语法分析1:EBNF和递归下降文法

    用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(4)- 语法分析1:EBNF和递归下降文法 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言...600行的类c语言解释器: 给编程初学者的解释器教程(4)- 语法分析1:EBNF和递归下降文法 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(5)- 语法分析2: tryC的语法分析实现...这一章开始进入解释器的核心部分: 语法分析器; 我们来看看两个概念,EBNF和递归下降文法,以及如何用这两个方法来计算tryC中的表达式。...BNF与上下文无关文法 Backus-Naur符号(就是众所周知的BNF或Backus-Naur Form)是描述语言的形式化的数学方法,由John Backus (也许是Peter Naur)开发,最早用于描述...上下文无关文法就是说,这个文法中所有的产生式左边只有一个非终结符,就像上面写的那个文法一样。通常我们在编译器构建中使用的都是上下文无关文法。

    54420

    理解递归下降分析和parsec应用

    前言 本文将会从上下文无关文法开始介绍,从使用 BNF 描述语法到理解递归下降分析思想,最后实现一个简单的 html 解析器收尾。...巴科斯范式 - 语法描述语言 巴科斯范式 Backus Normal Form,缩写为 BNF, 是一种用于表示上下文无关文法的语言。...,即上下文无关。...在含有递归的语法中,不能出现左递归(包括间接左递归),也不能有二义性,没有左递归且没有二义性的语法符合 LL(1)文法,就可以使用递归下降分析法解析。...左递归无法使用递归下降分析的原因是会让程序死循环,具体可以参考编译原理龙书 2.4.5 Left Recursion 章节。 3. 递归下降分析 符合 LL(1)文法的语法可以使用递归下降分析法解析。

    1.7K00

    第四章 自顶向下语法分析方法

    一、确定的自顶向下语法分析思想 基本方法:对任何输入串,试图从文法的开始符号出发, 自上而下地为输入串建立一棵语法树,或者说为输入串寻找一个最左推导。...过程本质:是一种试探过程,是反复使用不同产生式谋求匹配输入串的过程如何选择哪个产生式进行推导,某文法符号对应当前输入符号时,有唯一的产生式进行替换并向下推导。...1.4.1 定义 一个上下文无关文法是 LL(1) 文法的充分必要条件是,对每个非终结符的两个不同的产生式,A→α,A→β,满足:SELECT(A→α)∩SELECT(A→β)= φ 1.4.2 举例...二、LL(1)文法的判别 一个上下文无关文法是 LL(1) 文法的充分必要条件是,对每个非终结符的两个不同的产生式,A→α,A→β,满足:SELECT(A→α)∩SELECT(A→β)= φ 2.1 FIRST...而下方法的分析能力 按照 LL(1) 文法构造预测分析表 实现预测分析器

    1.3K30

    大学课程 | 编译原理知识点

    什么是字母表,元符号,正则表达式的三种基本操作 0/1/2/3型文法?什么是最左推导?最右推导?什么是终结符,非终结符?什么是产生式?如何识别二义性,消除方法?语言到文法? 递归下降?...编译器分类结构 根据语言文法的难易程度以及识别它们所需要的算法分类:如乔姆斯基分类结构: 4类:分为0型,1型,2型,3型文法 0型文法为:无限制文法 1型文法为:上下文有关文法 2型文法为:上下文无关文法...DFA(确定性有穷自动机) 给出一个状态和字符,通常肯定会有一个指向单个新状态的唯一转换 NFA(非确定性有穷自动机) 第三章 上下文无关文法 上下文无关文法与正则表达式的主要区别: 上下文无关文法的规则是递归的...二,将文法改变成一个强制正确分析树构造的格式 语法分析器的作用 编译过程中,语法分析器的任务是 (1) 分析单词串是如何构成语句和说明的 (2) 分析语句和说明是如何构成程序的 (3) 分析程序的结构...这样的环境可用来实现没有指针或动态分配,且过程不可递归调用的语言。 基于栈的环境:C,C++,Pascal,Ada。在允许递归调用以及每一个调用中都重新分配局部变量的语言中,不能静态地分配活动记录。

    1.3K30

    用c语言手搓一个500+行的类c语言解释器: 给编程初学者的解释器教程(4)- 语法分析1

    项目github地址及源码: https://github.com/yunwei37/tryC 这一章开始进入解释器的核心部分: 语法分析器; 我们来看看两个概念,EBNF和递归下降文法,以及如何用这两个方法来计算...BNF与上下文无关文法 Backus-Naur符号(就是众所周知的BNF或Backus-Naur Form)是描述语言的形式化的数学方法,由John Backus (也许是Peter Naur)开发,最早用于描述...Algol 60编程语言的语法。...上下文无关文法就是说,这个文法中所有的产生式左边只有一个非终结符,就像上面写的那个文法一样。通常我们在编译器构建中使用的都是上下文无关文法。...当然,递归下降分析并不是对于所有的文法都能正常使用的,例如经典的左递归问题:比如这样一个文法 exp -> exp { op exp } | ( exp ) | number op -> + | - |

    1.8K00

    编译原理学习笔记-2:文法和语言

    文法 2.1 文法在语言体系中的位置 语言包括语法和语义两个方面,但是语法和语义都是比较抽象的东西,所以我们需要借助一些工具来阐述它们。以语法来说,文法就是阐述它的一个工具。...作为描述程序语言的上下文无关文法,我们对它还有一些限制: 文法中不包含形如 P → P 的产生式 每个非终结符一定可以被用到,或者本身被 S 推导得到,或者本身推导得到其它终结符串。 4....(3) 2 型文法 在 1 型文法的基础上加以限制,规定对于每一个 α→β,都必须满足 α 是一个非终结符。也就是说,产生式左部必须得是一个非终结符。 2 型文法也叫上下文无关文法。...下面我们用更加通俗的例子来解释这两种文法: 定义上下文无关文法 G : Grammar → X Y Z X → 我 | 学校 Y → 去 | 没有 Z → 公园 | 人 那么以 Grammar 作为开始符号...这是因为我们没有给定上下文的约束,也就是说,因为有了 Y → 去 | 没有 这条产生式,所以只要遇到 Y,推导出“去”或者“没有”就都是合理的,而全然不需要关注“去“的上文是什么,”去“的下文是什么。

    2.1K11
    领券
    首页
    学习
    活动
    专区
    圈层
    工具