ANTLR4 词法分析器无法解决语法顺序中的歧义

2024-05-19

使用 ANTLR 4.2,我尝试对此测试数据进行非常简单的解析:

RRV0#ABC

使用最小语法:

grammar Tiny;

thing : RRV N HASH ID ;

RRV : 'RRV' ;
N : [0-9]+ ;
HASH : '#' ;
ID : [a-zA-Z0-9]+ ;
WS : [\t\r\n]+ -> skip ; // match 1-or-more whitespace but discard

根据 Terence Parr 的 Definitive ANTLR 4 参考的以下摘录,我希望词法分析器 RRV 在 ID 之前匹配:

BEGIN : 'begin' ; // match b-e-g-i-n sequence; ambiguity resolves to BEGIN
ID : [a-z]+ ; // match one or more of any lowercase letter

使用上述测试数据运行 ANTLR4 测试装置,输出为

[@0,0:3='RRV0',<4>,1:0]
[@1,4:4='#',<3>,1:4]
[@2,5:7='ABC',<4>,1:5]
[@3,10:9='<EOF>',<-1>,2:0]
line 1:0 mismatched input 'RRV0' expecting 'RRV'

我可以看到第一个令牌是 ID 的 ,值为“RRV0”

我尝试重新排列词法分析器项目顺序。我还尝试通过在语法规则中显式匹配(而不是通过显式词法分析器项)来使用隐式词法分析器项。我也尝试过让比赛变得不贪婪。这些对我来说并不成功。

如果我将词法识别 ID 项更改为不匹配大写,则 RRV 项确实匹配,并且解析将进一步进行。

我从 ANTLR 4.1 开始也遇到了同样的问题。

我在 ANTLRWorks 和命令行中进行了检查,两种方式的结果相同。

如何更改语法以匹配词法分析器项目 RRV 优先于 ID ?


仅当两个不同的词法分析器规则匹配相同长度的标记时,语法顺序解析策略才适用。当长度不同时,最长的总是获胜。就你而言,ID规则匹配长度为 4 的令牌,该长度比RRV仅匹配 3 个字符的标记。

这种策略对于 Java 这样的语言尤其重要。考虑以下输入:

String className = "";

以及以下两个语法规则(稍微简化):

CLASS : 'class';
ID : [a-zA-Z_] [a-zA-Z0-9_]*;

如果我们只考虑语法顺序,那么输入className将产生一个关键字,后跟标识符Name。重新安排规则并不能解决问题,因为那样就无法创建一个CLASS令牌,即使对于输入class.

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

ANTLR4 词法分析器无法解决语法顺序中的歧义 的相关文章

  • context.getText() 排除 ANTLR4 中的空格

    getText 返回完整的语句 不包括单词之间的空格 考虑空格的一种方法是将它们包含在语法中 但是 有没有其他方法可以获取考虑空格的完整字符串 是的 有 假设您在这里使用ParserRuleContext getText 这个想法是向输入字
  • Antlr4 从错误中恢复并继续解析直到 EOF

    我正在使用 Antlr 4 5 用 Ja va 编写 C 语法 当我处理具有预处理器指令的 C 源代码时 示例代码 using System using System Collections Generic using System Lin
  • 有没有办法生成单元测试来测试我的语法

    我使用 antlr4 创建了语法 但我想测试稳健性有没有自动工具或快速完成此操作的好方法 谢谢 由于很难找到 ANTLR 的真正单元测试 我写了两篇关于它的文章 Lexer 的单元测试 解析器的单元测试 A 词法分析测试检查给定文本是否被读
  • 如何在ANTLR4中实现错误处理

    我有以下语法用于解析应用于图形的一阶逻辑公式 grammar Graph PARSER RULES input formula EOF formula TRUE FALSE formula AND formula formula OR fo
  • 如何使用 ANTLR4 创建 AST?

    我对此进行了很多搜索 但找不到任何有用的东西可以真正帮助我构建 AST 我已经知道 ANTLR4 不像 ANTLR3 那样构建 AST 每个人都说 嘿 使用访问者 但我找不到任何示例或更详细的解释如何做到这一点 我有一个必须像 C 语言一样
  • antlr4:ATN 版本 2 预计 3

    当尝试使用生成的语法和词法分析器时 我得到 org antlr v4 runtime atn ATN 无法使用版本 2 预期为 3 反序列化 ATN 怎么了 您的解析器是使用 ANTLR 4 0 生成的 但您尝试使用 ANTLR 4 1 执
  • Antlr4:如何在语法中隐藏和使用令牌

    我正在解析一种定义两种类型的语句的脚本语言 控制语句和非控制语句 非控制语句总是以 而控制语句可能以以下结尾 or EOL n 语法的一部分如下所示 script statement EOF statement control statem
  • antlr4数组实现:获取元素的值

    我正在尝试在 antlr4 中实现数组 但我不知道如何在初始化数组时获取数组的多个元素 如下所示 int array 1 2 我正在考虑将它们放入像这样的 HashMap 中 关键是索引 public Map
  • 在antlr中获取纯文本而不是令牌

    我正在尝试使用 antlr 创建一个解析器 我的语法如下 code codeBlock EOF codeBlock text tag1Ops tag2Ops tag1Ops START 1 TAG ID END 2 TAG tag2Ops
  • AnTLR4 C# 中的解析树

    我目前正在使用针对 C 的 AnTLR4 创建语法 但在开发访问者时遇到问题 我找不到书中提到的 ParseTree 类 书中我们有 LabeledExprLexer lexer new LabeledExprLexer input Com
  • ANTLR语法互左递归

    我确实知道这个问题已经被问过很多次了 我正在尝试使用 ANTLR 构建语法 Predicate LOWERCASE Predicate VarChars VarChars LOWERCASE UPPERCASE fragment LOWER
  • 删除这种左递归方式来定义 SELECT 语句

    我正在尝试解析以下内容SELECT陈述 select 1 union all select 1 union all with cte as select 1 select 1 from tbl limit 1 union all selec
  • ANTLR4 不报告歧义

    给出以下语法 grammar ReportAmbiguity unit statements statements callStatement lt uncomment this line callStatement CALL ID arg
  • 如何在 Eclipse 中使用 Antlr4 Ide 查看实时解析树?

    我是 Antlr4 的新手 但我知道 Eclipse 存在一个插件 我有一个简单的问题 创建 g4 文件后 如何可视化实时解析树以便查看输入表达式的树 谢谢 在 Eclipse 中安装 Antlr4Ide 插件后 窗口 gt 显示视图 gt
  • ANTLR4 词法分析器无法解决语法顺序中的歧义

    使用 ANTLR 4 2 我尝试对此测试数据进行非常简单的解析 RRV0 ABC 使用最小语法 grammar Tiny thing RRV N HASH ID RRV RRV N 0 9 HASH ID a zA Z0 9 WS t r
  • antlr4-tool 在 Win10 中失败,并显示:错误:命令失败:哪个 java

    在Win10中运行 为了尝试在Node JS中创建解析器 我安装了ANTLR4工具 npm install save dev antlr4 tool Ran c prj parser node modules bin antlr4 tool
  • Gradle 找不到 Antlr 令牌文件

    我创建了一个文件MyLexer g4 inside myproject src main antlr com mypackage like lexer grammar MyLexer DIGIT 0 9 WS t r n gt skip 然
  • 我正在尝试为 Antlr4 Python3.g4 语法文件生成解析树,以解析 python3 代码

    我正在使用 ANTLR4 并尝试为我拥有的 python 文件生成解析树 我使用了 ANTLR4 文档中的语法文件 python3 g4 我安装了antlr4 python3 runtime 并且运行了以下命令 antlr4 Dlangua
  • 在简单整数列表语法中使用 AntLR4 中的访问者

    我是 AntLR 的新手 我使用的是AntLR4版本 我编写了以下属性语法 它识别整数列表并在末尾打印列表的总和 list g4 grammar list header import java util List import java u
  • ANTLR4 的最小示例 Gradle 项目(带有 antlr 插件)是什么?

    我创建了新的 Gradle 项目 添加了 apply plugin antlr and dependencies antlr org antlr antlr4 4 5 3 to build gradle Created src main a

随机推荐