【问题标题】:Where is the left recursion?左递归在哪里?
【发布时间】:2013-07-23 08:09:10
【问题描述】:

下面是一个 ANTLR 语法的 sn-p,可以正常工作。

它打算成为一个tex-parser。

如果我通过取消注释 | text 来修改规则 everywhere,ANTLR 会在规则 escSeq 中报告左递归 我认为这很有趣。
我找不到左递归:要么我是盲人,要么我误解了左递归是什么。

有什么建议吗?

afterNewline : (everywhere | par );

par : EoL {System.out.println("<PAR>");} afterNewline ;

everywhere : (Esc escSeq //| text
        );

escSeq : (
            EoL          {System.out.println("<cmd:''>");}        afterNewline |
            Space        {System.out.println("<cmd:' '>");}       skipSpace |
            name=Letter+ {System.out.println("<cmd:"+$name.text+">");} skipSpace |
            Other        {System.out.println("<cmd:Other>");}      inLine // **** Other is too restrictive. 
        );

text : (Letter | Other) inLine;

skipSpace : (everywhere | (Space|EoL) {System.out.println("<SKIP>");});

inLine : (everywhere | Space | EolInLine);

EolInLine : EoL {System.out.println("<text:' '>");};

texDocument : afterNewline EOF;

【问题讨论】:

  • 我不是语法专家,但是:everywhere => text => inLine => everywhere
  • 啊,我从 antlr 的制作中看到:它需要选项 { backtrack=true ; } 这似乎完全允许递归。然后它工作正常......至少对于小文档,因为非终端的历史存储在堆栈中,这带有 <*> 的风险(在*.com上发布它的直觉;-))我认为,我的语法在概念上是不合适的,至少对于 antlr。

标签: antlr left-recursion


【解决方案1】:

上面的文法没有左递归,无论everywhere 中有或没有| text 替代。 ANTLR 4 不报告左递归。如果 ANTLR 3.5 报告左递归,您应该在此处将其作为问题发布:

https://github.com/antlr/antlr3/issues

【讨论】: