首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >ANTLR4 :不匹配的输入

ANTLR4 :不匹配的输入
EN

Stack Overflow用户
提问于 2013-07-17 21:31:44
回答 1查看 2.3K关注 0票数 0

我是个新手。我想编写一个语法来解析以下输入:

代码语言:javascript
运行
AI代码解释
复制
commit a1b2c3d4

语法如下:

代码语言:javascript
运行
AI代码解释
复制
grammar commit;

file : 'commit' COMMITHASH NEWLINE;

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

当我尝试使用语法解析上面的输入时,它会抛出以下异常:

第1行:0不匹配的输入‘提交a1b2c3d4’期待‘提交’

注意事项:我有意添加了日期标记。如果没有日期标记,它就可以正常工作。但是我想知道,当添加日期标记时会发生什么。

我已经提到了链接Antlr4: Mismatched input,但还不清楚发生了什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-17 22:00:36

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

您的lexer包含一个规则DATE,该规则与除换行符以外的所有字符匹配。由于这始终与一行的整个文本相匹配,而且您的标记没有一个跨越多行,因此结果如下:

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

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

  • 删除DATE规则,或者重写它以匹配更具体的日期格式。
  • 使用语义谓词和/或lexer模式来限制可能产生DATE令牌的输入中的位置。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17715217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档