SlideShare uma empresa Scribd logo
1 de 38
©2014 Shintaro Hosoai
Xtext入門
細合 晋太郎
2014/3/29 SEA関西プロセス分科会
©2014 Shintaro Hosoai
DSL(Domain Specific Language)とは
• 特定用途に限定した,独自言語
• 一般的に他言語にマッピングして用いられる事
が多い
• 特定用途にしか利用できないが,
抽象度が高く,より要件
に近い表現ができる.
22014/3/29 SEA関西プロセス分科会
Assembler
C
Java
DSL
汎用性
抽
象
度
©2014 Shintaro Hosoai
DSLのメリット
• 生産性の向上
• ドメイン分析
• 特定のモデルしか書けない
• プログラミングの知識があまりなくても書ける
• ドメインを明確にする
• プログラミングというプログラマの暗黙知を形
式知に
• とはいえ,変換ルール,コードテンプレートは結局
暗黙的になっちゃいますが・・.
32014/3/29 SEA関西プロセス分科会
©2014 Shintaro Hosoai
DSLの分類
• 今回のXtextはExternal Textual DSLを生成するた
めのフレームワークです.
• XtextはJavaとの親和性が高いので,Internal DSL
に近い感覚で利用できます.
42014/3/29 SEA関西プロセス分科会
Internal
言語内
External
独自処理系
Textual
テキスト形式
Rake(Ruby) Make,
SQL
Graphical
図形式
Visual Studio? UML, SysML,
Matlab
©2014 Shintaro Hosoai
DSL環境の構造
52014/3/29 SEA関西プロセス分科会
DSL定義
DSL
コー
ド
テンプレー
ト
DSL
エディ
タ
DSL
パーサ
コード
ジェネ
レータ
DSL
メタモデ
ル
モデ
ル
©2014 Shintaro Hosoai
DSLの作り方
• ドメイン知識が必要となるため,新規開発には
あまり向かない
• 既存資産からパターンを抽出し,ドメインモデ
ルと
変換規則を作成する
62014/3/29 SEA関西プロセス分科会
ドメイン固有の
パターンの抽出
既存資産
DSL定義
テンプレー
ト
©2014 Shintaro Hosoai
Xtext
2014/3/29 SEA関西プロセス分科会 7
©2014 Shintaro Hosoai
Xtextとは
• Itemis社のオープンソースプロジェクト
EclipseのDSL開発支援環境
• 言語定義を元にEclipse上で動作するDSLエディ
タ,DSLパーサ,言語モデル,コードジェネ
レータ等を生成する
• http://www.eclipse.org/Xtext/index.html
82014/3/29 SEA関西プロセス分科会
©2014 Shintaro Hosoai
Xtext
92014/3/29 SEA関西プロセス分科会
DSL定義
DSL
コー
ド
テンプレー
ト
DSL
エディ
タ
DSL
パーサ
コード
ジェネ
レータ
DSL
メタモデ
ル
モデ
ル
©2014 Shintaro Hosoai
Xtext機能紹介
102014/3/29 SEA関西プロセス分科会
Syntax
Coloring
Content Assist
Validation and
Quick Fixes
Advanced
Java
Integration
Integration
with other
Eclipse tools
More IDE
Features
©2014 Shintaro Hosoai
Xtext構成
112014/3/29 SEA関西プロセス分科会
EMF
MDD基盤
Xtend2
Javaを生成す
る軽量言語
MWE2
モデルワーク
フローエンジ
ン
Xtext
DSL言語定義
©2014 Shintaro Hosoai
Xtext構成
122014/3/29 SEA関西プロセス分科会
Xtend2
Javaを生成す
る軽量言語
MWE2
モデルワーク
フローエンジ
ン
Xtext
DSL言語定義
EMF
MDD基盤
©2014 Shintaro Hosoai
EMF(Eclipse Modeling Framework)
• Eclipseのモデリングフレームワーク
• OMGのMDAに基づいた実装
• 多くのモデリング技術の基盤となっている
• MDAとは
132014/3/29 SEA関西プロセス分科会
M3:メタメタモデ
ル
M2:メタモデル
M1:モデル
M0:インスタンス
メタモデルを定義するための,一番大本となるモデル
MOF(Meta Object Facility)
モデルを定義するモデル,UMLやSysML,その他OMGの各種
モデルがこのレベルで定義されている
メタモデルで定義された記法に沿って記述されたモデル.
UMLに当てはめるなら,実際に描かれたクラス図など
モデルに基づいた実体.UMLであれば実装されたコードなど
このMOFがEMFでecoreとして実装されている.
ecoreを基盤とすることで,MDAの多くの技術が利用可能に
©2014 Shintaro Hosoai
Eclipse Modeling Projects
142014/3/29 SEA関西プロセス分科会
EMF
モデル入力
(DSL)
Textual
Xtext
Graphical
GMF
Graphiti
モデル変換
ATL
QVT
QVTd
http://projects.eclipse.org/list-of-projects
コード生成
Acceleo
JET2
Xpand
その他
EMF Diff
EMF Query
AMW
MoDisco
UML2
Papyrus
OCL
Sirius
Sphinx
VIATRA2
Requirement
BPMN2
Epsilon
Ecore Tools
Texo ...
©2014 Shintaro Hosoai
XtextのEMF
• 主に言語のメタモデル生成.このメタモデル・
メタモデル実装(Java)をベースに各種プラグ
インが形成される
152014/3/29 SEA関西プロセス分科会
言語定義
(.xtext)
言語メタモデ
ル
(.ecore)
言語メタモデル
実装
(.java)
Xtextの生成プラグイン
©2014 Shintaro Hosoai
Xtext構成
162014/3/29 SEA関西プロセス分科会
EMF
MDD基盤
MWE2
モデルワーク
フローエンジ
ン
Xtext
DSL言語定義
Xtend2
Javaを生成す
る軽量言語
©2014 Shintaro Hosoai
Xtend2
• Xtextで作られたJavaを生成するLL
• Javaのかゆい所に手が届く,とても便利な言語
• 書いたそばから生成→コンパイルまで行ってく
れるので,Javaとシームレスに利用可能
• Xtextでも様々な用途で用いられている
• 主要機能
• 動的型付け(ただしコンパイル時に型決定なので安
心)
• ラムダ式,拡張関数,拡張Switch
• テンプレート記述
• →マニュアル参照
172014/3/29 SEA関西プロセス分科会
©2014 Shintaro Hosoai
コードテンプレート
182014/3/29 SEA関西プロセス分科会
def toJavaCode(Statemachine sm) '''
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class «sm.eResource.className» {
public static void main(String[] args) {
new «sm.eResource.className»().run();
}
«FOR c : sm.commands»
«c.declareCommand»
«ENDFOR»
protected void run() {
boolean executeActions = true;
String currentState = "«sm.states.head?.name»";
String lastEvent = null;
while (true) {
テンプレート
public class signal {
public static void main(String[] args) {
new signal().run();
}
protected void doLightBlue() {
System.out.println("Executing command
}
protected void doLightYellow() {
System.out.println("Executing command
}
protected void doLightRed() {
System.out.println("Executing command
}
protected void run() {
生成コード
©2014 Shintaro Hosoai
Xtext構成
192014/3/29 SEA関西プロセス分科会
EMF
MDD基盤
Xtend2
Javaを生成す
る軽量言語
Xtext
DSL言語定義
MWE2
モデルワーク
フローエンジ
ン
©2014 Shintaro Hosoai
MWE2
• ワークフローエンジン.これもXtextで書かれ
てます.
• モデル駆動開発の主要な作業(ワーク)をワー
クフローの形で記述できる
• 例えば
• DSLファイルの読み込み,パース,モデル変
換,コード生成など
• Xtextの言語生成を行う際もこのMWE2のスクリ
プトを起動して言語環境の生成を行う.
202014/3/29 SEA関西プロセス分科会
©2014 Shintaro Hosoai
MWE2例
212014/3/29 SEA関西プロセス分科会
Workflow {
bean = StandaloneSetup {...}
component = DirectoryCleaner {
directory = "${runtimeProject}/src-gen"
}
component = Generator {
pathRtProject = runtimeProject
pathUiProject = "${runtimeProject}.ui"
pathTestProject = "${runtimeProject}.tests"
projectNameRt = projectName
projectNameUi = "${projectName}.ui"
encoding = encoding
language = auto-inject {
uri = grammarURI
fragment = grammarAccess.GrammarAccessFragment auto-
inject {}
...
フロー例
Standalone
Setup
Directory
Cleaner
Generator
©2014 Shintaro Hosoai
Xtext構成
222014/3/29 SEA関西プロセス分科会
EMF
MDD基盤
Xtend2
Javaを生成す
る軽量言語
MWE2
モデルワーク
フローエンジ
ン
Xtext
DSL言語定義
©2014 Shintaro Hosoai
Xtext
• 言語定義と言語環境の生成.エディタの生成
• 言語定義言語のXtext自体もまたXtextで作られ
ている
• Xtextは拡張BNF風の言語定義言語
• 再帰下降型構文解析
• EMFのモデルへ変換する字句解析器,構文解析
器が自動生成される
232014/3/29 SEA関西プロセス分科会
©2014 Shintaro Hosoai
Xtext構造
grammar org.eclipse.xtext.example.fowlerdsl.Statemachine with
org.eclipse.xtext.common.Terminals
generate statemachine "http://www.eclipse.org/xtext/example/fowlerdsl/Statemachine"
Statemachine :
{Statemachine}
('events'
events+=Event+
'end')?
('resetEvents'
resetEvents+=[Event]+
'end')?
('commands'
commands+=Command+
'end')?
states+=State*;
terminal MYID:
'A''0'..'9';
言語名宣言と言語Mixin
言語モデル宣言
Parser Rule/言語構造定義
lexis/語彙定義
初めのうちは,上二つは自動生成ままで利用するのがよい
Event:
name=ID;
...
2014/3/29 SEA関西プロセス分科会 24
©2014 Shintaro Hosoai
Parser Rules
State:
'state' name=ID
('actions' '{' actions+=[Command]+ '}')?
transitions+=Transition*
'end';
state myState
actions { myCommand1 myCommand2 }
event2 => myState2
event3 => myState3
end
Transition:
event=[Event] '=>' state=[State];
DSL定義
DSL例
2014/3/29 SEA関西プロセス分科会 25
©2014 Shintaro Hosoai
Parser Rules
State:
'state' name=ID
('actions' '{' actions+=[Command]+ '}')?
transitions+=Transition*
'end';
state myState
actions { myCommand1 myCommand2 }
event2 => myState2
event3 => myState3
end
Transition:
event=[Event] '=>' state=[State];
DSL定義
DSL例
定義名:~‘;’までが一つのルールとなる.
この定義名のモデルが生成される
(Returnsを指定しない場合)
:State
:Transition:Transition
:Commandactions
transitions
:Command
2014/3/29 SEA関西プロセス分科会 26
©2014 Shintaro Hosoai
Parser Rules
State:
'state' name=ID
('actions' '{' actions+=[Command]+ '}')?
transitions+=Transition*
'end';
state myState
actions { myCommand1 myCommand2 }
event2 => myState2
event3 => myState3
end
Transition:
event=[Event] '=>' state=[State];
DSL定義
DSL例
’’で区切った部分は語彙として定義される
2014/3/29 SEA関西プロセス分科会 27
©2014 Shintaro Hosoai
Parser Rules
State:
'state' name=ID
('actions' '{' actions+=[Command]+ '}')?
transitions+=Transition*
'end';
state myState
actions { myCommand1 myCommand2 }
event2 => myState2
event3 => myState3
end
Transition:
event=[Event] '=>' state=[State];
DSL定義
DSL例
変数は,属性として生成される.
割り当てに応じて =:単体,+=:List
として生成
State
name : ID
actions : List<Command>
transitions:List<Transition>
Transition
event : Event
state : State
2014/3/29 SEA関西プロセス分科会 28
©2014 Shintaro Hosoai
Parser Rules
State:
'state' name=ID
('actions' '{' actions+=[Command]+ '}')?
transitions+=Transition*
'end';
state myState
actions { myCommand1 myCommand2 }
event2 => myState2
event3 => myState3
end
Transition:
event=[Event] '=>' state=[State];
DSL定義
DSL例
[]で指定した要素はnameによりで
インスタンスを参照する.
このため参照されるRuleにはname=ID
を持つ必要がある.
例ではState,Event,Commandは参照可
Transitionはname=IDを持たないので,
参照出来ない.
割り当てに用いることが出来るのは,
・Terminal Rule (ex: ID)
・Parser Rule (ex: Transition)
・Parser Ruleの実体への参照(ex: [Command])
2014/3/29 SEA関西プロセス分科会 29
©2014 Shintaro Hosoai
Parser Rules
State:
'state' name=ID
('actions' '{' actions+=[Command]+ '}')?
transitions+=Transition*
'end';
state myState
actions { myCommand1 myCommand2 }
event2 => myState2
event3 => myState3
end
Transition:
event=[Event] '=>' state=[State];
DSL定義
DSL例
繰り返し指定
*:0以上
+:1以上
?:0or1
():グループ化
actions句はあってもなくてもよい.
actionは空白区切りで1以上繰り返し指
定可能
transition句は0回以上なので,なくても
よい
1以上の繰り返し指定を行う場合は
+=で割り当てる.
2014/3/29 SEA関西プロセス分科会 30
©2014 Shintaro Hosoai
まとめ
312014/3/29 SEA関西プロセス分科会
DSL定義
DSL
コー
ド
テンプレー
ト
DSL
エディ
タ
DSL
パーサ
コード
ジェネ
レータ
DSL
メタモデ
ル
モデ
ル
XtendEMFXtext
MWE2
©2014 Shintaro Hosoai
Xtext Project Sample
2014/3/29 SEA関西プロセス分科会 32
©2014 Shintaro Hosoai
DSLエディタ生成までの流れ
332014/3/29 SEA関西プロセス分科会
New Xtext
Project
Wizard
①ひな形プロジェクト群の生成
*.tests*.ui *.sdk
Xtext Project
②言語定義の追加
言語定義
言語生成
ワークフ
ロー
©2014 Shintaro Hosoai
生成されるプロジェクト
• projectname
言語定義とランタイムコンポーネント
(Parser, Lexer, Linker, validation)
• projectname.tests
ユニットテスト用プロジェクト
• projectname.ui
エディタ機能の拡張用プロジェクト(コンテン
ツアシスト,ラベル,アウトライン,クイック
フィックス)
• projectname.sdk
Xtext以外の拡張を行う際のひな形
342014/3/29 SEA関西プロセス分科会
©2014 Shintaro Hosoai
プロジェクト詳細
• ProjectName
• src : ユーザが定義するソース群
• * : 言語定義
• *.formatting : コードフォーマット
• *.generator : コード生成定義
• *.jvmmodel : Java連携
• *.scoping : 言語要素のスコープコントロール
• *.validation : バリデーション機能
• src-gen : ワークフローやecoreから自動生成
されるコード群
• xtend-gen : Xtendから自動生成されるコード群
• model : 言語定義から生成されるecore
• その他 : plugin.xml等
352014/3/29 SEA関西プロセス分科会
最初の内はこの二つ
から触るのがよい
©2014 Shintaro Hosoai
grammar org.eclipse.xtext.example.fowlerdsl.Statemachine with
org.eclipse.xtext.common.Terminals
generate statemachine "http://www.eclipse.org/xtext/example/fowlerdsl/Statemachine"
Statemachine :
{Statemachine}
('events'
events+=Event+
'end')?
('resetEvents'
resetEvents+=[Event]+
'end')?
('commands'
commands+=Command+
'end')?
states+=State*;
Event:
name=ID;
Command:
name=ID;
State:
'state' name=ID
('actions' '{' actions+=[Command]+ '}')?
transitions+=Transition*
'end';
Transition:
event=[Event] '=>' state=[State];
First Example(1):Xtext
Statemachine
Event Command State
Transition
events commands states
event
state
transitions
actions
*** *
*
11
New > Example, Xtext Examples > Xtext Statemachine Example
362014/3/29 SEA関西プロセス分科会
©2014 Shintaro Hosoai
DSLをパースして生成されるモデル
DSLイメージ
First Example(2):DSL
events
toBlue
toYellow
toRed
end
commands
lightBlue
lightYellow
lightRed
end
state blue
actions {
lightBlue
}
toYellow=>yellow
end
state yellow
actions {
lightRed
}
toRed=>red
end
state red
actions {
lightRed
}
toBlue=>blue
end
blue
entry/lightBlue
yellow
entry/lightYellow
red
entry/lightRed
toBlue
toYellow
toRed
toBlue:Event
toYellow:Event
toRed:Event
lightBlue:Command
lightYellow:Command
lightRed:Command
blue:State
yellow:State
red:State
toBlue->blue:Transition
toYellow->yellow:Transition
toRed->red:Transition
:Statemachine
→のような
ステートマシンを
DSLとして入力
Xtextによる
パース
2014/3/29 SEA関西プロセス分科会 37
©2014 Shintaro Hosoai
First Example(3):Code Generate
2014/3/29 SEA関西プロセス分科会 38
生成モデル
def toJavaCode(Statemachine sm) '''
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class «sm.eResource.className» {
public static void main(String[] args) {
new «sm.eResource.className»().run();
}
«FOR c : sm.commands»
«c.declareCommand»
«ENDFOR»
protected void run() {
boolean executeActions = true;
String currentState = "«sm.states.head?.name»";
String lastEvent = null;
while (true) {
テンプレート
public class signal {
public static void main(String[] args) {
new signal().run();
}
protected void doLightBlue() {
System.out.println("Executing command
}
protected void doLightYellow() {
System.out.println("Executing command
}
protected void doLightRed() {
System.out.println("Executing command
}
protected void run() {
生成コード

Mais conteúdo relacionado

Mais procurados

「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビューTakafumi ONAKA
 
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1  ドメイン駆動設計の基本を理解する3週連続DDDその1  ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する増田 亨
 
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDDドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD増田 亨
 
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選Takuya Ueda
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)Mikiya Okuno
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについてkumake
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学MITSUNARI Shigeo
 
DDD sample code explained in Java
DDD sample code explained in JavaDDD sample code explained in Java
DDD sample code explained in Java増田 亨
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう増田 亨
 
基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装Masatoshi Tada
 
RedmineのFAQとアンチパターン集
RedmineのFAQとアンチパターン集RedmineのFAQとアンチパターン集
RedmineのFAQとアンチパターン集akipii Oga
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48Preferred Networks
 
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~ CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~ SEGADevTech
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けモノビット エンジン
 
SQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリーSQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリーke-m kamekoopa
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 

Mais procurados (20)

「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
 
Docker Swarm入門
Docker Swarm入門Docker Swarm入門
Docker Swarm入門
 
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1  ドメイン駆動設計の基本を理解する3週連続DDDその1  ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
 
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDDドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD
 
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
DDD sample code explained in Java
DDD sample code explained in JavaDDD sample code explained in Java
DDD sample code explained in Java
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装
 
RedmineのFAQとアンチパターン集
RedmineのFAQとアンチパターン集RedmineのFAQとアンチパターン集
RedmineのFAQとアンチパターン集
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
 
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~ CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
SQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリーSQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリー
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 

Semelhante a Xtext入門

【JJUG CCC 2016 Fall 公開版】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜
【JJUG CCC 2016 Fall 公開版】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜【JJUG CCC 2016 Fall 公開版】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜
【JJUG CCC 2016 Fall 公開版】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜Fumiyasu Sumiya
 
Automation with SoftLayer and Zabbix
Automation with SoftLayer and ZabbixAutomation with SoftLayer and Zabbix
Automation with SoftLayer and Zabbixsoftlayerjp
 
DSLによる要求獲得でスーパーアジャイル
DSLによる要求獲得でスーパーアジャイルDSLによる要求獲得でスーパーアジャイル
DSLによる要求獲得でスーパーアジャイル陽平 山口
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
ドコモのクラウドとビックデータJpi版
ドコモのクラウドとビックデータJpi版ドコモのクラウドとビックデータJpi版
ドコモのクラウドとビックデータJpi版Osaka University
 
Nttドコモ事例から見るモバイル&クラウド時代のサービス開発についてr4(public)
Nttドコモ事例から見るモバイル&クラウド時代のサービス開発についてr4(public)Nttドコモ事例から見るモバイル&クラウド時代のサービス開発についてr4(public)
Nttドコモ事例から見るモバイル&クラウド時代のサービス開発についてr4(public)Osaka University
 
キレイなコードの書き方
キレイなコードの書き方キレイなコードの書き方
キレイなコードの書き方Takuya Kitamura
 
【第二回 ゼロからはじめる Oracle Solaris 11】01 できることは人工知能なみ!? ~すべてを自動化できる AI とは?~
【第二回 ゼロからはじめる Oracle Solaris 11】01 できることは人工知能なみ!? ~すべてを自動化できる AI とは?~【第二回 ゼロからはじめる Oracle Solaris 11】01 できることは人工知能なみ!? ~すべてを自動化できる AI とは?~
【第二回 ゼロからはじめる Oracle Solaris 11】01 できることは人工知能なみ!? ~すべてを自動化できる AI とは?~SolarisJP
 
"Up" with vagrant and docker
"Up" with vagrant and docker"Up" with vagrant and docker
"Up" with vagrant and dockerHiroshi Miura
 
IETF90 Web関連WG報告 #isocjp
IETF90 Web関連WG報告 #isocjpIETF90 Web関連WG報告 #isocjp
IETF90 Web関連WG報告 #isocjpKaoru Maeda
 
IETF92報告IoT関連
IETF92報告IoT関連IETF92報告IoT関連
IETF92報告IoT関連Kaoru Maeda
 
2022_sakura-yube_ddd.pdf
2022_sakura-yube_ddd.pdf2022_sakura-yube_ddd.pdf
2022_sakura-yube_ddd.pdftoshiki kawai
 
"Up" with vagrant and docker
"Up" with vagrant and docker"Up" with vagrant and docker
"Up" with vagrant and dockerHiroshi Miura
 
KOBE IT FESTIVAL 2012
KOBE IT FESTIVAL 2012KOBE IT FESTIVAL 2012
KOBE IT FESTIVAL 2012Hiroshi Bunya
 
レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れる
レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れるレガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れる
レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れるsairoutine
 
DeNA内製ゲームエンジンの現状と目指す未来 #denatechcon
DeNA内製ゲームエンジンの現状と目指す未来 #denatechconDeNA内製ゲームエンジンの現状と目指す未来 #denatechcon
DeNA内製ゲームエンジンの現状と目指す未来 #denatechconDeNA
 
ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀増田 亨
 
FiNC DDD第一回勉強会
FiNC DDD第一回勉強会FiNC DDD第一回勉強会
FiNC DDD第一回勉強会裕紀 重村
 
2020/06/16 tsjp-azure-staticwebapps-vs_codespaces
2020/06/16 tsjp-azure-staticwebapps-vs_codespaces2020/06/16 tsjp-azure-staticwebapps-vs_codespaces
2020/06/16 tsjp-azure-staticwebapps-vs_codespacesIssei Hiraoka
 

Semelhante a Xtext入門 (20)

Xtext practice
Xtext practiceXtext practice
Xtext practice
 
【JJUG CCC 2016 Fall 公開版】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜
【JJUG CCC 2016 Fall 公開版】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜【JJUG CCC 2016 Fall 公開版】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜
【JJUG CCC 2016 Fall 公開版】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜
 
Automation with SoftLayer and Zabbix
Automation with SoftLayer and ZabbixAutomation with SoftLayer and Zabbix
Automation with SoftLayer and Zabbix
 
DSLによる要求獲得でスーパーアジャイル
DSLによる要求獲得でスーパーアジャイルDSLによる要求獲得でスーパーアジャイル
DSLによる要求獲得でスーパーアジャイル
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
ドコモのクラウドとビックデータJpi版
ドコモのクラウドとビックデータJpi版ドコモのクラウドとビックデータJpi版
ドコモのクラウドとビックデータJpi版
 
Nttドコモ事例から見るモバイル&クラウド時代のサービス開発についてr4(public)
Nttドコモ事例から見るモバイル&クラウド時代のサービス開発についてr4(public)Nttドコモ事例から見るモバイル&クラウド時代のサービス開発についてr4(public)
Nttドコモ事例から見るモバイル&クラウド時代のサービス開発についてr4(public)
 
キレイなコードの書き方
キレイなコードの書き方キレイなコードの書き方
キレイなコードの書き方
 
【第二回 ゼロからはじめる Oracle Solaris 11】01 できることは人工知能なみ!? ~すべてを自動化できる AI とは?~
【第二回 ゼロからはじめる Oracle Solaris 11】01 できることは人工知能なみ!? ~すべてを自動化できる AI とは?~【第二回 ゼロからはじめる Oracle Solaris 11】01 できることは人工知能なみ!? ~すべてを自動化できる AI とは?~
【第二回 ゼロからはじめる Oracle Solaris 11】01 できることは人工知能なみ!? ~すべてを自動化できる AI とは?~
 
"Up" with vagrant and docker
"Up" with vagrant and docker"Up" with vagrant and docker
"Up" with vagrant and docker
 
IETF90 Web関連WG報告 #isocjp
IETF90 Web関連WG報告 #isocjpIETF90 Web関連WG報告 #isocjp
IETF90 Web関連WG報告 #isocjp
 
IETF92報告IoT関連
IETF92報告IoT関連IETF92報告IoT関連
IETF92報告IoT関連
 
2022_sakura-yube_ddd.pdf
2022_sakura-yube_ddd.pdf2022_sakura-yube_ddd.pdf
2022_sakura-yube_ddd.pdf
 
"Up" with vagrant and docker
"Up" with vagrant and docker"Up" with vagrant and docker
"Up" with vagrant and docker
 
KOBE IT FESTIVAL 2012
KOBE IT FESTIVAL 2012KOBE IT FESTIVAL 2012
KOBE IT FESTIVAL 2012
 
レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れる
レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れるレガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れる
レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れる
 
DeNA内製ゲームエンジンの現状と目指す未来 #denatechcon
DeNA内製ゲームエンジンの現状と目指す未来 #denatechconDeNA内製ゲームエンジンの現状と目指す未来 #denatechcon
DeNA内製ゲームエンジンの現状と目指す未来 #denatechcon
 
ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀
 
FiNC DDD第一回勉強会
FiNC DDD第一回勉強会FiNC DDD第一回勉強会
FiNC DDD第一回勉強会
 
2020/06/16 tsjp-azure-staticwebapps-vs_codespaces
2020/06/16 tsjp-azure-staticwebapps-vs_codespaces2020/06/16 tsjp-azure-staticwebapps-vs_codespaces
2020/06/16 tsjp-azure-staticwebapps-vs_codespaces
 

Mais de Shintaro Hosoai

UMLだけじゃないもやもやを解消するモデリング技術の紹介 その2 Feature Model
UMLだけじゃないもやもやを解消するモデリング技術の紹介 その2 Feature ModelUMLだけじゃないもやもやを解消するモデリング技術の紹介 その2 Feature Model
UMLだけじゃないもやもやを解消するモデリング技術の紹介 その2 Feature ModelShintaro Hosoai
 
astah関西勉強会#2 STAMP Workbenchではじめる安全分析
astah関西勉強会#2 STAMP Workbenchではじめる安全分析astah関西勉強会#2 STAMP Workbenchではじめる安全分析
astah関西勉強会#2 STAMP Workbenchではじめる安全分析Shintaro Hosoai
 
Eclipse modeling projectの概要
Eclipse modeling projectの概要Eclipse modeling projectの概要
Eclipse modeling projectの概要Shintaro Hosoai
 
テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介
テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介
テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介Shintaro Hosoai
 
Eclipse con2010 参加報告 upload
Eclipse con2010 参加報告 uploadEclipse con2010 参加報告 upload
Eclipse con2010 参加報告 uploadShintaro Hosoai
 

Mais de Shintaro Hosoai (10)

UMLだけじゃないもやもやを解消するモデリング技術の紹介 その2 Feature Model
UMLだけじゃないもやもやを解消するモデリング技術の紹介 その2 Feature ModelUMLだけじゃないもやもやを解消するモデリング技術の紹介 その2 Feature Model
UMLだけじゃないもやもやを解消するモデリング技術の紹介 その2 Feature Model
 
astah関西勉強会#2 STAMP Workbenchではじめる安全分析
astah関西勉強会#2 STAMP Workbenchではじめる安全分析astah関西勉強会#2 STAMP Workbenchではじめる安全分析
astah関西勉強会#2 STAMP Workbenchではじめる安全分析
 
astah関西勉強会
astah関西勉強会astah関西勉強会
astah関西勉強会
 
手抜力
手抜力手抜力
手抜力
 
Mqttで始めるIoT
Mqttで始めるIoTMqttで始めるIoT
Mqttで始めるIoT
 
Xtext&Xtend documents
Xtext&Xtend documentsXtext&Xtend documents
Xtext&Xtend documents
 
Umlとは
UmlとはUmlとは
Umlとは
 
Eclipse modeling projectの概要
Eclipse modeling projectの概要Eclipse modeling projectの概要
Eclipse modeling projectの概要
 
テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介
テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介
テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介
 
Eclipse con2010 参加報告 upload
Eclipse con2010 参加報告 uploadEclipse con2010 参加報告 upload
Eclipse con2010 参加報告 upload
 

Xtext入門

  • 1. ©2014 Shintaro Hosoai Xtext入門 細合 晋太郎 2014/3/29 SEA関西プロセス分科会
  • 2. ©2014 Shintaro Hosoai DSL(Domain Specific Language)とは • 特定用途に限定した,独自言語 • 一般的に他言語にマッピングして用いられる事 が多い • 特定用途にしか利用できないが, 抽象度が高く,より要件 に近い表現ができる. 22014/3/29 SEA関西プロセス分科会 Assembler C Java DSL 汎用性 抽 象 度
  • 3. ©2014 Shintaro Hosoai DSLのメリット • 生産性の向上 • ドメイン分析 • 特定のモデルしか書けない • プログラミングの知識があまりなくても書ける • ドメインを明確にする • プログラミングというプログラマの暗黙知を形 式知に • とはいえ,変換ルール,コードテンプレートは結局 暗黙的になっちゃいますが・・. 32014/3/29 SEA関西プロセス分科会
  • 4. ©2014 Shintaro Hosoai DSLの分類 • 今回のXtextはExternal Textual DSLを生成するた めのフレームワークです. • XtextはJavaとの親和性が高いので,Internal DSL に近い感覚で利用できます. 42014/3/29 SEA関西プロセス分科会 Internal 言語内 External 独自処理系 Textual テキスト形式 Rake(Ruby) Make, SQL Graphical 図形式 Visual Studio? UML, SysML, Matlab
  • 5. ©2014 Shintaro Hosoai DSL環境の構造 52014/3/29 SEA関西プロセス分科会 DSL定義 DSL コー ド テンプレー ト DSL エディ タ DSL パーサ コード ジェネ レータ DSL メタモデ ル モデ ル
  • 6. ©2014 Shintaro Hosoai DSLの作り方 • ドメイン知識が必要となるため,新規開発には あまり向かない • 既存資産からパターンを抽出し,ドメインモデ ルと 変換規則を作成する 62014/3/29 SEA関西プロセス分科会 ドメイン固有の パターンの抽出 既存資産 DSL定義 テンプレー ト
  • 7. ©2014 Shintaro Hosoai Xtext 2014/3/29 SEA関西プロセス分科会 7
  • 8. ©2014 Shintaro Hosoai Xtextとは • Itemis社のオープンソースプロジェクト EclipseのDSL開発支援環境 • 言語定義を元にEclipse上で動作するDSLエディ タ,DSLパーサ,言語モデル,コードジェネ レータ等を生成する • http://www.eclipse.org/Xtext/index.html 82014/3/29 SEA関西プロセス分科会
  • 9. ©2014 Shintaro Hosoai Xtext 92014/3/29 SEA関西プロセス分科会 DSL定義 DSL コー ド テンプレー ト DSL エディ タ DSL パーサ コード ジェネ レータ DSL メタモデ ル モデ ル
  • 10. ©2014 Shintaro Hosoai Xtext機能紹介 102014/3/29 SEA関西プロセス分科会 Syntax Coloring Content Assist Validation and Quick Fixes Advanced Java Integration Integration with other Eclipse tools More IDE Features
  • 11. ©2014 Shintaro Hosoai Xtext構成 112014/3/29 SEA関西プロセス分科会 EMF MDD基盤 Xtend2 Javaを生成す る軽量言語 MWE2 モデルワーク フローエンジ ン Xtext DSL言語定義
  • 12. ©2014 Shintaro Hosoai Xtext構成 122014/3/29 SEA関西プロセス分科会 Xtend2 Javaを生成す る軽量言語 MWE2 モデルワーク フローエンジ ン Xtext DSL言語定義 EMF MDD基盤
  • 13. ©2014 Shintaro Hosoai EMF(Eclipse Modeling Framework) • Eclipseのモデリングフレームワーク • OMGのMDAに基づいた実装 • 多くのモデリング技術の基盤となっている • MDAとは 132014/3/29 SEA関西プロセス分科会 M3:メタメタモデ ル M2:メタモデル M1:モデル M0:インスタンス メタモデルを定義するための,一番大本となるモデル MOF(Meta Object Facility) モデルを定義するモデル,UMLやSysML,その他OMGの各種 モデルがこのレベルで定義されている メタモデルで定義された記法に沿って記述されたモデル. UMLに当てはめるなら,実際に描かれたクラス図など モデルに基づいた実体.UMLであれば実装されたコードなど このMOFがEMFでecoreとして実装されている. ecoreを基盤とすることで,MDAの多くの技術が利用可能に
  • 14. ©2014 Shintaro Hosoai Eclipse Modeling Projects 142014/3/29 SEA関西プロセス分科会 EMF モデル入力 (DSL) Textual Xtext Graphical GMF Graphiti モデル変換 ATL QVT QVTd http://projects.eclipse.org/list-of-projects コード生成 Acceleo JET2 Xpand その他 EMF Diff EMF Query AMW MoDisco UML2 Papyrus OCL Sirius Sphinx VIATRA2 Requirement BPMN2 Epsilon Ecore Tools Texo ...
  • 15. ©2014 Shintaro Hosoai XtextのEMF • 主に言語のメタモデル生成.このメタモデル・ メタモデル実装(Java)をベースに各種プラグ インが形成される 152014/3/29 SEA関西プロセス分科会 言語定義 (.xtext) 言語メタモデ ル (.ecore) 言語メタモデル 実装 (.java) Xtextの生成プラグイン
  • 16. ©2014 Shintaro Hosoai Xtext構成 162014/3/29 SEA関西プロセス分科会 EMF MDD基盤 MWE2 モデルワーク フローエンジ ン Xtext DSL言語定義 Xtend2 Javaを生成す る軽量言語
  • 17. ©2014 Shintaro Hosoai Xtend2 • Xtextで作られたJavaを生成するLL • Javaのかゆい所に手が届く,とても便利な言語 • 書いたそばから生成→コンパイルまで行ってく れるので,Javaとシームレスに利用可能 • Xtextでも様々な用途で用いられている • 主要機能 • 動的型付け(ただしコンパイル時に型決定なので安 心) • ラムダ式,拡張関数,拡張Switch • テンプレート記述 • →マニュアル参照 172014/3/29 SEA関西プロセス分科会
  • 18. ©2014 Shintaro Hosoai コードテンプレート 182014/3/29 SEA関西プロセス分科会 def toJavaCode(Statemachine sm) ''' import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class «sm.eResource.className» { public static void main(String[] args) { new «sm.eResource.className»().run(); } «FOR c : sm.commands» «c.declareCommand» «ENDFOR» protected void run() { boolean executeActions = true; String currentState = "«sm.states.head?.name»"; String lastEvent = null; while (true) { テンプレート public class signal { public static void main(String[] args) { new signal().run(); } protected void doLightBlue() { System.out.println("Executing command } protected void doLightYellow() { System.out.println("Executing command } protected void doLightRed() { System.out.println("Executing command } protected void run() { 生成コード
  • 19. ©2014 Shintaro Hosoai Xtext構成 192014/3/29 SEA関西プロセス分科会 EMF MDD基盤 Xtend2 Javaを生成す る軽量言語 Xtext DSL言語定義 MWE2 モデルワーク フローエンジ ン
  • 20. ©2014 Shintaro Hosoai MWE2 • ワークフローエンジン.これもXtextで書かれ てます. • モデル駆動開発の主要な作業(ワーク)をワー クフローの形で記述できる • 例えば • DSLファイルの読み込み,パース,モデル変 換,コード生成など • Xtextの言語生成を行う際もこのMWE2のスクリ プトを起動して言語環境の生成を行う. 202014/3/29 SEA関西プロセス分科会
  • 21. ©2014 Shintaro Hosoai MWE2例 212014/3/29 SEA関西プロセス分科会 Workflow { bean = StandaloneSetup {...} component = DirectoryCleaner { directory = "${runtimeProject}/src-gen" } component = Generator { pathRtProject = runtimeProject pathUiProject = "${runtimeProject}.ui" pathTestProject = "${runtimeProject}.tests" projectNameRt = projectName projectNameUi = "${projectName}.ui" encoding = encoding language = auto-inject { uri = grammarURI fragment = grammarAccess.GrammarAccessFragment auto- inject {} ... フロー例 Standalone Setup Directory Cleaner Generator
  • 22. ©2014 Shintaro Hosoai Xtext構成 222014/3/29 SEA関西プロセス分科会 EMF MDD基盤 Xtend2 Javaを生成す る軽量言語 MWE2 モデルワーク フローエンジ ン Xtext DSL言語定義
  • 23. ©2014 Shintaro Hosoai Xtext • 言語定義と言語環境の生成.エディタの生成 • 言語定義言語のXtext自体もまたXtextで作られ ている • Xtextは拡張BNF風の言語定義言語 • 再帰下降型構文解析 • EMFのモデルへ変換する字句解析器,構文解析 器が自動生成される 232014/3/29 SEA関西プロセス分科会
  • 24. ©2014 Shintaro Hosoai Xtext構造 grammar org.eclipse.xtext.example.fowlerdsl.Statemachine with org.eclipse.xtext.common.Terminals generate statemachine "http://www.eclipse.org/xtext/example/fowlerdsl/Statemachine" Statemachine : {Statemachine} ('events' events+=Event+ 'end')? ('resetEvents' resetEvents+=[Event]+ 'end')? ('commands' commands+=Command+ 'end')? states+=State*; terminal MYID: 'A''0'..'9'; 言語名宣言と言語Mixin 言語モデル宣言 Parser Rule/言語構造定義 lexis/語彙定義 初めのうちは,上二つは自動生成ままで利用するのがよい Event: name=ID; ... 2014/3/29 SEA関西プロセス分科会 24
  • 25. ©2014 Shintaro Hosoai Parser Rules State: 'state' name=ID ('actions' '{' actions+=[Command]+ '}')? transitions+=Transition* 'end'; state myState actions { myCommand1 myCommand2 } event2 => myState2 event3 => myState3 end Transition: event=[Event] '=>' state=[State]; DSL定義 DSL例 2014/3/29 SEA関西プロセス分科会 25
  • 26. ©2014 Shintaro Hosoai Parser Rules State: 'state' name=ID ('actions' '{' actions+=[Command]+ '}')? transitions+=Transition* 'end'; state myState actions { myCommand1 myCommand2 } event2 => myState2 event3 => myState3 end Transition: event=[Event] '=>' state=[State]; DSL定義 DSL例 定義名:~‘;’までが一つのルールとなる. この定義名のモデルが生成される (Returnsを指定しない場合) :State :Transition:Transition :Commandactions transitions :Command 2014/3/29 SEA関西プロセス分科会 26
  • 27. ©2014 Shintaro Hosoai Parser Rules State: 'state' name=ID ('actions' '{' actions+=[Command]+ '}')? transitions+=Transition* 'end'; state myState actions { myCommand1 myCommand2 } event2 => myState2 event3 => myState3 end Transition: event=[Event] '=>' state=[State]; DSL定義 DSL例 ’’で区切った部分は語彙として定義される 2014/3/29 SEA関西プロセス分科会 27
  • 28. ©2014 Shintaro Hosoai Parser Rules State: 'state' name=ID ('actions' '{' actions+=[Command]+ '}')? transitions+=Transition* 'end'; state myState actions { myCommand1 myCommand2 } event2 => myState2 event3 => myState3 end Transition: event=[Event] '=>' state=[State]; DSL定義 DSL例 変数は,属性として生成される. 割り当てに応じて =:単体,+=:List として生成 State name : ID actions : List<Command> transitions:List<Transition> Transition event : Event state : State 2014/3/29 SEA関西プロセス分科会 28
  • 29. ©2014 Shintaro Hosoai Parser Rules State: 'state' name=ID ('actions' '{' actions+=[Command]+ '}')? transitions+=Transition* 'end'; state myState actions { myCommand1 myCommand2 } event2 => myState2 event3 => myState3 end Transition: event=[Event] '=>' state=[State]; DSL定義 DSL例 []で指定した要素はnameによりで インスタンスを参照する. このため参照されるRuleにはname=ID を持つ必要がある. 例ではState,Event,Commandは参照可 Transitionはname=IDを持たないので, 参照出来ない. 割り当てに用いることが出来るのは, ・Terminal Rule (ex: ID) ・Parser Rule (ex: Transition) ・Parser Ruleの実体への参照(ex: [Command]) 2014/3/29 SEA関西プロセス分科会 29
  • 30. ©2014 Shintaro Hosoai Parser Rules State: 'state' name=ID ('actions' '{' actions+=[Command]+ '}')? transitions+=Transition* 'end'; state myState actions { myCommand1 myCommand2 } event2 => myState2 event3 => myState3 end Transition: event=[Event] '=>' state=[State]; DSL定義 DSL例 繰り返し指定 *:0以上 +:1以上 ?:0or1 ():グループ化 actions句はあってもなくてもよい. actionは空白区切りで1以上繰り返し指 定可能 transition句は0回以上なので,なくても よい 1以上の繰り返し指定を行う場合は +=で割り当てる. 2014/3/29 SEA関西プロセス分科会 30
  • 31. ©2014 Shintaro Hosoai まとめ 312014/3/29 SEA関西プロセス分科会 DSL定義 DSL コー ド テンプレー ト DSL エディ タ DSL パーサ コード ジェネ レータ DSL メタモデ ル モデ ル XtendEMFXtext MWE2
  • 32. ©2014 Shintaro Hosoai Xtext Project Sample 2014/3/29 SEA関西プロセス分科会 32
  • 33. ©2014 Shintaro Hosoai DSLエディタ生成までの流れ 332014/3/29 SEA関西プロセス分科会 New Xtext Project Wizard ①ひな形プロジェクト群の生成 *.tests*.ui *.sdk Xtext Project ②言語定義の追加 言語定義 言語生成 ワークフ ロー
  • 34. ©2014 Shintaro Hosoai 生成されるプロジェクト • projectname 言語定義とランタイムコンポーネント (Parser, Lexer, Linker, validation) • projectname.tests ユニットテスト用プロジェクト • projectname.ui エディタ機能の拡張用プロジェクト(コンテン ツアシスト,ラベル,アウトライン,クイック フィックス) • projectname.sdk Xtext以外の拡張を行う際のひな形 342014/3/29 SEA関西プロセス分科会
  • 35. ©2014 Shintaro Hosoai プロジェクト詳細 • ProjectName • src : ユーザが定義するソース群 • * : 言語定義 • *.formatting : コードフォーマット • *.generator : コード生成定義 • *.jvmmodel : Java連携 • *.scoping : 言語要素のスコープコントロール • *.validation : バリデーション機能 • src-gen : ワークフローやecoreから自動生成 されるコード群 • xtend-gen : Xtendから自動生成されるコード群 • model : 言語定義から生成されるecore • その他 : plugin.xml等 352014/3/29 SEA関西プロセス分科会 最初の内はこの二つ から触るのがよい
  • 36. ©2014 Shintaro Hosoai grammar org.eclipse.xtext.example.fowlerdsl.Statemachine with org.eclipse.xtext.common.Terminals generate statemachine "http://www.eclipse.org/xtext/example/fowlerdsl/Statemachine" Statemachine : {Statemachine} ('events' events+=Event+ 'end')? ('resetEvents' resetEvents+=[Event]+ 'end')? ('commands' commands+=Command+ 'end')? states+=State*; Event: name=ID; Command: name=ID; State: 'state' name=ID ('actions' '{' actions+=[Command]+ '}')? transitions+=Transition* 'end'; Transition: event=[Event] '=>' state=[State]; First Example(1):Xtext Statemachine Event Command State Transition events commands states event state transitions actions *** * * 11 New > Example, Xtext Examples > Xtext Statemachine Example 362014/3/29 SEA関西プロセス分科会
  • 37. ©2014 Shintaro Hosoai DSLをパースして生成されるモデル DSLイメージ First Example(2):DSL events toBlue toYellow toRed end commands lightBlue lightYellow lightRed end state blue actions { lightBlue } toYellow=>yellow end state yellow actions { lightRed } toRed=>red end state red actions { lightRed } toBlue=>blue end blue entry/lightBlue yellow entry/lightYellow red entry/lightRed toBlue toYellow toRed toBlue:Event toYellow:Event toRed:Event lightBlue:Command lightYellow:Command lightRed:Command blue:State yellow:State red:State toBlue->blue:Transition toYellow->yellow:Transition toRed->red:Transition :Statemachine →のような ステートマシンを DSLとして入力 Xtextによる パース 2014/3/29 SEA関西プロセス分科会 37
  • 38. ©2014 Shintaro Hosoai First Example(3):Code Generate 2014/3/29 SEA関西プロセス分科会 38 生成モデル def toJavaCode(Statemachine sm) ''' import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class «sm.eResource.className» { public static void main(String[] args) { new «sm.eResource.className»().run(); } «FOR c : sm.commands» «c.declareCommand» «ENDFOR» protected void run() { boolean executeActions = true; String currentState = "«sm.states.head?.name»"; String lastEvent = null; while (true) { テンプレート public class signal { public static void main(String[] args) { new signal().run(); } protected void doLightBlue() { System.out.println("Executing command } protected void doLightYellow() { System.out.println("Executing command } protected void doLightRed() { System.out.println("Executing command } protected void run() { 生成コード