下面是一个运行良好的ANTLR语法片段。
它旨在成为一个tex解析器。
如果我通过取消对| 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
替代项。ANTLR 4不报告左递归。如果ANTLR 3.5报告左递归,您应该将其作为一个问题发布在这里:
https://github.com/antlr/antlr3/issues