2011-12-05 50 views
2

在我的DSL中,變量是動態的,它們是在第一次給它們賦值時創建的。因此,這是一個有效的代碼:使用Xtext語法處理動態變量

a = 0 
b = 2 // new variable created 
a = 3 // existing variable reassigned 

我天真的做法是有規則這樣

Identifier: 
    ID; // ID from Terminals 

Assignable: 
    {Assignable} ref=[Identifier|ID] | 
    {Assignable} newVar=Identifier; 

它不工作,抱怨「有以下兩個選項不能匹配:2」。這是可以理解的,因爲生成的ANTLR的調試語法包含一個規則:

ruleAssignable: ruleIdentifier | ruleIdentifier; 

(的[Identifier|ID]訣竅來自於question on cross-referencing響應我只是複製它沒有完全理解:)我還試圖神交它是如何解決的。在Xbase語法中:

{XAssignment} /* (declaringType=[types::JvmDeclaredType] '::')? */ feature=[types::JvmIdentifiableElement|ValidID] OpSingleAssign value=XAssignment 

它似乎只使用交叉引用,並且我看不到如何處理新的變量聲明。

回答

1

對變量聲明和賦值表達式使用相同的語法並不是一個好主意。如果可能的話,我會爲宣言引入關鍵字或特殊操作符。

如果你不能或不想這樣做,困難的方法是決定一個交叉引用還是一個簡單的標識符。

如果與第一個結合使用,則必須禁用未解析引用的錯誤消息。 如果你選擇後者,你將不得不手動皮條客內容協助和超鏈接。

+0

這是coffeescript的現有語法,所以我無法更改它。我從你的回答中得到的印象是,交叉引用更容易,並且在分配上下文中禁用錯誤​​消息。 –

+0

是的,這似乎是較少的工作。 –