Antlr4语法左递归错误



我现在在使用antlr4时遇到了相当大的问题。
每当我试图用这个RPN语法喂养鹿角时

 grammar UPN;
    //Parser  
    expression : plus | minus | mult | div | NUMBER;  
    plus : expression expression '+';  
    minus : expression expression '-';  
    mult : expression expression '*';  
    div : expression expression '/';  
    //Lexer  
    NUMBER : '-'? ('0'..'9')+;  

antlr将抛出错误,因为+、-、mult和div是相互左递归的。
我不知道如何解决这个问题。
(我知道这会发生,因为这个语法"表达式"可以无限循环,我以前用另一个语法遇到过这个问题,但我可以自己修复)

我唯一的解决方案是按照以下方式限制语法

grammar UPN;
//Parser
expression : plus | minus | mult | div | NUMBER;
exp2 : plus2 | minus2 | mult2 | div2 | NUMBER;
plus : exp2 exp2'+';
minus : exp2 exp2'-';
mult: exp2 exp2'*';
div: exp2 exp2'/';
plus2 : NUMBER NUMBER '+';
minus2 : NUMBER  NUMBER '-';
mult2: NUMBER  NUMBER '*';
div2: NUMBER  NUMBER '/';
//Lexer
NUMBER : '-'? ('0'..'9')+;  

但这并不是我真正想要的,因为现在我可以最大限度地使用像

这样的表达式
2 3 + 5 4 - *

和语法将比它实际可能的更复杂。
希望你们能帮助我

ANTLR4只支持"直接"左递归规则,不支持"间接"规则。

试试这样写:

grammar RPN;
parse : expression EOF;
expression
 : expression expression '+'
 | expression expression '-'
 | expression expression '*'
 | expression expression '/'
 | NUMBER
 ;
NUMBER : '-'? ('0'..'9')+;
SPACES : [ trn] -> skip;

Btw, 23+54-*不是一个有效的RPN表达式:它必须以两个数字开头。

相关内容

  • 没有找到相关文章

最新更新