我是个新手。我想编写一个语法来解析以下输入:
commit a1b2c3d4
语法如下:
grammar commit;
file : 'commit' COMMITHASH NEWLINE;
COMMITHASH : [a-z0-9]+;
DATE : ~[\r\n]+;
NEWLINE : '\r'?'\n';
当我尝试使用语法解析上面的输入时,它会抛出以下异常:
第1行:0不匹配的输入‘提交a1b2c3d4’期待‘提交’
注意事项:我有意添加了日期标记。如果没有日期标记,它就可以正常工作。但是我想知道,当添加日期标记时会发生什么。
我已经提到了链接Antlr4: Mismatched input,但还不清楚发生了什么。
发布于 2013-07-17 22:00:36
在使用解析器之前,ANTLR语法分析器完全分配明确的令牌类型。当一个lexer规则可以匹配比另一个lexer规则更多的字符时,ANTLR总是倾向于选择匹配更多字符的规则,而不管该规则在语法中的出现顺序如何。当两个或多个规则完全匹配相同长度的输入符号(并且没有其他规则匹配超过此数目的输入符号)时,将为语法中首先出现的规则分配令牌类型。
您的lexer包含一个规则DATE
,该规则与除换行符以外的所有字符匹配。由于这始终与一行的整个文本相匹配,而且您的标记没有一个跨越多行,因此结果如下:
commit
匹配,则将产生与此输入序列相对应的未命名令牌。[a-z0-9]+
匹配,则将为该行的整个文本创建一个COMMITHASH
令牌。DATE
也与此输入相匹配,但COMMITHASH
首先出现,因此它被使用。DATE
令牌。即使行以commit
或COMMITHASH
开头,也将使用DATE
规则,因为它匹配较长的字符序列。NEWLINE
令牌。您需要执行以下操作之一来解决问题。确切的策略取决于你想要解决的更大的问题。
DATE
规则,或者重写它以匹配更具体的日期格式。DATE
令牌的输入中的位置。https://stackoverflow.com/questions/17715217
复制相似问题