2011-12-05 29 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

是的,这似乎是较少的工作。 –