我正在开发一种基于xtext的语言,该语言应该引用以特定于供应商的文件格式定义的对象。
E.g。这种文件格式定义了消息,我的语言应定义使用这些消息的规则。当然我想使用xtext功能,例如自动完成/验证消息名称,属性等。
不确定这是不是一个好主意,但我想出了以下内容:
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解析定义文件是不是一个好主意?
答案 0 :(得分:0)
我有两个想法要检查。
答案 1 :(得分:0)
最后,我最终使用了SimpleNamesFragment,ImportURIScopingFragment和从AbstractDeclarativeScopeProvider派生的自定义ScopeProvider。
这样,我必须实现ScopeProvider方法以安静一些规则,但在使用我的“命名空间前缀”时更灵活。 例如。实现像
这样的语法很简单FORWARD FROM first: msg_01, msg_02;