ANTLR4 不报告歧义

2024-03-14

给出以下语法:

grammar ReportAmbiguity;

unit : statements+;

statements : 
        callStatement+
        // '.'         // <- uncomment this line
    ;

callStatement : 'CALL' ID (argsByRef | argsByVal)*;

argsByRef : ('BY' 'REF')? ID+;

argsByVal : 'BY' 'VAL' ID+;

ID : ('A'..'Z')+;

WS : (' '|'\n')+ -> channel(HIDDEN);

解析字符串时"CALL FUNCTION BY VAL A B"通过非根规则callStatement一切正常,解析器正确报告歧义:

line 1:24 reportAttemptingFullContext d=6 (argsByVal), input='B'
line 1:24 reportAmbiguity d=6 (argsByVal): ambigAlts={1, 2}, input='B'

解析器正确输出树:(callStatement CALL FUNCTION (argsByVal BY VAL A B)).

现在考虑取消上面显示的行(第七行)的注释。再次测试一切。

解析器仍然输出相同的树,但歧义性报告消失了。为什么这种明显不明确的语法和如此不明确的输入不再被报告?

(这是一个更大问题的一部分。我试图理解这一点,以便我可以确定我的语法中另一个可能的问题。)

EDIT 1

使用antlr4版本4.6。

我在github上准备了一个pet项目:https://github.com/rslemos/pet-grammars https://github.com/rslemos/pet-grammars(在模块中g, type mvn clean test -Dtest=br.eti.rslemos.petgrammars.ReportAmbiguityUnitTest对评论版本进行测试;取消注释第 7 行并再次运行它以查看它失败)。

EDIT 2

Changed unit: statements*; to unit: statements+;。此更改本身对原始问题没有任何改变。它只允许另一种体验(进一步版本待定)。

EDIT 3

触发此错误的另一种方法是更改unit: statements+; to unit: statements+ unit;.

就像添加时一样'.' to statements,这一改变也使得antlr4放弃了歧义检测。

我认为这与EOF可能接下来argsByVal.

第一种选择(附加'.' to statements) 排除EOF就在之后出现argsByVal.

第二个(附加unit到它自己)使其成为非根规则(并且似乎 antlr 隐式附加EOF每个根规则)。

我一直认为 antlr4 规则应该以我们喜欢的任何方式调用,没有任何规则给予特殊处理,根规则之所以如此命名只是因为我们(语法作者)知道哪个规则是根。

EDIT 4

可能与https://github.com/antlr/antlr4/issues/1545 https://github.com/antlr/antlr4/issues/1545.


None

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

ANTLR4 不报告歧义 的相关文章

随机推荐

  • 创建 C++ 枚举和依赖数据结构时如何避免重复? [复制]

    这个问题在这里已经有答案了 可能的重复 枚举到字符串 如果无效 未找到 则返回枚举整数值 https stackoverflow com questions 10175260 enum to string return the enum i
  • 如何对数组进行分组

    我正在尝试使用相同的标签对相似的对象进行分组 目前 这是我收到的 JSON const sizes id value 2496 label XS value 2499 label S type First Size id value 286
  • 如何通过后台服务在android中每天的特定时间重复通知

    您好 我正在开发应用程序 我通过后台服务设置了用户输入日期和时间的通知 现在我想设置每天下午 6 点的通知 闹钟 询问用户是否要添加另一个条目 我怎样才能实现这个目标 我应该使用相同的后台服务还是广播接收器 请给我更好的解决方案 教程将是个
  • 如何在不配置浏览器的情况下构建本地 Web 代理

    Netnanny 或 k9 Web Protection 如何在不配置浏览器的情况下设置 Web 代理 如何做呢 直接使用WinSock 或者在NDIS http en wikipedia org wiki Network Driver I
  • ARM 模板数组参数

    我有一个带有 Web 应用程序警报规则的 ARM 模板 我希望能够在其中配置哪些电子邮件收到警报 电子邮件警报操作的片段如下 action odata type Microsoft Azure Management Insights Mod
  • 检测到可能存在 DNS 欺骗。远程主机标识已更改

    我最近更换了服务器 因此我有了一个新的 IP 地址 当我尝试使用时git fetch remote repository 我明白了 gt C Users path app gt git fetch remote repository gt
  • Java RMI 和 RPC 有什么区别?

    Java RMI 和 RPC 之间的实际区别是什么 我在一些地方读到 RMI 使用对象 RPC是基于C的 因此它具有结构化编程语义 另一方面 RMI是基于Java的技术 并且是面向对象的 通过 RPC 您可以调用导出到服务器中的远程函数 在
  • 检测麦克风是否打开

    有没有办法以编程方式检测 Windows 上的麦克风是否打开 不 麦克风不会告诉您它们是否 打开 或者特定的声道是否已连接到麦克风设备 您能做的最好的事情就是从您怀疑是麦克风的输入通道 例如Windows默认输入设备 通道 读取音频数据 并
  • 如何获取数据列表的更改事件?

    我正在使用数据列表 需要检测用户何时从下拉列表中选择某些内容 类似的问题已被问到 https stackoverflow com questions 16027746 jquery event when html5 datalist opt
  • 将 SVG 图像转换为 png 以供不支持的浏览器使用 - 后备 - Modernizer.js(?) [重复]

    这个问题在这里已经有答案了 我正在考虑转几个SVG我的网站上的图像PNG对于不支持的浏览器SVG适当地 我主要对显示的基于文本的问题有疑问IE 显示的字体完全错误 所以我想我应该创建一个后备PNG 我已经尝试为此寻找一个很好的演练 我自认是
  • 使用函数式编程有效地计算素数

    通过回顾 Project Euler 并解决一些问题 我逐渐熟悉了 F 许多早期问题都由素数组成 环顾四周后 我想出了以下解决方案 let primesL let rec prim n sofar seq if sofar gt List
  • 如何在拖动 UICollectionViewCell 时实现透明背景或圆角

    我确定有must这是一种简单的方法 但我已经花了很长时间在各种兔子洞里 到目前为止还没有成功 我有一个支持拖放的集合视图 被拖动的单元格有一个UIImageView in the contentView 并且图像视图的背衬层应用了角半径 单
  • 如果其中一个进程意外终止,进程间内存会发生什么情况?

    如果您对动机感兴趣 我将在接下来的几句话中详细说明 如果不是 请跳至问题 我正在考虑制作快速记录器 但当程序崩溃时不受影响 又名最后一些日志消息不会丢失 所以我的想法是写入共享内存 ringbuffer 并让另一个低优先级进程从中读取并进行
  • 如何在jsf中启用浏览器缓存

    我使用 JSF 2 0 创建了一个 Web 应用程序 我收到朋友的反馈说我应该执行 浏览器缓存 因为我有很多图像 但是我不知道如何在 JSF 中做同样的事情 任何想法 提示将不胜感激 关于要做什么的概念也会起作用 只需使用
  • 继承和多态性的低级细节

    这个问题是我心中的一大疑惑 也很难用语言来形容 有时它看起来很明显 有时却很难破解 所以问题是这样的 class Base public int a number Base virtual void function1 virtual vo
  • 如何通过 Java High Level Rest Client 实现安全弹性搜索

    我是弹性搜索新手 通过将我的 Spring boot 应用程序与 Elastic 搜索集成Java High Level Rest Client 我已经配置了 JHLRC bean 如下所示 它工作正常 Bean destroyMethod
  • 调试时如何直接在IDE中查看其他对象的私有字段?

    C 是我最熟悉的语言 但工作时使用 Java 我想你可以说我对使用 Visual Studio IDE 非常满意 我喜欢它的调试器的一件事是我可以将监视变量 Eclipse 中的 表达式 any表达 因此 我可以在调试时毫无问题地查看特定字
  • 如何在Python中将集合转换为列表?

    我正在尝试将 Python 2 6 中的集合转换为列表 我正在使用这个语法 first list 1 2 3 4 my set set first list my list list my set 但是 我得到以下堆栈跟踪 Tracebac
  • cmake:将 FetchContent 与 find_package() 集成

    我试图理解以下文档 https cmake org cmake help latest module FetchContent html integrating with find package https cmake org cmake
  • ANTLR4 不报告歧义

    给出以下语法 grammar ReportAmbiguity unit statements statements callStatement lt uncomment this line callStatement CALL ID arg