我目前正在研究一个项目,该项目是根据Xtext语法创建要素模型的。我的任务是将语法语法转换为可导入eclipse插件pure :: variants的CSV文件。
特征模型基本上是特征树。这些功能是不同的类型(强制性,可选,替代性等)。
为了构造树,我使用了xtext语法的生成的ecore元模型。该文件(.ecore)基本上是带有语法对象的XML文件。从中创建树是一致,简单和容易的。
我的问题是,我需要为创建的树的节点分配类型(强制性,替代性等)。这些类型的功能对应于基数运算符。这些运算符以xtext语法编写,如下所示:“(无运算符)”,“?”,“ *”和“ +”(可以在xtext用户手册第2.1.3节https://www.eclipse.org/Xtext/documentation/1_0_1/xtext.pdf中看到)。问题是,这些xtext语法的基数似乎找不到任何地方。我以为它们会出现在.ecore或.genmodel文件中,但是根本没有基数。
我想像一下,如果xtext能够检查和控制这些基数,则它必须具有某种元模型,这些基数可以被看到并且很容易获得(类似于.ecore或.genmodel的.xml文件之类的东西。文件)。
所以我的问题是:是否有某种xtext生成的文件包含这些基数?如果没有,我将不得不以某种方式从语法本身中去除这些基数,但是这将不必要地耗时且复杂,甚至可能是不可能的,因为书面语法与ecore元模型不完全对应,因此我正在提取特征树的确非常复杂。
我只能找到生成的文件XXXXGrammarAccess.java(其中XXXX代表语法的名称),它是一个复杂的生成文件,带有很多库依赖关系,甚至不知道如何消除这些基数。我想这是有可能的,因为该文件使用了很多IGrammarAccess方法,例如getRule(),getKeyword()等,但是我无法使用该文件或从中打印出一些东西,因为它是生成的文件,但我无法自行运行。
如果我没有寻找某种元模型,是否有可能在生成过程中以某种方式获得这些基数?
非常感谢您的回答。
答案 0 :(得分:0)
首先,元模型和语法中的基数不必匹配100%。解析器中的基数验证与ecore中的基数验证不同。
不存在较低的基数1(必需),以防止出现真正难看的错误消息。但是,:1或:-1(= *)反映在ecore中。
这是10年前创建Xtext时的故意决定。
语法访问只允许您在运行时访问语法。
您能详细说明您为什么真正在乎吗?
答案 1 :(得分:0)
Xtext语法本身就是一个模型,是http://www.eclipse.org/2008/Xtext的实例。 (过去可以通过使用示例反射式Ecore编辑器打开* .xtext文件来演示这一点,但是不幸的是,使用classpath:URI再次破坏了它。)尽管如此,您仍可以以编程方式将* .xtext文件作为EMF打开。掌握资源并查看语法中的所有内容。有关转换链的第一阶段,请参见https://git.eclipse.org/c/ocl/org.eclipse.ocl.git/tree/examples/org.eclipse.ocl.examples.xtext2lpg/src/org/eclipse/ocl/examples/xtext2lpg/xtext2xbnf.qvto,该链的第一步是读取Xtext语法,最后以LPG语法结束。