續上文Xtext試用: 快速實現簡單領域專用語言(DSL). 基於官方教程: Five simple steps to your JVM languagehtml
達成以下語言:java
它被Quan6JvmModelInferrer中的轉換生成Java源代碼(與上文中的代碼生成不一樣的是, 不須要寫出具體Java語法).git
項目源碼在: program-in-chinese/xtext_tutorial_15_min_zh, 只包含了語法規則所在項目. 其餘項目(.ide, .tests, .ui.tests等等, 也不知何用)未提交. 測試項目(包括上圖的代碼)在: program-in-chinese/xtext_tutorial_15_min_zhgithub
因爲本人建立的項目名稱與教程不一樣(com.program_in_chinese.quan6), 運行後打開DSL源碼文件時報錯:bash
An internal error occurred during: "XtextReconcilerJob". java.lang.IllegalArgumentException: Domainmodel.importSection does not exist 複製代碼
後發現語法規則的命名空間應該修改成自定義的(本文用的Quan6, 而非教程中的Domainmodel). 順便將關鍵詞漢化了, 標識符支持中文(IDENTIFIER等), 更新後的語法規則以下:markdown
grammar com.program_in_chinese.quan6.Quan6 with org.eclipse.xtext.xbase.Xbase
generate quan6 "http://www.program_in_chinese.com/quan6/Quan6"
Quan6:
importSection=XImportSection?
elements+=AbstractElement*;
AbstractElement:
PackageDeclaration | Entity;
PackageDeclaration:
'包' name=QualifiedName '{'
elements+=AbstractElement*
'}';
Entity:
'類' name=ValidID ('擴展' superType=JvmTypeReference)? '{'
features+=Feature*
'}';
Feature:
Property | Operation;
Property:
name=ValidID ':' type=JvmTypeReference;
Operation:
'函數' name=ValidID
'('(params+=FullJvmFormalParameter
(',' params+=FullJvmFormalParameter)*)?')'
':' type=JvmTypeReference
body=XBlockExpression;
@Override
ValidID:
IDENTIFIER;
terminal IDENTIFIER:
'^'?('\u4E00'..'\u9FA5'|'\uF900'..'\uFA2D'|'a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|'\u4E00'..'\u9FA5'|'\uF900'..'\uFA2D')*;
複製代碼
其中很多xbase支持的規則如XBlockExpression, 就是Java塊, 如:dom
{ return "Hello World" + "!" } 複製代碼
這個教程中演示的語法定製程度彷佛有限, 在深刻學習xtext語法規則描述語言(The Grammar Language)和xbase以前, 還不能確認可以支持多麼自由的語法定義. 但暫時沒想到什麼確定能不到的語法規則(未把不帶空格語法考慮在內). 感受工具的一些錯誤反饋信息不那麼易懂, 使用過程當中感受不那麼結實. 但至少應該能夠用於語言原型的快速開發.eclipse
2018-01-19jvm