消除立即左递归

2024-02-15

我明白,为了从包含 A⇒Aα 形式产生的语法中消除立即左递归,我需要将其替换为 A⇒βA' 和 A'⇒αA/ε

我有以下产生式,我需要消除立即左递归

E⇒E+T/T

E⇒E+T/T

T⇒T*F/T

F⇒(E)/(id)

我可以看到,消除后第一个生产变成

E⇒TE'

E'⇒+TE'/Tε

有人可以解释这是怎么来的吗


这实际上只是遵循算法的问题。我们来看一下一般情况。根据算法的形式规则:

A => A a1 | ... | A aN | b1 | .. | bN

where A a1, ..., A aN是终结符和非终结符的非零左递归序列,并且b1, ..., bN是终结符和不以终结符开头的非终结符的序列A.

该算法表示我们需要将其替换为

A => b1 A' | ... | bN A'
A' => a1 A' | ... | aN A' | epsilon

我们来看看你的案例。在这里我们有

E => E + T | T

所以你可以想到a1是序列+ T since E + T是终结符和非终结符的左递归序列。同样你可以想到B1 as T因为这是一个非左递归序列。我们现在用它来定义新的非终结符E as:

E => b1 E'

自从b1 is T这变成

E => T E'

定义E' we get

E' => a1 E' | epsilon

自从a1 is + T这变成

E' => + T E' | epsilon 

这样你就得到了语法

E => T E'
E' => + T E' | epsilon
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

消除立即左递归 的相关文章

  • F# 中的递归对象?

    这段 F 代码 let rec reformat new EventHandler fun gt b TextChanged RemoveHandler reformat b gt ScrollParser rewrite contents
  • Eclipse 中的 AST 处理无法解析绑定

    我正在使用 eclipse JDT AST 解析器来处理一些 Java 代码 并尝试提取字段和方法声明的类型绑定 这样做的逻辑位于我的 Visitor 类中 见下文 不幸的是 我没有任何运气 并且没有任何绑定能够解析 它们始终为空 有趣的是
  • 使用 PHP 自动将引用的 LESS 文件编译为 CSS

    我希望发生以下事情 让流程在服务器端自动化 只需能够像在代码中引用 CSS 文件一样引用 LESS 文件 用户将返回缩小的 CSS 而不是缓存的 LESS 文件 因此编译器不需要运行 除非 LESS 文件已更新 为了这个工作any在我的域内
  • Python 递归搜索带有嵌套键的字典

    我最近必须使用嵌套的字典 列表组合来解决实际数据系统中的问题 我为此工作了很长一段时间并提出了解决方案 但我非常不满意 我不得不求助于使用globals 和一个命名的临时全局参数 我不喜欢使用全局变量 这只是要求注入漏洞 我觉得必须有一种更
  • 使用 Python ast 模块访问语法树中的节点

    我正在玩 python ast 抽象语法树 我编写了以下内容 它访问了 AST 的所有节点 import ast class Py2Neko ast NodeVisitor def generic visit self node print
  • 解析器解析 SQL 查询并返回 Java 中的列名和相应的表名 [重复]

    这个问题在这里已经有答案了 可能的重复 Java 的 SQL 解析器库 https stackoverflow com questions 660609 sql parser library for java 我需要一个解析器 它应该以以下
  • 如何根据递归关系确定递归树的高度?

    如何确定在处理递归运行时时构建的递归树的高度 它与确定普通树的高度有何不同 替代文本 http homepages ius edu rwisman C455 html notes Chapter4 ch4 9 gif http homepa
  • HTML 和 BeautifulSoup:当结构事先不知道时如何迭代解析?

    我从一个简单的 HTML 结构开始 如下所示 感谢 alecxe 的帮助 我能够创建这个 JSON 字典 u Outer List u Inner List u info 1 u info 2 u info 3 使用他的代码 from bs
  • ANTLR4 在导入时找不到语法

    我正在尝试将 ANTLR4 语法拆分为多个文件 以便我可以更轻松地测试它们 我在 java 项目中使用 gradle 作为构建工具 两种语法都单独正确编译 但是当我将导入添加到我的主语法中时 我收到下一个编译错误 错误 110 kaneko
  • AWK 中多行的匹配正则表达式。 && 操作员?

    我不确定 运算符在正则表达式中是否有效 我想做的是匹配一行 使其以数字开头并具有字母 a 下一行以数字开头并具有字母 b 并且下一行 字母 c 该 abc 序列将用作开始读取文件的唯一标识符 这就是我在 awk 中想要的东西 0 9 a n
  • 是否可以使用 fparsec 解析“越位”(基于缩进)语言?

    我希望将 FParsec 用于基于缩进的类似 python 的语言 我知道这必须在词法分析阶段完成 但 FParsec 没有词法分析阶段 是否可以使用 FParsec 或者 词法分析后如何提供它 P D 我是 F 新手 但在其他语言方面经验
  • 如何在不进行尾调用优化的情况下用函数式编程替代方案替换 while 循环?

    我正在 JavaScript 中尝试一种更实用的风格 因此 我用诸如map和reduce之类的实用函数替换了for循环 然而 我还没有找到 while 循环的功能替代品 因为尾部调用优化通常不适用于 JavaScript 据我了解 ES6
  • XAML解析异常

    我有一个简单的 XAML 页面 当它作为 Visual Studio 中任何应用程序的一部分加载时 加载效果良好 但是 当我使用 ClickOnce 部署此应用程序时 出现以下异常 Type System Windows Markup Xa
  • 在压缩存档内的文本文件上运行“head”,而不解压存档

    问候 我接手了之前的团队并编写了处理 csv 文件的 ETL 作业 我在 ubuntu 上结合使用 shell 脚本和 perl csv 文件很大 它们以压缩档案形式到达 解压后 很多都超过 30Gb 是的 那是 G 旧进程是在 cron
  • MSBuild 与编译器

    从命令提示符使用 MSBuild 和 C 编译器有什么区别 我想在不使用 Visual Studio 的情况下手动构建我的解决方案 项目 并且我想学习如何使用命令行工具 C 编译器你的意思是csc exe 如果这就是你的意思 那么csc a
  • CompileAssemblyFromDom 抛出访问被拒绝异常

    代码 using var codeProvider new CSharpCodeProvider var compilerParameter new CompilerParameters assemblies assemblyName fa
  • 第一次机会异常 - 在内存位置长?

    这是什么 我该如何处理 修复它 First chance exception at 0x756fb727 in Program exe Microsoft C exception long at memory location 0x0018
  • 查找嵌套列表中元素的索引?

    我有一个类似的列表 mylist lt list a 1 b list A 1 B 2 c list C 1 D 3 是否有一种 无循环 方法来识别元素的位置 例如如果我想用 5 替换 C 的值 并且在哪里找到元素 C 并不重要 我可以这样
  • 任何reinterpret_cast改变指针值的真实例子?

    根据 C 标准 reinterpret cast一个指针的T 到其他类型的指针Q 可以改变或不改变指针值 https stackoverflow com questions 1863069 casting via void instead
  • jQuery 解析 JSON

    当我尝试解析 JSON 验证的字符串时收到此错误 JSON parse 意外字符 当我删除需要转义的字符 style width 400px 时 它完美地工作 我缺少什么 在使用 parseJSON 之前是否有一种独特的方法来转义字符 va

随机推荐