问题描述
|
我对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:
问题解析
\'classpath:/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\';
解决方法
您有很多选择(在线帮助中都有所有选择):
在您当前正在使用的语法中定义您的终端规则。
为终端符号创建一个新的专用语法,类似于我们对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: \'/#\' -> \'#/\'