XText:使用自定义终端定义

时间:2011-04-14 08:46:10

标签: eclipse eclipse-plugin grammar xtext

我是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';

1 个答案:

答案 0 :(得分:5)

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

  1. 在您当前使用的语法中定义终端规则。
  2. 为终端符号创建一个新的专用语法,类似于我们对common.Terminals所做的。使用那个而不是普通的终端。
  3. 为终端符号创建一个新的专用语法,重用该语法中的common.Terminals并以您的实际语言使用您自己的终端语法。
  4. 我建议您只使用您的语言覆盖要更改的终端(选项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: '/#' -> '#/'