关于 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'
这个问题:
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'