我目前正在使用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
我怎样才能做到这一点?
答案 0 :(得分:0)
看起来像
ref=[SomeType]
是
的缩写ref=[SomeType|ID]
表示将解析ID
以引用SomeType
所以用另一个规则替换ID
,例如
ref=[SomeType|IDORTHIS]
...
IDORTHIS: ID | "this";
你可以实现解析方
对于范围界定,您需要实现范围提供程序
在范围提供者
中Scopes
类中的方法或手动解释SimpleScope / EObjectDescription.create或.....(您的要求对此非常模糊)