我想重用语法定义。
我有这样的语法:
Person:
'contact' name=ID '{'
'phone' phone=INT
'}'
;
我想要另外一个这样的语法:
include "uri/to/other/project/to/other/grammar/definitions"
Call:
'call' person=Person
;
第二语法不知道 Person
。因此,Xtext是否能够将第一个语法中的Person
定义插入或包含在第二个语法中?
进一步的步骤是生成Person
。我想知道如何做到这一点。
答案 0 :(得分:3)
我找到了解决方案。您可以使用关键字“with”,因为它用于包含终端。
必要的步骤:
registerGenModelFile = "platform:/resource/A/src-gen/path/to/A.genmodel"
grammar B with A
with
不能用于包含多个语法,因此必须在A中说明终端定义。
生成在B的IGenerator中执行,但是如果扩展A的生成器,则可以重用A的EClass的生成。
这种方法是一种继承,因为提议,验证等类是由A的同行扩展的。我没有发现是否支持多重继承。您可以在with A
之后放置一个逗号,但它不起作用。
答案 1 :(得分:1)
我认为这正是您所寻找的 http://christiandietrich.wordpress.com/2012/08/07/xtext-referencing-elements-of-one-dsl-from-another-dsl/
答案 2 :(得分:0)
我认为从DSL B中表达的模型(使用另一个元模型)访问dsl A中表达的模型元素并不是bline所要求的。虽然他对自己的问题给出了正确答案,但我认为阅读以下文档是有用的: https://eclipse.org/Xtext/documentation/301_grammarlanguage.html#grammar-mixins 特别是在覆盖规则和优先事项时。