【问题标题】:Beginner: ANTLR4 Grammar doesn't handle negative numbers初学者:ANTLR4 语法不处理负数
【发布时间】: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


【解决方案1】:

未经测试:尝试删除SIGN 规则,将integer 重写为(SUB|ADD)? DIGITS。我的理解是SIGN 永远不会匹配,因为它遵循SUBADD。令牌规则始终遵循“最长匹配获胜”,不会尝试重新匹配以“更好地解析”。

【讨论】:

  • 你是对的,你能详细解释一下吗?
  • 我到底应该解释什么?
猜你喜欢
  • 1970-01-01
  • 2022-09-28
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
相关资源
最近更新 更多