当前位置: 首页 > 知识库问答 >
问题:

Xtext与该关键字的交叉引用

钮鸿煊
2023-03-14

我目前正在帮助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

我怎样才能做到这一点?

共有1个答案

昌学
2023-03-14

在xtext中,交叉引用看起来像

ref=[SomeType]

它是

ref=[SomeType|ID]

这意味着ID将被解析为引用某个类型,因此通过将ID替换为另一个规则,例如:

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

您可以实现解析端

对于作用域方面,您需要实现作用域提供程序

范围提供程序内部

  • 覆盖getScope
  • 使用上下文和引用参数确定哪个引用的范围
  • 使用上下文收集要放入范围的元素
  • 创建一个新的作用域,例如使用作用域类中的方法,或手动输入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使用