Xtext与此关键字交叉引用

时间:2017-12-17 18:23:04

标签: eclipse xtext

我目前正在使用op Xtext创建一个新的DSL。我希望能够在我的语法中定义规则,其中可以操纵某些值并使用this引用当前对象。但是,我无法正确使用它的语法。

我从Xtext Expressions example获取了一些代码并对其进行了修改,以便能够对卡片值进行交叉引用。我该如何使用this关键字?我从其他一些SO问题中了解到我可以使用我自己的范围提供者,但不知道从哪里开始。

查看一些代码:

// MyDSL.xtext

Game returns Game:
    'Game'
    name=STRING
    ...
    ('Cardpropertytypes' '{' cardpropertytypes+=CardPropertyType ( "," cardpropertytypes+=CardPropertyType)* '}' )?
    cards += Card*
;

Card returns Card:
    'Card'
    name=ID
    '{'
        'type' type=[CardType]
        ('cost' '{' cost+=Cost ( "," cost+=Cost)* '}' )?
        ('properties' '{' properties+=CardProperty ( "," properties+=CardProperty)* '}' )?
        ('rules' '{' rules+=CardRule ( "," rules+=CardRule)* '}' )?
        ('actions' '{' actions+=CardAction ( "," actions+=CardAction)* '}' )?
    '}';

CardRule returns CardRule:
    {CardRule}
    '{'
        ('description' description=STRING)?
        ('requirements' requirements=Addition)?
        ('action' action=Addition)?
        ('duration' duration=Duration)?
    '}';

CardProperty returns CardProperty:
  type=[CardPropertyType] (':' value=INT)?;

Addition returns Expression:
  Multiplication ({Addition.left=current} '+' right=Multiplication)*;

Multiplication returns Expression:
  Primary ({Multiplication.left=current} '*' right=Primary)*;

Primary returns Expression:
  Literal |
  '(' Addition ')';

Literal returns Expression: 
    {Expression}
    QualifiedName |
    NumberLiteral;

QualifiedName:
    ID ('.' ID)*;

NumberLiteral:
  value=INT;

// Card.mydsl

Cardpropertytypes {
    Toughness,
    Power,
    Flying,
    Indestructible
}
Card AdantoVanguard {
    ...
    properties {
        Toughness: 1,
        Power: 1,
        Flying
    }
    rules {
        {
            //action this.properties.Toughness + 2
            action ????
        }
    }
}

澄清: 如果我有一个卡片模型,它具有上面代码示例中的属性,我希望能够在规则部分说:

this.properties.propertyName + 2

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

xtext交叉引用中的

看起来像

ref=[SomeType]

的缩写
ref=[SomeType|ID]

表示将解析ID以引用SomeType 所以用另一个规则替换ID,例如

ref=[SomeType|IDORTHIS]
...
IDORTHIS: ID | "this";

你可以实现解析方

对于范围界定,您需要实现范围提供程序

在范围提供者

  • 覆盖getScope
  • 使用context和reference参数来确定哪个引用是作用域的
  • 使用上下文来收集要放入范围的元素
  • 创建新的范围,例如使用Scopes类中的方法或手动解释SimpleScope / EObjectDescription.create或.....(您的要求对此非常模糊)