初学者: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
永远不会匹配,因为它跟在 SUB
和 ADD
之后。令牌规则始终遵循 "first longest match wins",不会尝试重新匹配 "better parsing"。
我目前正在研究用于评估数学表达式的简单 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
永远不会匹配,因为它跟在 SUB
和 ADD
之后。令牌规则始终遵循 "first longest match wins",不会尝试重新匹配 "better parsing"。