2011-04-14 98 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