0
下面是一個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' =>'inLine' =>'無處不在' –
嗯,我從antlr製作的東西可以看出:它需要 選項{ backtrack = true; } 似乎允許遞歸。 然後,它工作正常...至少對於小文件, ,因爲非端點的歷史存儲在堆棧 ,其中攜帶風險 (好直覺發布它在stackoverflow.com ;-)) 我覺得,我的語法在概念上是不合適的,至少在antlr中是 。 –
user2609605