左递归在哪里?

时间:2013-07-23 08:09:10

标签: antlr left-recursion

下面是一个ANTLR语法的片段,它可以正常工作。

它旨在成为一个tex解析器。

如果我通过取消注释everywhere来修改规则| text,则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;

1 个答案:

答案 0 :(得分:0)

上面的语法没有左递归,在| text中有或没有everywhere替代。 ANTLR 4不报告左递归。如果ANTLR 3.5报告了递归,你应该在此处发布这个问题:

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