Xtext:引用其他语言的对象; importURI的名称空间和别名?

时间:2013-07-24 23:18:06

标签: xtext

我正在开发一种基于xtext的语言,该语言应该引用以特定于供应商的文件格式定义的对象。

E.g。这种文件格式定义了消息,我的语言应定义使用这些消息的规则。当然我想使用xtext功能,例如自动完成/验证消息名称,属性等。

不确定这是不是一个好主意,但我想出了以下内容:

  • 使用一个xtext项目来描述文件格式
  • 将此项目的依赖项添加到我的DSL项目,将文件格式语法导入我的语法
  • 通过importURI导入描述文件

FileFormat语法:

grammar com.example.xtext.fileformat.FileFormat;
generate fileformat "http://xtext.example.com/fileformat/FileFormat"
[...]

DSL语法:

grammar com.example.xtext.dsl.DSL;
import "http://xtext.example.com/fileformat/FileFormat" AS ff;
Model:
    rules += Rule*;

Rule: ImportFileRule | SampleRule;
ImportFileRule: "IMPORT" importURI=STRING "AS" name=ID ";";
SampleRule: "FORWARD" msg=[ff::Message] ";"

首先:这很好。

现在,不同的导入文件可能会定义具有冲突名称的消息, 而且我想要使用完全限定名称的消息。 消息名称的前缀应该在我的DSL中定义,例如ImportFileRule的名称。

所以我想使用类似的东西:

IMPORT "first-incredibly-long-filename-with-version-and-stuff.ff" AS first;
IMPORT "second-incredibly-long-filename-with-version-and-stuff.ff" AS second;

FORWARD first.msg_1; // references to msg_1 in first file
FORWARD second.msg_1; // references to msg_1 in second file

不幸的是,我没有看到使用xtext实现这一目标的简单方法。

目前我正在使用ID作为名称空间限定符和自定义ProposalProvider / Validator类, 这是一个丑陋的细节并绕过EMF索引,对1000个消息和50000个属性的文件变得缓慢......

有没有正确的方法呢? 首先使用xtext解析定义文件是不是一个好主意?

2 个答案:

答案 0 :(得分:0)

我有两个想法要检查。

  1. Xtext有一个名为ImportedNameSpaceAwareScopeProvider的特定全局范围提供程序。通过使用此重写版本,您可以指定要考虑的其他标头。
  2. 检查xtext grammar itself的实现,因为它支持EPackage导入的此类功能。我不确定,它是如何运作的,但应该这样工作。

答案 1 :(得分:0)

最后,我最终使用了SimpleNamesFragment,ImportURIScopingFragment和从AbstractDeclarativeScopeProvider派生的自定义ScopeProvider。

这样,我必须实现ScopeProvider方法以安静一些规则,但在使用我的“命名空间前缀”时更灵活。 例如。实现像

这样的语法很简单
FORWARD FROM first: msg_01, msg_02;