2013-10-18 38 views
2

我想創建一個使用XTEXT一個非常簡單的DSL,具有以下特點:定義基元內XTEXT語法

  • 它有兩個基本類型:數字和字符串
  • 用戶可以定義自己的類,其由字段聲明的
  • 字段聲明相關聯的名稱與類型,其中一個類型可以是一個類或一個原始

以下是我嘗試在DSL,類定義和引用工作正常,但我無法弄清楚如何擁有原始類型。在「字符串」和「數字」文字不工作:

Model: 
    (classes+=Class)* 
    (fields+=Field)*; 

FieldType: Class | 'String' | 'Number'; 

Field: 
    type=[FieldType] name=ID ";"; 

Class: 
    "class" name=ID 
    "{" 
     (fields+=Field)* 
    "}"; 

這是我期望能夠針對上述DSL有效的例子:

Class SomeClass { 

} 

// This works! 
SomeClass reference; 

// This does not, doesn't recognise the "String" literal 
String string; 

注意,進一步下跌的線我會配套工作。因此,我的DSL將需要結合數字/字符串文字的概念,以便它支持Number someNumber = 123;

+0

您的其他文字用雙引號括起來,這有什麼關係嗎?我不知道語法。 –

回答

0

睡了之後,我認爲正確的答案是改變我的方法。在上述定義中,我們有

Field: 
    type=[FieldType] name=ID ";"; 

這定義了稱爲「場」的規則,其由兩個部分組成; 「類型」和「名稱」。這是呈現問題的類型部分。方括號表示,我們期待的FieldType一個實例,這是:

FieldType: Class | 'String' | 'Number'; 

現在,很明顯地看到,你可以有類的實例,但在語義上沒有辦法有「String的實例'或'數字'文字。

我相信這就是爲什麼我上面的DSL不會讓我聲明原語。字符串/數字「類型」不是您可以擁有實例的元素。


進一步思考,原始字段的定義與類的實例的定義之間存在一些非常重要的區別。例如,你只能在一個類的實例上調用方法(在我的情況下,我將String視爲一個真正的原語,所以沒有方法)。

因此,有兩種不同類型的聲明可能很重要,一種爲PrimitiveField,另一種爲ObjectField。字段可以是以下任一字段:

Model: 
    (classes+=Class)* 
    (fields+=Field)*; 

PrimitiveType: 'String' | 'Number' | 'Boolean'; 

Field: 
    PrimitiveField | ObjectField 
; 

PrimitiveField: 
    type=PrimitiveType name=ID ";" 
; 
ObjectField: 
    type=[Class] name=ID ";"; 

Class: 
    "class" name=ID 
    "{" 
    (fields+=Field)* 
    (methods+=Method)* 
    "}"; 
+0

我不完全確定我已經完全理解了這個問題!如果你發現了我見過的東西,請做評論/貢獻一個新的答案! – jwa

+0

我剛剛有同樣的問題。您的解決方案几乎可以100%正確工作,但是在生成的編輯器中沒有針對基本類型(例如'Number'或'String')的代碼完成。你有什麼想法,爲什麼? –