Antlr4语法留下了递归错误

时间:2014-06-04 18:33:46

标签: parsing recursion grammar antlr4 rpn

我现在对antlr4存在很大问题 每当我尝试用这个RPN语法提供antlr时

 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会抛出一个错误,因为plus,minus,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 - *

并且语法会比实际上更复杂 希望你们能帮帮我

1 个答案:

答案 0 :(得分:0)

ANTLR4仅支持“直接”左递归规则,而不支持“间接”规则。

尝试这样的事情:

grammar RPN;

parse : expression EOF;

expression
 : expression expression '+'
 | expression expression '-'
 | expression expression '*'
 | expression expression '/'
 | NUMBER
 ;

NUMBER : '-'? ('0'..'9')+;

SPACES : [ \t\r\n] -> skip;

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