Eclipse XText:使用自定义端子定义

Eclipse XText:使用自定义端子定义,eclipse,eclipse-plugin,grammar,xtext,Eclipse,Eclipse Plugin,Grammar,Xtext,我对XText完全是新手 使用XText定义语法时,可以指定第二个语法,并使用它声明的定义,如所述: 在Xtext中,每个语法都有一个唯一的 名称,类似于公共Java类 需要反映项目的位置 Java类路径中的文件。在我们 语法文件位于中的大小写 /org/eclipse/xtext/example/Domainmodel.xtext 因此,语法的名称是 org.eclipse.xtext.example.Domainmodel。 该声明的第二部分( 具有 org.eclipse.xtext.co

我对XText完全是新手

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

在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:空:9 无法解析对的引用 抽象规则“ID”。, TransformationDiagnostic:空:14 无法创建数据类型不变量 (错误代码:NoSuchTypeAvailable), TransformationDiagnostic:空:17 无法创建数据类型精度 (错误代码:NoSuchTypeAvailable), TransformationDiagnostic:空:19 无法创建高精度的数据类型 (错误代码:NoSuchTypeAvailable), TransformationDiagnostic:空值:20 无法创建数据类型 中等精度(错误代码: 无此类型可用), TransformationDiagnostic:空:21 无法创建低精度的数据类型 (错误代码: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所做的。使用该端子代替普通端子
  • 为终端符号创建新的专用语法,重用该语法中的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: '/#' -> '#/'
    

    你好,谢谢你的回复!我不明白:我可以在同一个xtext项目中有两个不同的xtext文件吗?一个定义语法,另一个定义语法的终端?我尝试了第三种解决方案……在同一个项目中使用两个xtext文件时,我遇到了一个异常(请参见编辑)。您必须确保语法文件名遵循Java类的约定。就是,您的org.xvr.language.sh.ShTerminal必须位于包org.xvr.language.sh中的java源文件夹中,并且该文件必须命名为ShTerminal.xtext.yes。该文件作为语法驻留在包org.xvr.language.sh中,名为ShTerminals.xtext。可能有什么问题?您的语法称为ShTerminals,但您将其称为ShTerminalsSHS终端(不带s)。这应该会导致问题。我已经尝试过了,但在生成行收到错误“生成的包'myTerminals'可能不是空的”。你是怎么避免的?
    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: '/#' -> '#/'