gpt4 book ai didi

ANTLR4 : mismatched input

转载 作者:行者123 更新时间:2023-12-04 02:51:02 24 4
gpt4 key购买 nike

我想匹配表单的输入::

commit a1b2c3
Author: Michael <michael@test.com>

commit d3g4
Author: David <david@test.com>

这是我写的语法:

grammar commit;

file : commitinfo+;

commitinfo : commitdesc authordesc;
commitdesc : 'commit' COMMITHASH NEWLINE;
authordesc : 'Author:' AUTHORNAME '<' EMAIL '>' NEWLINE;

COMMITHASH : [a-z0-9]+;
AUTHORNAME : [a-zA-Z]+;
EMAIL : [a-zA-Z0-9.@]+;
NEWLINE : '\r'?'\n';
WHITESPACE : [ \t]->skip;

上述解析器的问题在于,对于上述输入,它完全匹配。但是当输入更改为:

commit c1d2
Author: michael <michael@test.com>

它抛出如下错误:

第 2:8 行不匹配的输入“michael”需要 AUTHORNAME。

当我打印 token 时,字符串“michael”似乎与 token COMMITHASH 而不是 AUTHORNAME 匹配。

如何解决上述情况?

最佳答案

ANTLR4 根据写入顺序匹配词法分析器规则。

'michael' 与规则 COMMITHASH : [a-z0-9]+ ; 匹配,该规则出现在规则 AUTHORNAME 之前,并且因此你有错误。

我可以想到以下选项来解决您面临的问题:

  • 您可以使用 ANTLR 中的'mode' 功能:在 ANTLR 4 中,一次激活一种词法分析器模式,最长的非片段词法分析器规则 将确定创建哪个 token 。您的语法仅包含默认模式,因此所有词法分析器规则均处于事件状态,因此“迈克尔”与 COMMITHASH 匹配,因为匹配的 token 长度与 COMMITHASH 相同,并且AUTHORNAMECOMMITHASH 在语法中出现在 AUTHORNAME 之前。

  • 您可以通过互换词汇规则在语法中的出现方式来更改词汇规则。假设您的 COMMITHASH 规则总是有一个与之匹配的数字。按照以下方式将 AUTHORNAME 放在 COMMITHASH 之前:

    grammar commit;
    ...

    AUTHORNAME : [a-zA-Z]+;
    COMMITHASH : [a-z0-9]+;
    ...

注意:我强烈觉得你的词法分析器规则写得不够清晰。您确定您的 COMMITHASH 规则应该是 [a-z0-9]+; 这意味着像 'abhdks' 这样的标记也将与您的 COMMITHASH 规则匹配。但那是完全不同的问题。

关于ANTLR4 : mismatched input,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17724175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com