2013-01-02 83 views
0

我將爲我的dsl編寫一個推理器,並且我有一些問題,我只有在文檔的幫助下才能解決。Xtext,Xbase:推斷問題

第一招: 我需要創建靜態無效的主要()從要素:如何添加靜態.toMethod()

第二個: 假設我有一個像這樣在我的DSL規則:

Sequence: 
    'SEQ' name=ID '{' 
     statements+=Statement* 
    '}' 
; 

WHERE語句:

Statement: 
    Sequence | others... 
; 

序列必須映射到一個無效方法和身體該方法由報告報告組成。 但問題是這樣的:當我在一個序列中找到另一個序列時,我必須爲這個新序列創建一個方法並添加一個超級序列的調用。

例如:

SEQ first { 
    instructions... 
    SEQ second { 
     other instructions.... 
    } 
    instructions... 
} 

必須產生:

void first(){ 
    instructions(translated)... 
    second(); 
    instructions(translated)... 
} 
void second(){ 
    other instructions(translated)... 
} 

是否有可能實現嗎?

+1

我不確定這兩個問題是否有聯繫。如果他們不是,你最好要求分開問題 – rds

回答

1

第一個問題:

ctx.toMethod('main', ctx.newTypeRef(Void.Type)) [ 
    static = true 
    …. 
] 

第二個問題:

言下之意是與「說明」你的意思的「XExpression」的情況下,你需要欺騙了一下,因爲它是目前無法構成推斷過程中的新表達。 你基本上做的是讓你的Sequence成爲XExpression的一個子類型。然後在JvmModelInference期間,您需要遍歷表達式樹(Statement)併爲Sequences創建方法。您需要重寫XbaseTypeComputer以及XbaseCompiler,併爲您的表達式添加類型計算和編譯策略。後者將是對推理期間創建的方法的調用。