下面是一个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;
答案 0 :(得分:0)
上面的语法没有左递归,在| text
中有或没有everywhere
替代。 ANTLR 4不报告左递归。如果ANTLR 3.5报告了递归,你应该在此处发布这个问题: