我目前正在帮助op Xtext制作一个新的DSL。我希望能够在语法中定义规则,使用this
操作某些值并引用当前对象。然而,我无法获得正确的语法来让它工作。
我从Xtext表达式示例中获取了一些代码,并对其进行了修改,以便能够对卡片值进行交叉引用。我如何使用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;
//卡片。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
我怎样才能做到这一点?
在xtext中,交叉引用看起来像
ref=[SomeType]
它是
ref=[SomeType|ID]
这意味着ID
将被解析为引用某个类型
,因此通过将ID
替换为另一个规则,例如:
ref=[SomeType|IDORTHIS]
...
IDORTHIS: ID | "this";
您可以实现解析端
对于作用域方面,您需要实现作用域提供程序
范围提供程序内部
作用域
类中的方法,或手动输入SimpleScope/EObjectDescription。创造或。。。。。(关于这一点,您的要求非常模糊)我想调用另一个文件中声明的变量。文件的包含是使用交叉引用完成的。同时也宣告了世界的召唤。这是语法: 声明是规则。 从文档中我了解到我必须在中做些什么,但我不知道具体是什么 编辑
我正在努力让交叉引用在我的DSL中工作。下面是语法的精简版本(标准示例DSL的修改版本): 因为我没有使用标准的模式,所以我跟随这篇关于如何创建自己的的博客文章: 从另一个答案来看,我认为我应该实现自己的范围提供程序: 我还在运行时模块中绑定了这些: 运行生成的编辑器时,我创建了一个如下所示的文件: 问题是(1)编辑器不会在扩展子句上自动完成,(2)编辑器显示错误消息的引用。 我错过了什么?
我有以下问题:我正在为GLSL着色语言创建一个编辑器。我希望在某些情况下允许关键字作为标识符,因为内置函数的名称可以用作标识符。 例如: 和不被识别为标识符。 完整语法供参考:http://paste2.org/YwDNkBYW 解决方案: 我创建了一个包含所有内置函数的源文件: 我使用保留的关键字来区分内置函数和本地创建的函数: ...在ScopeProvider中添加了以下内容: 在中,我在迭
我不明白关键字的区别("-
我正在寻找一种方法,防止在一个不需要关键词的地方匹配关键词。 看看下面的语法。“应用”和“输出”都是关键词。”OUTPUT'有一个包含任何字符的参数。 一切正常,但如果此参数包含单词APPLY,则会引发错误(外部输入APPLY预期规则_END)。 有办法解决这个问题吗?谢谢 示例文本 数字用户线
问题内容: 是否有 markdown 语法等效于: 问题答案: Take me to pookie 应该是正确的markdown语法,以跳转到名为pookie的锚点。 要插入该名称的锚点,请使用HTML: Markdown似乎不介意将锚点放在哪里。标头中有用的地方。例如: 效果很好。(我在这里进行了演示,但是SO的渲染器去除了锚点。) 注意自我结束标记和对 本文的早期版本建议使用,对XHTML使用