Antlr4 树解析器我对 (9-34)*9 这样的数字有问题

Antlr4 tree parser I have problems with numbers like (9-34)*9

我创建了一棵树 antlr4.The 树执行计算步骤,对于 +、-.、* 和 /。这棵树非常适合正数,我的问题是,对于负数,比如当我输入 (9-40)*10 左右时,它不再起作用了。

我的代码是:

calculator:
    (d)*| ;
    
c:
    c '*' c | c '/' c | c '+' c | c '-' c | '(' c ')' | b | a ;
d:
     a '=' c ;

b :   '-'?[0-9]+;         
a: [a-zA-Z][a-zA-Z0-9]*;

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

(请在 post 之前小心验证您的来源。posted 的语法不是有效的 ANTLR。可能是因为您将规则名称更改为 ab, 等等,忘记保持 Lexer 规则大写。)

如果我认为是这种情况,这里有一个修改后的语法来解决您的问题。

grammar calc
    ;

calculator: (d)*;

c
    : c '*' c
    | c '/' c
    | c '+' c
    | c '-' c
    | '(' c ')'
    | '-'? NBR // <-- The fix
    | ID
    ;
d: ID '=' c;

NBR: [0-9]+; // <-- removed the '-'?
ID:  [a-zA-Z][a-zA-Z0-9]*;

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

问题的根源在于,通过将 - 放入 Lexer 规则中,ANTLR 会将“-40”匹配为 NBR 标记,因为它的字符串比“40”长.解决方案是将否定作为 c(又名表达式)

的解析器规则中的替代方法来处理

使用 ANTLR 工具(又名 grun)和 -tokens 选项来获取令牌流的转储总是一个好主意,以确保您的 Lexer 规则为解析器提供它需要的令牌流。