我是XText的新手。
当您使用XText定义语法时,您可以指定第二个语法并使用它声明的定义here:
grammar org.eclipse.xtext.example.Domainmodel with org.eclipse.xtext.common.Terminals
在Xtext中,每个语法都有一个唯一的 name,与公共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 (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"
....
和语法的终端
grammar org.xvr.language.sh.ShTerminals with org.eclipse.xtext.common.Terminals
generate shTerminals "http://www.xvr.org/language/sh/ShTerminals"
terminal Test : 'test';
答案 0 :(得分:5)
您有很多选择(所有这些选项都记录在在线帮助中):
我建议您只使用您的语言覆盖要更改的终端(选项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: '/#' -> '#/'