【问题标题】:how to solve this simple antlr recursive issue如何解决这个简单的 antlr 递归问题
【发布时间】:2012-07-07 09:12:42
【问题描述】:

我正在阅读 URL(并尝试复制)但失败了......(关于 antlr 的文章也很棒)。

https://supportweb.cs.bham.ac.uk/docs/tutorials/docsystem/build/tutorials/antlr/antlr.html

我添加括号之前的解决方案:

whereClause: WHERE expression -> ^(WHERE_CLAUSE expression);
expression: orExpr;
orExpr: andExpr (OR^ andExpr)*;
andExpr: primaryExpr (AND^ primaryExpr)*;
primaryExpr: parameterExpr | inExpr | compExpr;

我的解决方案由于无限递归而失败(但我认为 LPAREN^ 和 RPAREN!应该在哪里解决这个问题???)....

whereClause: WHERE^ (expression | orExpr);
expression: LPAREN^ orExpr RPAREN!;
orExpr: andExpr (OR^ andExpr)*;
andExpr: primaryExpr (AND^ primaryExpr)*;
primaryExpr: parameterExpr | inExpr | compExpr | expression;

注意底部的primaryExpr后面有表达式,上面有LPAREN和RPAREN,但是WHERE可以是orExpr或表达式(即第一个表达式可以使用或不使用括号)。

我确信这可能是一个简单的问题,比如我一直盯着几个小时或什么的错字。

【问题讨论】:

    标签: antlr antlr3


    【解决方案1】:

    我正在阅读网址(并尝试复制)但失败了...(关于 antlr 的文章也很棒)...

    请注意,本文解释了 ANTLR v2,它的语法与 v3 有很大不同。最好在这里寻找一个像样的 ANTLR v3 教程:https://stackoverflow.com/questions/278480/antlr-tutorials

    我的解决方案由于无限递归而失败(但我认为 LPAREN^ 和 RPAREN!应该在哪里解决这个问题???)....

    如果这是WHILE 之后的唯一表达式,它就会有。但是,orExpr 导致了您的问题(如果您删除它,那个递归错误将消失)。

    带括号的表达式通常具有最高优先级,因此应该放在您的primaryExpr 规则中,如下所示:

    grammar T;
    
    options {
      output=AST;
    }
    
    parse       : whereClause EOF!;
    whereClause : WHERE^ expression;
    expression  : orExpr;
    orExpr      : andExpr (OR^ andExpr)*;
    andExpr     : primaryExpr (AND^ primaryExpr)*;
    primaryExpr : bool | NUMBER | '('! expression ')'!;
    bool        : TRUE | FALSE;
    
    TRUE        : 'true';
    FALSE       : 'false';
    WHERE       : 'where';
    LPAREN      : '(';
    RPAREN      : ')';
    OR          : '||';
    AND         : '&&';
    NUMBER      : '0'..'9'+ ('.' '0'..'9'*)?;
    SPACE       : (' ' | '\t' | '\r' | '\n')+ {skip();};
    

    现在输入 "where true || false""where (true || false)" 都将在以下 AST 中进行解析:

    【讨论】:

      猜你喜欢
      • 2022-12-04
      • 2020-03-26
      • 1970-01-01
      • 2021-01-11
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多