Xtext試用: 5步實現一個(中文)JVM語言

續上文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

相關文章
相關標籤/搜索