0

下面是一个 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;
4

1 回答 1

0

上面的语法没有左递归,有或没有| texteverywhere. ANTLR 4 不报告左递归。如果 ANTLR 3.5 报告左递归,您应该在此处将其作为问题发布:

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

于 2013-07-23T11:18:25.000 回答