2013-07-23 37 views
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; 
+0

我不是在語法方面的專家,但:'everywhere' =>'text' =>'inLine' =>'無處不在' –

+0

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

回答

0

語法上述不具有左遞歸,具有或不具有| text替代在everywhere。 ANTLR 4不報告左遞歸。如果ANTLR 3.5報告左遞歸,你應該張貼此作爲這裏的一個問題:

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