在我的DSL变量是动态的,它们是在第一次为它们分配值时创建的。所以这是一个有效的代码:
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
它似乎只使用交叉引用,我无法看到如何处理新的变量声明。
答案 0 :(得分:1)
对变量声明和赋值表达式使用相同的语法并不是一个特别好的主意。如果可能的话,我会为声明引入关键字或特殊运算符。
如果您不能或不想这样做,那么很难决定交叉引用还是简单标识符。
如果您使用第一个,则必须为未解析的引用禁用错误消息。 如果您选择后者,则必须手动进行皮条客内容辅助和超链接。