当前位置: 首页 > 知识库问答 >
问题:

ANTLR4:输入不匹配

丁经略
2023-03-14

我是ANTLR的新手。我想写一个语法来解析下面的输入:

commit a1b2c3d4

语法如下::

grammar commit;

file : 'commit' COMMITHASH NEWLINE;

COMMITHASH : [a-z0-9]+;
DATE       : ~[\r\n]+;
NEWLINE    : '\r'?'\n';

当我尝试使用语法解析上述输入时,它会引发以下异常::

第1行:0不匹配的输入'commit a1b2c3d4',应为'commit'

我已经引用了ANTLR4:不匹配的输入链接,但仍然不清楚发生了什么。

共有1个答案

鲁建茗
2023-03-14

ANTLR lexer在使用解析器之前完全分配明确的令牌类型。当一个lexer规则比另一个lexer规则匹配更多字符时,ANTLR总是首选匹配更多字符的规则,而不管lexer规则在语法中的出现顺序如何。当两个或多个规则匹配完全相同长度的输入符号时(并且没有其他规则匹配的输入符号超过这个数目),将为语法中首先出现的规则分配标记类型。

您的lexer包含一个规则date,该规则匹配除换行符之外的所有字符。由于它总是与一行的整个文本匹配,并且没有一个令牌跨越多行,因此结果如下:

  • 如果单行的整个文本与commit匹配,将生成与此输入序列相对应的未命名标记。
  • 如果单行的整个文本与[a-z0-9]+匹配,则将为该行的整个文本创建commithash标记。date也与此输入匹配,但commithash首先出现,因此使用它。
  • 否则,如果单行至少包含一个字符,则将为该行的整个文本创建date标记。即使该行以commitcommithash开头,也将使用date规则,因为它匹配的字符序列较长。
  • 最后,将为每个换行创建换行符标记。

您需要执行以下操作之一来解决此问题。确切的策略取决于你试图解决的更大的问题。

  • 删除日期规则,或重写该规则以匹配更具体的日期格式。
  • 使用语义谓词和/或lexer模式来限制输入中可能生成date标记的位置。
 类似资料:
  • 我刚开始使用ANTLR4。我试图为一个简单的程序编写语法规则,但我很难让它工作。 null 任何帮助都很感激!

  • 我有一个现有的语法,我正在使用C#输出将其转换为Antlr4。它在第一个标记上失败,消息不匹配的输入'BEGIN'需要any_word。奇怪的是,当我打印出令牌以查看它被识别为什么令牌时,它表明它已经正确地识别了它。

  • 我的ANTLR4有问题。我正在尝试从python 3代码打印AST,但有一些错误,我不知道如何修复它们。 我编写了简单的测试代码: 我运行了程序,但出现了以下错误: 我的主要班级: 我有这个网站的语法:https://github.com/antlr/grammars-v4/tree/master/python3

  • ANTLR4.5给了我一个“不匹配的输入”String[]'期待'String'“,但我不明白为什么'[]'被包含在令牌中。 我已经把语法精简到最低限度,以显示问题: 我就是搞不清楚出了什么问题。

  • 所以我在学习java,两天来我一直在寻找这个问题的解决方案。我尝试了所有的十进制分隔符,并试图设置语言环境,结果发现它不起作用。 代码: 输出和错误