删除 ANTLR 中的左递归

2023-12-23

正如中所解释的删除左递归 https://stackoverflow.com/questions/2652060/removing-left-recursion,有两种方法可以去除左递归。

  • 使用某些程序修改原始语法以删除左递归
  • 本来写语法就没有左递归

人们通常使用什么来通过 ANTLR 删除(不具有)左递归?我使用 flex/bison 作为解析器,但我需要使用 ANTLR。我唯一担心使用 ANTLR(或一般的 LL 解析器)是左递归删除。

  • 从实际意义上讲,ANTLR 中删除左递归有多严重?这是使用 ANTLR 的一个障碍吗?或者,ANTLR 社区中没有人关心它?
  • 我喜欢 ANTLR 的 AST 生成的想法。就快速、简单地获得 AST 而言,哪种方法(两种删除左递归方法中)更可取?

Added

我对以下语法做了一些实验。



E -> E + T|T
T -> T * F|F
F -> INT | ( E )
  

删除左递归后,我得到以下结果



E -> TE'
E' -> null | + TE'
T -> FT'
T' -> null | * FT'
  

我可以提出以下 ANTLR 表示。尽管它相对非常简单和直接,但似乎没有左递归的语法应该是更好的方法。



grammar T;

options {
    language=Python;
}

start returns [value]
   : e {$value = $e.value};
e returns [value]
   : t ep  
     {
       $value = $t.value
       if $ep.value != None:
         $value += $ep.value
     }
   ;
ep returns [value]
   : {$value = None}
   | '+' t r = ep 
     {
       $value = $t.value
       if $r.value != None:
            $value += $r.value
     }
   ;
t returns [value]
  : f tp 
    {
      $value = $f.value
      if $tp.value != None:
        $value *= $tp.value
    }
  ;
tp returns [value]
  : {$value = None}
  | '*' f r = tp 
    {
      $value = $f.value;
      if $r.value != None:
        $value *= $r.value
    }
  ;
f returns [int value]
  : INT {$value = int($INT.text)}
  | '(' e ')' {$value = $e.value}
  ;

INT :   '0'..'9'+ ;
WS: (' '|'\n'|'\r')+ {$channel=HIDDEN;} ;
  

考虑一个典型的参数列表:

parameter_list: parameter
              | parameter_list ',' parameter
              ;

由于您不关心优先级或与参数的关联性等任何内容,因此很容易转换为右递归,但代价是添加额外的产生式:

parameter_list: parameter more_params
              ;

more_params:
           | ',' parameter more_params
           ;

对于最严重的情况,你可能需要花一些时间在《龙之书》上。快速检查一下,这主要在第 4 章中介绍。

就严肃性而言,我很确定 ANTLR 根本不会接受包含左递归的语法,这会将其归入“绝对必要”类别。

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

删除 ANTLR 中的左递归 的相关文章

  • 如果双引号字符串以转义反斜杠结尾,则词法分析器规则会保持匹配字符,就好像它们是带引号字符串的一部分一样

    如果双引号字符串以转义的反斜杠结尾 则词法分析器规则会变得贪婪并保持匹配字符 就好像它们是带引号的字符串的一部分一样 然后词法分析器认为实际开始下一个带引号的字符串的双引号正在结束第一个字符串 并在后面的字符上给出语法错误 我们需要调整词法
  • 修改表达式,由 Antlr 生成?

    我想用 Antlr4 读取表达式并对它们执行一些修改 例如 如果语法是算术 我会修改表达式 表示 2 3 1 with 2 4 然后与 8 这就是 计算 或 简化 为了执行此操作 我将创建一些树结构 第一个想法是使用由 Antlr 创建的完
  • 我如何解释这个输入?

    我目前使用 ANTLR 在 Java 中实现了一种可用的 简单的语言 我想做的是将其嵌入纯文本中 与 PHP 类似 例如 Lorem ipsum dolor sit amet Phasellus volutpat dignissim sap
  • 在antlr中获取纯文本而不是令牌

    我正在尝试使用 antlr 创建一个解析器 我的语法如下 code codeBlock EOF codeBlock text tag1Ops tag2Ops tag1Ops START 1 TAG ID END 2 TAG tag2Ops
  • 来自 bison 的 ANTLR 语法

    我正在尝试将语法从 bison 翻译为 ANTLR 野牛的语法本身非常简单 但我找不到简单的方法来做到这一点 野牛语法 expr expr or expr expr and expr expr 欢迎任何提示 链接 指针 谢谢 尤利安 在AN
  • ANTLR2 与 ANTLR3

    您使用过其中一个或两者吗 您更喜欢哪一个 出于什么原因 例如 我最近学习了 v2 并且由于 netbeans 团队提供的高性能实现 是的 我被 java 困住了 我可能会坚持使用它 在这种情况下 是否有任何令人信服的理由进行转换 要了解 v
  • ANTLR4:词法分析器规则:任何字符串,只要不包含这两个并排字符?

    有没有办法在 ANTLR4 中表达这一点 任何字符串 只要它不立即包含星号 后面跟着一个正斜杠 这不起作用 因为 ANTRL 抛出此错误 multi character literals are not allowed in lexer s
  • 用于计算类数的部分语法

    我需要计算正确的 C 源文件中的类数量 我写了以下语法 grammar CSharpClassGrammar options language CSharp2 parser namespace CSharpClassGrammar Gene
  • ANTLR 4 树注入/重写运算符

    在 ANTLR 3 中您可以执行以下操作 andExpression andnotExpression gt andnotExpression AND a andnotExpression gt AndNode andExpression
  • 是否需要担心“解析器规则中的隐式标记定义”?

    我正在使用 ANTLR 和 ANTLRWorks 2 创建我的第一个语法 我已经完成了语法本身 它识别用所描述的语言编写的代码并构建正确的解析树 但除此之外我还没有开始任何事情 让我担心的是 解析器规则中第一次出现的标记都会用黄色曲线下划线
  • 我正在尝试使用 System.Reflection.Emit 编写 .NET 编译器,如何进行类型解析?

    我有一个从引用的 dll 解析类型的策略 我一直在尝试解析正在编译的程序集中定义的类型 我使用的是 System Reflection Emit api 没有第三方库 例如 class A class B public A AnInstan
  • 可视化使用 ANTLR 创建的 AST(在 .Net 环境中)

    为了一个我喜欢的项目 我开始摆弄 ANTLR 在学习了一些教程之后 我现在尝试为我自己的语言创建语法并生成 AST 现在我主要在 ANTLRWorks 中闲逛 但现在我已经验证了解析树似乎没问题 我想 迭代地 因为我仍在学习 仍然需要对最终
  • xtext 中的终端/数据类型/解析器规则

    我正在使用 xtext 2 4 我想做的是类似 SQL 的语法 让我困惑的是我不确定哪些东西应该被视为终端 数据类型 解析器规则 到目前为止我的语法相关MyTerm is Model terms MyTerm MyTerm constant
  • 编写对空格敏感的解析器规则,同时从词法分析器中跳过 WS

    我在处理空白时遇到一些麻烦 在以下语法摘录中 我设置了词法分析器 以便解析器跳过空格 ENTITY VAR user resource INT DIGIT DIGIT ID LETTER LETTER DIGIT SPECIAL ENTIT
  • 删除这种左递归方式来定义 SELECT 语句

    我正在尝试解析以下内容SELECT陈述 select 1 union all select 1 union all with cte as select 1 select 1 from tbl limit 1 union all selec
  • Antlr 语法生成无效的 C# 代码

    我正在尝试使用 ANTLR 和 StringTemplate 库开发一个 C 代码生成器 AntlrWorks 可以生成 C 解析器和词法分析器文件 而不会报告任何错误 但是 c 解析器代码无效 无法在 Visual Studio 中编译
  • 解析树和抽象语法树(AST)有什么区别?

    它们是由编译过程的不同阶段生成的吗 或者它们只是同一事物的不同名称 这是基于表达评估器 http www antlr3 org works help tutorial calculator html泰伦斯 帕尔的语法 本例的语法 gramm
  • 使用 ANTLR3 解析换行符、EOF 作为语句结束标记

    我的问题是关于在 ANTLRWorks 中运行以下语法 INT 0 9 SEMICOLON NEWLINE r n n r STMTEND SEMICOLON NEWLINE NEWLINE statement STMTEND INT ST
  • 编程语言解析器的来源?

    我正在清理我的一个旧项目 该项目计算有关大型软件项目的许多简单指标 指标之一是文件 类 方法的长度 目前 我的代码 猜测 类 方法边界的位置基于非常粗略的算法 遍历文件 维护 当前深度 并在遇到未加引号的括号时调整它 当您返回到类或方法开始
  • 在 ANTLR4 中如何检查行的第一个字符是否为“*”?

    我正在尝试为一种相对简单但特殊的语言编写一个解析器 简单地说 规则之一是注释行用星号表示only如果该星号是该行的第一个字符 我如何在 ANTLR4 中正式化这样的规则 我考虑过使用 START LINE COMMENT n n gt sk

随机推荐

  • 如何从 Kotlin 运行 PowerShell 脚本?

    如何使用 Kotlin 运行 Powershell 脚本 我尝试移植在 StackOverflow 上找到的一些 Java 代码 但无法让它工作 我还尝试了以下方法 Runtime getRuntime exec powershell ex
  • 与 matlab 相比,fftw/c++ 计算 fft 是错误的

    我正在尝试使用 C 进行 fftw 我想测试一下它是否正常工作 我实现了一个简单的 ifft fft shift data data 0 测试一下 完全失败 测试数据是一个矩形函数 幅度和相位为1 用于比较的matlab代码与相同的测试完美
  • perl6如何获取promise的具体身份?

    我正在尝试编写在 Promise 中运行的 3 个 echo 服务器的代码 但我想知道哪个 Promise 正在执行回显 有没有办法做到这一点 no strict for 0 2 gt index result index start my
  • 用新文件替换旧文件

    我正在尝试编写一个脚本来用新文件内容替换旧文件内容 新文件内容以以下格式显示 旧文件 something txt新文件 something txt new 旧文件需要替换为新文件内容新文件名要重命名而不用新名称旧文件需要删除 下面的脚本不起
  • 在没有条件比较的情况下以数学方式查找最大值

    更新 到目前为止 codymanix 和 Moonshadow 提供了很大的帮助 我能够使用方程解决我的问题 而不是使用右移除以 29 因为使用 32 位有符号 2 31 溢出到 29 这有效 PHP 原型 r x x y x y 29 L
  • 内部类必须引用封闭类吗?

    我有一个内部类 非静态 它在初始化时使用对封闭类的引用 内部类现在会保留对封闭类的引用吗 class Enclosing class Inner private final ABC innerField outerField compute
  • 简化多重回波

    我在选择菜单中有完整的时区列表 如下所示
  • 在 Angular >=6 模板中扩展元素的属性

    我的代码中有这个 Component selector generic input template div div
  • 客户端脚本中的图像亮度检测

    有谁知道是否有一个脚本可以使用客户端脚本来检测图像 包括 HTML 中的暗度 亮度 我基本上希望能够检测背景中使用的图像的亮度 暗 亮 并让 CSS HTML jQuery JS 根据暗或亮 真或假 的变量来调整页面 我知道有可用的服务器端
  • 与react和express(nginx,docker)建立网络套接字通信

    尝试设置 websocket 连接 当我在本地主机环境中时它工作正常 但是一旦我设置了 docker 环境 客户端 react 就很难与 Express 建立 web socket 通信 我应该定义什么网址才能在两者之间打开网络套接字 我试
  • 使用 Python 将 .doc 转换为纯文本

    我正在尝试使用 texttract 将我的 doc 文件转换为纯文本 import textract text textract process path to file extension 但我收到这个错误 AttributeError
  • Lua 模式匹配与正则表达式

    我现在正在学习lua 关于lua中的模式匹配 我在lua org上的lua文档中找到了以下句子 尽管如此 Lua 中的模式匹配是一个强大的工具 并且包含一些难以与标准 POSIX 实现匹配的功能 由于我熟悉 posix 正则表达式 我想知道
  • Plotly:如何设置自定义 xticks

    From 情节性的文档 https plotly com python reference scatter 布局 gt x 轴 gt 刻度值 设置该轴上的刻度值 出现 仅在以下情况下有效tickmode设置为 数组 与使用ticktext
  • Date().toLocaleString() 输出格式在实时服务器和本地主机上不同

    在我的 Nodejs 应用程序中 我需要日期Y m d H i s格式 我使用这个简单的代码 console log new Date toLocaleString 在本地计算机中我得到 2019 1 8 04 14 28这是正确的格式 但
  • 如何设置 Xcode 插件以进行代码自动格式化[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个在 XCode 中自动格式化 Objective C 代码的插件 拥有一组可选的样式格式也会非常有帮助 我的目标是遵循 Go
  • ElementNotVisibleException:消息:尝试单击 YouTube 搜索中的顶部视频时出现元素不可交互错误

    我似乎无法找到一种方法来单击正确的元素以获得我正在寻找的网址 本质上我想点击topYouTube 搜索中的视频 排名最高的返回视频 如何解决 ElementNotInteractableException 元素在 Selenium webd
  • 在 Windows 上运行导入 xmlrpclib 的 Python 脚本?

    我一直使用Linux来编写Python脚本 但现在我必须让其中一个在Windows XP上运行 在这里我是一个初学者 我已在 C Python34 中安装了 Python 3 4 并且我的 Python 脚本位于 E solidworks
  • 无法将 Laravel 连接到 MailChimp (laravel 5.4)

    我必须在我的列表中定义列表 ID 和 MailChimp API 密钥 env文件 我确信两者都很好 即使我没有收到任何错误 但电子邮件未插入我安装的列表中https github com spatie laravel newsletter
  • Excel 中单元格的数值类型是否始终被视为 DOUBLE?

    In VBA 如本规范 http msdn microsoft com en us library ee177324 aspx如图所示 数值可以有多种类型 Double Integer Long LongLong Single Decima
  • 删除 ANTLR 中的左递归

    正如中所解释的删除左递归 https stackoverflow com questions 2652060 removing left recursion 有两种方法可以去除左递归 使用某些程序修改原始语法以删除左递归 本来写语法就没有左