Antlr4:与正确的gammar不匹配

时间:2015-07-06 18:18:33

标签: java antlr antlr4

我遇到了非常有趣的问题。我们来看它作为一个例子。

grammar1

TAG_SYMBOL: '@';
tagSymbol: TAG_SYMBOL;

grammar2

TAG_SYMBOL: '@';
TAG: TAG_SYMBOL;
tagSymbol: TAG;

让我们用 tagSymbol 规则解析“@”文本。

语法1:

line 1:0 mismatched input '@' expecting '@'.

语法2:

OK.

为什么呢? :)

1 个答案:

答案 0 :(得分:0)

写作时:

TAG_SYMBOL: '@';
TAG: TAG_SYMBOL;

即使解析器可能需要@,输入TAG_SYMBOL仍将被标记为TAG,而不是TAG。这就是ANTLR的工作原理。匹配最多的词法分析器规则将获胜,当2个或更多词法分析器规则匹配相同数量的字符时,首先定义的那个将获胜。

您遇到的错误:

  

第1行:0输入不匹配' @'期待' @'。

应如下所示:

  

第1行:0输入文字不匹配' @'类型TAG_SYMBOL,期待' @'类型TAG

如果您想同时拥有标记标记符号,则应使用解析器规则:

parse     : tag | tagSymbol;
tag       : AT;
tagSymbol : AT;
AT        : '@';

修改

错误消息不对。我认为你没有(重新)生成一个新的解析器而感到困惑。

以下是我的测试结果:

语法1

grammar T;

TAG_SYMBOL: '@';
tagSymbol: TAG_SYMBOL;

语法2

grammar T;

TAG_SYMBOL: '@';
TAG: TAG_SYMBOL;
tagSymbol: TAG;

测试类:

public class Main {
  public static void main(String[] args) throws Exception {
    TLexer lexer = new TLexer(new ANTLRInputStream("@"));
    TParser parser = new TParser(new CommonTokenStream(lexer));
    parser.tagSymbol();
  }
}

从语法1生成解析器后运行主类不会产生错误/警告,并且从语法2生成的解析器会生成以下内容:

  

第1行:0输入不匹配' @'期待TAG

使用ANTLR 4.5进行测试。