2013-11-20 63 views
2

我使用Irony爲腳本語言創建解析器,但我遇到了一個小問題:如何在Irony中像這樣翻譯EBNF表達式?將EBNF翻譯爲反諷

'(' [ Ident { ',' Ident } ] ')' 

我已經嘗試過一些小把戲,比如

Chunk.Rule = (Ident | Ident + "," + Chunk); 
CallArgs.Rule = '(' + Chunk + ')' | '(' + ')'; 

但它的醜陋,我甚至不知道這工作應該(有沒有嘗試過...)的方式。有沒有人有任何建議?

編輯: 我發現了這些輔助方法(MakeStarList,MakePlusList),但無法找到如何使用它們,因爲完全缺乏反諷文檔......有沒有人有任何線索?

回答

1
// Declare the non-terminals 
var Ident = new NonTerminal("Ident"); 
var IdentList = new NonTerminal("Term"); 

// Rules 
IdentList.Rule = ToTerm("(") + MakePlusRule(IdentList, ",", Ident) + ")"; 
Ident.Rule = // specify whatever Ident is (I assume you mean an identifier of some kind). 

您可以使用MakePlusRule幫助器方法來定義一些終端的一個或多個事件。該MakePlusRule基本上只是出示您的終端作爲標準遞歸列表成語:

Ident | IdentList + "," + Ident 

這也標誌着該終端爲代表的列表,它會告訴解析器展開列表樹子節點的方便列表。

+0

謝謝,工作就像一個魅力! –