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
它似乎只使用交叉引用,并且我看不到如何处理新的变量声明。
这是coffeescript的现有语法,所以我无法更改它。我从你的回答中得到的印象是,交叉引用更容易,并且在分配上下文中禁用错误消息。 –
是的,这似乎是较少的工作。 –