Parsing ANTLR4错误处理和错误节点行为

Parsing ANTLR4错误处理和错误节点行为,parsing,antlr,antlr4,lexer,Parsing,Antlr,Antlr4,Lexer,我有一个语法,我在下面对其进行了简化,以描述我所面临的问题: eval: exp; exp: operand ('*'|'/') operand | operand ('+'|'-') operand | operand; operand: (function|VARIABLE); function: FUNCTION_NAME body? ')'; body: attribute (','attribute)*; attribute: VARIABLE|function;

我有一个语法,我在下面对其进行了简化,以描述我所面临的问题:

eval: exp;
exp: operand ('*'|'/') operand
    | operand ('+'|'-') operand
    | operand;

operand: (function|VARIABLE);
function: FUNCTION_NAME body? ')';

body: attribute (','attribute)*;

attribute: VARIABLE|function;
FUNCTION_NAME: [a-zA-Z0-9.]+'(';
VARIABLE: [a-zA-Z0-9._]+;
因此,基本上我的目的是分析输入,例如:

a + min(b, c, min(d, e)) - max(f, m)
a
a + b
如果输入正确,解析就完成得很完美,但是im面临的问题与输入错误有关。对于两种非常相似的情况,由ANTLR解析器构建的AS树是完全不同的

  • a+min(b,c,)
    它创建了一个漂亮的AS树,并指示在
    min
    函数的第二个逗号后缺少一个方法参数
  • min(a,b,)
    我怀疑输出与前一种情况相同,但是解析器无法将标记放在一起,并将所有标记都标记为
    ErrorNode
    有人能解释为什么ANTLR解析器的这种行为,以及操作符的存在/不存在如何以这种方式改变解析器的行为吗