解析器规则不会为无效输入产生错误

Parser rule does not produce an error for invalid input

我发现了一个奇怪的解析器行为,无法向我解释。如果我做错了什么,也许你们有人可以给我提示。

我有以下语法文件:

grammar test;

/*
 * Parser Rules
 */
unary_expr
  : unary_operator IDENTIFIER;

unary_operator
  : PLUS PLUS;

/*
 * Lexer Rules
 */
IDENTIFIER: [a-zA-Z]+;
PLUS: '+';

NEWLINE
  : ( '\r'? '\n' | '\r' )+ -> skip;

当我用

测试这个语法时
++abc++def

词法分析器将正确检测所有标记

Tokens:
[@0,0:0='+',<2>,1:0]
[@1,1:1='+',<2>,1:1]
[@2,2:4='abc',<1>,1:2]
[@3,5:5='+',<2>,1:5]
[@4,6:6='+',<2>,1:6]
[@5,7:9='def',<1>,1:7]
[@6,12:11='<EOF>',<-1>,2:0]

但是解析树肯定不会覆盖所有检测到的标记!

Parse Tree:
unary_expr (
  unary_operator (
    "+"
    "+"
  )
  "abc"
)

我做错了什么?

如果您告诉 ANTLR 匹配解析器规则 unary_expr 使用的任何标记,那么这正是 ANTLR 所做的。

如果你想强制 ANTLR 使用 all 标记,在解析器规则的末尾添加 EOF 标记:

unary_expr
 : unary_operator IDENTIFIER EOF
 ;

现在您将看到预期的错误: