3

我对 XText 完全陌生。

当您使用 XText 定义语法时,您可以指定第二个语法并使用它声明的定义,如此处所述

grammar org.eclipse.xtext.example.Domainmodel with org.eclipse.xtext.common.Terminals

在 Xtext 中,每个语法都有一个唯一的名称,就像公共 Java 类一样,它需要反映文件在 Java 类路径中的位置。在我们的例子中,语法文件位于 /org/eclipse/xtext/example/Domainmodel.xtext,因此语法的名称是 org.eclipse.xtext.example.Domainmodel。该语句的第二部分(与 org.eclipse.xtext.common.Terminals 一起)指出,该语法重用并覆盖了指定语法中的规则。org.eclipse.xtext.common.Terminals 是 Xtext 附带的库语法,并预定义了最常见的终端规则

我正在开发一个 XText 插件,我想在一个单独的文件中定义我自己的终端符号。是否可以?我怎样才能做到这一点?

我尝试创建一个新的 Xtext 文件并将其附加在 org.eclipse.xtext.common.Terminals 之后并仅添加我的文件,但两种解决方案都无法编译。

谢谢。

编辑

如果我在同一个项目中使用两个 xtext 文件,一个用于语法,一个用于语法终端,则启动 mwe2 文件时会出现以下异常:

java.lang.IllegalStateException:解析“类路径:/org/xvr/language/sh/ShaderDsl.xtext”时出现问题:[XtextLinkingDiagnostic:null:1 无法解析对语法“org.xvr.language.sh.ShTerminal”的引用。 ,XtextLinkingDiagnostic:null:9 无法解析对 AbstractRule 'ID' 的引用。TransformationDiagnostic:null:14 无法创建数据类型 INVARIANT(错误代码:NoSuchTypeAvailable),TransformationDiagnostic:null:17 无法创建数据类型 PRECISION(错误代码:NoSuchTypeAvailable),TransformationDiagnostic: null:19 无法创建数据类型 HIGH_PRECISION(错误代码:NoSuchTypeAvailable),TransformationDiagnostic:null:20 无法创建数据类型 MEDIUM_PRECISION(错误代码:NoSuchTypeAvailable),TransformationDiagnostic:null:21 无法创建数据类型 LOW_PRECISION(错误代码:NoSuchTypeAvailable)]

这两个 xtext 文件是:

语法

grammar org.xvr.language.sh.ShaderDsl with org.xvr.language.sh.ShTerminal //org.eclipse.xtext.common.Terminals

generate shaderDsl "http://www.xvr.org/language/sh/ShaderDsl"
....

和语法的终端

grammar org.xvr.language.sh.ShTerminals with org.eclipse.xtext.common.Terminals
generate shTerminals "http://www.xvr.org/language/sh/ShTerminals"

terminal Test : 'test';
4

1 回答 1

5

您有很多选项(所有选项都记录在在线帮助中):

  1. 在您当前使用的语法中定义您的终端规则。
  2. 为终端符号创建一个新的专用语法,类似于我们对 common.Terminals 所做的。使用那个而不是普通的终端。
  3. 为终端符号创建一个新的专用语法,重用该语法中的 common.Terminals 并在您的实际语言中使用您自己的终端语法。

我建议您只用您的语言(选项 1)覆盖您想要更改的终端,或者如果您想使用我使用的同一组终端(选项 3)定义多种语言,或者将这两个选项结合起来,例如

grammar org.mycompany.MyTerminals with org.eclipse.xtext.common.Terminals

terminal ID: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;
terminal SL_COMMENT: '--' !('\n'|'\r')* ('\r'? '\n')?;

==

grammar org.mycompany.MyLanguage with org.mycompany.MyTerminals

MyModel: name=ID other=ANOTHER;

terminal ANOTHER: '/#' -> '#/'
于 2011-04-14T09:07:38.747 回答