4

我想重用语法定义。

我有这样的语法:

Person:
  'contact' name=ID '{'
    'phone' phone=INT
  '}'
;

我想要另一个这样的语法:

include "uri/to/other/project/to/other/grammar/definitions"

Call:
  'call' person=Person
;

Person不知道第二个语法。因此,Xtext 是否能够将Person第一个语法的定义插入或包含到第二个语法中?

更进一步的步骤是生成Person. 我也想知道如何做到这一点。

4

2 回答 2

4

我找到了解决方案。您可以使用关键字“with”,因为它用于包含终端。

必要的步骤:

  1. 创建 Xtext 项目 com.mydsl.A (A) 和 com.mydsl.B (B)
  2. 为 A 写语法
  3. 在 B 的 META-INF/MANIFEST 中添加 A 作为依赖项
  4. 在 B.ui 的 META-INF/MANIFEST 中添加 A.ui 作为依赖项
  5. 在 B 的工作流程中添加 A 的 genmodel 的注册,如下所示: 在 StandaloneSetup 中: registerGenModelFile = "platform:/resource/A/src-gen/path/to/A.genmodel"
  6. 将 B 的第一行更改为grammar B with A
  7. 您现在可以在编写语法 B 时使用 A 的 EClasses

with不能用于包含一种以上的文法,因此终结符定义必须在 A.

生成在 B 的 IGenerator 中执行,但如果扩展 A 的生成器,则可以重用 A 的 EClass 的生成。

这种方法是一种继承,因为提案、验证等类是由 A 的对应物扩展的。我没有发现是否支持多重继承。您可以在后面加上逗号,with A但它不起作用。

于 2013-05-09T09:54:10.040 回答
0

我认为从以 DSL B 表示的模型(带有另一个元模型)访问以 dsl A 表示的模型的元素并不是 bline 所要求的。尽管他对自己的问题给出了正确的答案,但我认为阅读以下文档很有用: https ://eclipse.org/Xtext/documentation/301_grammarlanguage.html#grammar-mixins, 尤其是在覆盖规则和优先级时.

于 2014-01-29T09:29:30.597 回答