SMCのステートマシン作業環境【VisualStudio/IntelliJ】


はじめに

状態遷移を記述できるステートマシンは、ゲームキャラの状態遷移やUIの受付状態など、適用範囲が広く便利(らしい)です。SMC(State Map Compiler)を使用すると、状態遷移記述に特化した独自言語を使用して状態遷移を記述してから特定の言語(C#など)での実装を生成できます。Dotファイルも生成できるので、ステートマシン図(画像)も作成できます。
↓の記事に詳しいです。

要約:知らないと損するアプリ開発におけるStateMachineの活用法
https://qiita.com/mokemokechicken/items/9a4f7dea5a0fe37bd26f

ステートマシンの記述方法には、プログラムに自作で組み込む方法と、ツール(SMC)を使用する方法が考えられると思います。

SMCが便利そうだったので、IDE(VisualStudioとIntelliJ)でSMCを利用する作業環境を考えてみました。

環境

  • Windows10 Pro 64bit
  • VisualStudio 2015
  • IntelliJ Ultimate 2018.1

SMC概要(コマンドラインからの利用)

インストール関連

SMC使い方

smファイルのコンパイル

smファイル(独自言語)のあるフォルダで以下のコマンドを実行します。ソースコードとステートマシン図を同時に出力できないので、オプションを変えて2つのコマンドを実行します。

C#ソースコードとグラフ画像生成用Dotファイルを出力するコンパイルコマンド
java -jar (Smc.jarへの絶対パス) -csharp (コンパイル対象のsmファイル)
java -jar (Smc.jarへの絶対パス) -graph test.sm

Dot画像出力

Graphvizでdotファイルからpng画像を出力します。

png画像出力
dot -Tpng -o test_sm.png test_sm.dot

IDEからSMCを使用する作業環境の作成

 IDEの外部ツール呼び出し機能をつかってSMCコンパイルできるようにします。

準備(コンパイル・画像生成bat作成)

以下のコンパイル用batファイルをsmcインストールディレクトリに作成します。

smc_cs.bat
:
:ソースコード生成とグラフ生成
:
"(Java1.7インストールディレクトリ)\bin\java.exe" -jar "(SMCインストールディレクトリ)\smc\bin\Smc.jar" -csharp %1
"(Java1.7インストールディレクトリ)\bin\java.exe" -jar "(SMCインストールディレクトリ)\smc\bin\Smc.jar" -graph %1
dot -Tpng -o %~n1_sm.png "%~p1\%~n1_sm.dot"

引数で与えたsmファイルに対して以下のことを実行するバッチファイルです

  • smファイルをコンパイルしてc#コードを出力(SMC)
  • smファイルをコンパイルしてdotファイルを出力(SMC)
  • dotファイルからグラフのpng画像を出力(Graphviz)

※ 「java」コマンドではなく、「java1.7のjava.exeへの絶対パス」を記述しているのは、「java」コマンドは、環境変数設定によってはjava1.7以外が起動してしまうことがあるため。(Smc.jarの実行はjava1.8だと失敗する)

VisualStudio からSMC利用(C#)

VisualStudio への設定手順

  1. 外部ツールにSMCの設定を追加
    1. Tools > External Tools... > Add ボタン
    2. 下図のように設定する

使い方(外部ツール呼び出し)

  1. Solution Explorerでコンパイルしたいsmファイルを選択
  2. 作成した外部ツールを実行
    1. Tools > smc(C#)(作成した設定名)

IntelliJからSMC利用(java,javascript,pythonなど)

IntelliJにはsmファイル用のコードハイライトプラグインがあるので、それも導入すると便利です。
(ただし、エディタの挙動がバギーな気がする 2018/9/5)

IntelliJ への設定手順

  1. (任意)コードハイライトのプラグイン「SmcPlugin」をインストール
    1. File > Setting > Plugins > Search In Repositories > SmcPluginを検索 > Install > (IntelliJ再起動)
  2. 外部ツールにSMCの設定を追加
    1. File > Settings > Tools > External Tools > +アイコンから設定追加
    2. 下図のように設定する
    3. Argumentsの、ファイル絶対パスを表すマクロ「$FilePath」を「"」で囲んでいるのは、パスに半角スペースが含まれていた場合にうまく動作しないため。

使い方(外部ツール呼び出し)

  1. Project ビューでコンパイルしたいsmファイルを選択して、作成した外部ツールを実行
    1. Tools > External Tools > smc(C#)(作成した設定名)

おまけ

コンパイル時の言語ごと引数対応

以下公式サイトから抜粋

SmcManual
http://smc.sourceforge.net/SmcManual.htm

Target Language Command Line Option Base File Name File Name Suffix Complete File Name
C -c AppClass_sm .h, .c AppClass_sm.h
C++ -c++ AppClass_sm .h, .cpp AppClass_sm.h
C# -csharp AppClass_sm .cs AppClass_sm.cs
Graphviz -graph AppClass_sm .dot AppClass_sm.dot
Groovy -groovy AppClassContext .groovy AppClassContext.groovy
Java -java, -java7 AppClassContext .java AppClassContext.java
Lua -lua AppClass_sm .lua AppClass_sm.lua
Objective-C -objc AppClass_sm .h, .m AppClass_sm.h
Perl -perl AppClass_sm .pm AppClass_sm.pm
Php -php AppClass_sm .php AppClass_sm.php
Python -python AppClass_sm .py AppClass_sm.py
Ruby -ruby AppClass_sm .rb AppClass_sm.rb
Scala -scala AppClassContext .scala AppClassContext.scala
HTML table -table AppClass_sm .html AppClass_sm.table
Tcl -tcl AppClass_sm .tcl AppClass_sm.tcl
Visual BASIC .Net -vb AppClass_sm .vb AppClass_sm.vb

IntelliJのRunからSMC実行する方法

※smファイルを追加するたびに「Run Configuration」を記述する必要があるため、この方法はお蔵入りです。一応、こういう方法もあるということで書いておきます。

  1. コードハイライトのプラグイン「SmcPlugin」をインストール
  2. JRE1.7(or JDK1.7)をSDKへ追加 2018/8/22
  3. Run Configurationに設定追加
    • JAR Application項目に、下図のように設定追加する
    • JREはjava1.7を指定のこと