2011-04-14 100 views
3

我完全不熟悉XText。XText:使用自定义终端定义

当你使用XTEXT你可以指定一个第二语法和使用,因为它是说,它声明的定义定义语法here

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: 问题解析 '类路径:/org/xvr/language/sh/ShaderDsl.xtext':[XtextLinkingDiagnostic: 空:1无法解析参照 语法 “org.xvr.language.sh。 ShTerm inal', XtextLinkingDiagnostic:null:9 无法解析对参考文献 AbstractRule'ID'。, TransformationDiagnostic:空:14 无法创建数据类型不变 (错误码:NoSuchTypeAvailable), TransformationDiagnostic:空:17 无法创建数据类型精密 (错误码:NoSuchTypeAvailable), TransformationDiagnostic:空:19 无法创建数据类型HIGH_PRECISION (错误代码:NoSuchTypeAvailable), TransformationDiagnostic:空:20 无法创建数据类型 MEDIUM_PRECISION(错误码: NoSuchTypeAvailable), TransformationDiagnostic:空: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'; 
+0

我试过了,我得到错误“生成的包myTerminals”可能不是空的“在生成线。你是怎么避免的? – mvmn 2017-01-12 13:15:13

回答

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: '/#' -> '#/' 
+0

嗨,谢谢你的回复!我不明白:我可以有两个不同的xtext文件,一个定义语法,另一个定义语法终端在同一个xtext项目中?我尝试了第三个解决方案...在同一个项目中有两个xtext文件,我得到一个异常(请参阅编辑)。 – hara 2011-04-14 09:20:06

+0

您必须确保语法文件名遵循Java类的约定。也就是说,您的org.xvr.language.sh.ShTerminal必须位于程序包org.xvr.language.sh中的java源文件夹中,并且该文件必须命名为ShTerminal.xtext。 – 2011-04-14 09:42:01

+0

是的。该文件作为语法驻留在包org.xvr.language.sh中,它被称为ShTerminals.xtext ..可能是什么问题? – hara 2011-04-14 15:07:09