【发布时间】:2019-10-24 10:28:55
【问题描述】:
我目前正在研究一种用于评估数学表达式的简单 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 替代方案吗?
提前致谢。
【问题讨论】:
-
在“tokens”模式下运行 grun 以查看您的输入是如何被 lexed 的。 “gui”模式没有透露这一点。此外,将所有解析器规则与所有词法分析器规则完全分开也很有帮助。将它们混合会导致(程序员)混乱。
标签: antlr4 language-recognition