我正在开发一种基于 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 解析定义文件是个好主意吗?