【发布时间】: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