关于 ANTLR 4 中的语义谓词

About semantic predicate in ANTLR 4

这个问题:,回答者说下面的语法可以匹配以XYZ结尾的文本,不包含XYZ,但是我发现不可以,正确的语法应该是什么?

grammar UseLookahead;

parserRule : LexerRule;

LexerRule : .+? { (_input.LA(1) == 'X') &&
                  (_input.LA(2) == 'Y') &&
                  (_input.LA(3) == 'Z') 
                }?
          ;

我在本地测试发现'Blah Blah XYZ'只匹配'B'.

当我使用以下 Java 代码测试你的语法时:

String source = "Blah Blah XYZ";

UseLookaheadLexer lexer = new UseLookaheadLexer(CharStreams.fromString(source));
CommonTokenStream stream = new CommonTokenStream(lexer);
stream.fill();

for (Token t : stream.getTokens()) {
  System.out.printf("%-35s `%s`%n",
      UseLookaheadLexer.VOCABULARY.getSymbolicName(t.getType()),
      t.getText().replace("\n", "\n"));
}

打印如下:

LexerRule                           `Blah Blah `
EOF                                 `<EOF>`

以及 stderr 上的以下警告:

line 1:10 token recognition error at: 'XYZ'