0

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

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

不确定这是否是一个好主意,但我想出了以下几点:

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

文件格式语法:

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 实现这一目标的简单方法。

目前,我正在为命名空间限定符和自定义 ProposalProvider/Validator 类使用 ID,这在细节上很难看,并且绕过了 EMF 索引,在包含 1000 条消息和 50000 个属性的文件中变得很慢......

会有正确的方法吗?首先使用 xtext 解析定义文件是个好主意吗?

4

2 回答 2

0

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

这样,我必须实现 ScopeProvider 方法来安静一些规则,但在使用我的“命名空间前缀”时要灵活得多。例如,实现类似的语法很简单

FORWARD FROM first: msg_01, msg_02;
于 2013-08-13T18:04:12.313 回答
0

我有两个想法要检查什么。

  1. Xtext 有一个特定的全局范围提供程序,称为ImportedNameSpaceAwareScopeProvider。通过使用它的覆盖版本,您可以指定其他要考虑的标头。
  2. 检查xtext 语法本身的实现,因为它支持 EPackage 导入的此类功能。我不确定它是如何运作的,但应该以这种方式运作。
于 2013-07-25T16:34:53.543 回答