初学者:ANTLR4 语法不处理负数

Beginner: ANTLR4 Grammar doesn't handle negative numbers

我目前正在研究用于评估数学表达式的简单 ANTLR4 语法。目前,我的语法应该只能解析简单的运算,比如乘法、除法、加法和减法…… 这是我的语法:

grammar WRB;

options {
language = Java;
}

prog: stat+;

stat: expr SEPARATOR #printExpr
    | ID ASSIGN expr SEPARATOR #assignment
    ;

expr: expr op=(MUL|DIV) expr #punkt
    | expr op=(ADD|SUB) expr #strich
    | num #number
    | (SIGN)? ID #ref
    | '(' expr ')' #klammer
    ;

ID  :   [a-zA-Z]+;
DIGITS :   [0-9]+ ;

ASSIGN: '=';
MUL: '*';
DIV: '/';
ADD: '+';
SUB: '-';

integer: (SIGN)? DIGITS;
floating:  (integer)? '.' DIGITS;
num:  (integer | floating);
SIGN: '+' | '-';

SEPARATOR: ';';
WS: [ \t\r\n]+ -> skip ;

除了负数以外,一切正常。这是示例“-4 + 9”的语法树:

我对语言识别和语法还很陌生。我不明白为什么 ANTLR 将负号作为无关输入来处理,expr 规则不应该深入到 #number 替代方案吗?

提前致谢。

未经测试:尝试删除 SIGN 规则,将 integer 重写为 (SUB|ADD)? DIGITS。我的理解是 SIGN 永远不会匹配,因为它跟在 SUBADD 之后。令牌规则始终遵循 "first longest match wins",不会尝试重新匹配 "better parsing"。