【问题标题】:Handle dynamic variable with Xtext grammar使用 Xtext 语法处理动态变量
【发布时间】:2011-12-05 15:39:20
【问题描述】:

在我的 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

好像只使用了交叉引用,看不到新变量声明是怎么处理的。

【问题讨论】:

    标签: xtext cross-reference dynamic-variables


    【解决方案1】:

    对变量声明和赋值表达式使用相同的语法并不是一个特别好的主意。如果可能的话,我会为声明引入关键字或特殊运算符。

    如果您不能或不想这样做,困难的方法是决定是交叉引用还是简单标识符。

    如果您选择第一个,则必须禁用未解决引用的错误消息。 如果您选择后者,您将不得不手动拉皮条内容辅助和超链接。

    【讨论】:

    • 是coffeescript现有的语法,改不了。我从您的回答中得到的印象是,使用交叉引用更容易,并在分配上下文中禁用错误​​消息。
    猜你喜欢
    • 2013-08-03
    • 2015-09-23
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 2014-12-11
    • 1970-01-01
    相关资源
    最近更新 更多