XText:使用自定义终端定义

har*_*ara 3 eclipse grammar eclipse-plugin xtext

我是XText的新手.

当您使用的Xtext,你可以指定一个第二语法和使用,因为它是说,它宣称的定义定义语法在这里:

grammar org.eclipse.xtext.example.Domainmodel with org.eclipse.xtext.common.Terminals
Run Code Online (Sandbox Code Playgroud)

在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(ErrorCode:NoSuchTypeAvailable),TransformationDiagnostic:null:17无法创建数据类型PRECISION(ErrorCode:NoSuchTypeAvailable),TransformationDiagnostic: null:19无法创建数据类型HIGH_PRECISION(ErrorCode:NoSuchTypeAvailable),TransformationDiagnostic:null:20无法创建数据类型MEDIUM_PRECISION(ErrorCode:NoSuchTypeAvailable),TransformationDiagnostic:null:21无法创建数据类型LOW_PRECISION(ErrorCode: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"
....
Run Code Online (Sandbox Code Playgroud)

和语法的终端

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

terminal Test : 'test';
Run Code Online (Sandbox Code Playgroud)

Seb*_*kow 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: '/#' -> '#/'
Run Code Online (Sandbox Code Playgroud)