将语法包含在另一种语法中

时间:2013-05-08 13:51:13

标签: xtext

我想重用语法定义。

我有这样的语法:

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

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

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

Call:
  'call' person=Person
;
第二语法不知道

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

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

3 个答案:

答案 0 :(得分:3)

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

必要的步骤:

  1. 创建Xtext项目com.mydsl.A(A)和com.mydsl.B(B)
  2. 为A
  3. 编写语法
  4. 在B
  5. 的META-INF / MANIFEST中添加A作为依赖项
  6. 在B.ui
  7. 的META-INF / MANIFEST中添加A.ui作为依赖项
  8. 在B的工作流程中添加A的genmodel注册,如下所示: 在StandaloneSetup中: registerGenModelFile = "platform:/resource/A/src-gen/path/to/A.genmodel"
  9. 将B的第一行更改为grammar B with A
  10. 您可以在编写语法B时使用A的EClasses
  11. with不能用于包含多个语法,因此必须在A中说明终端定义。

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

    这种方法是一种继承,因为提议,验证等类是由A的同行扩展的。我没有发现是否支持多重继承。您可以在with A之后放置一个逗号,但它不起作用。

答案 1 :(得分:1)

答案 2 :(得分:0)

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