最終更新日：2019年4月3日

# RExSTMビルド用ドキュメント

## はじめに

このドキュメントはファイルの修正，および，ビルドを行うためものである．
また，RExSTMの使用方法についてはRExSTM/doc/pdf/ユーザマニュアル.pdfで説明する．
このドキュメントは事前にRExSTM/doc/pdf/ユーザマニュアル.pdfを読んでいることを前提としている．

## ビルド方法

### 環境

OS: windows10 64bit
Python: version3.4.0
においてビルドに成功することを確認している．（2018年12月）
これ以外の環境でのビルドは推奨しない．

### ビルドのための設定手順（※初回ビルド時のみこの作業を行う必要がある．）

1. Pythonをインストールする
   1. Pythonの公式ダウンロードページ（最終閲覧日：2018年12月27日）からインストールしたいバージョンのPythonを選択する（画像ではPython3.4.0を選択している）．
   2. 該当するOSのものを選択する（画像ではwindowsの64bit版を選択している）．
   3. 画面の指示に従いPythonをインストールする．
2. 環境変数PATHを設定する
   1. コントロールパネルを開き，「システムとセキュリティ」→「システム」→「システムの詳細設定」と選択する．
   2. 「システムのプロパティ」というウィンドウが表示されるので，「環境変数(N)...」を選択する．
   3. 「システム環境変数(s)」内で変数が「Path」になっているものを選択し，「編集(I)...」を選択する．
   4. 「新規(N)」を選択し，Pythonのディレクトリへのパスを入力する（画像ではCドライブ直下にPythonが置かれている）．
   5. 同様に「（Pythonのディレクトリへのパス）/Scripts」を入力する．
   6. コマンドプロンプト上で"python"と入力し，下図のようにpythonが起動すれば，パスが正しく設定できている．
3. py2exeをpipによりインストールする．
   1. コマンドプロンプト上で"pip install py2exe"と入力する．py2exeのインストールに成功すると下図のような表示がされる．

### ビルド手順（※2回目以降のビルドの際にはこの作業のみを行えばよい．）

1. senni.py, analyze.pyからsenni.exe, analyze.exeを生成する．
   1. ローカル上でRExSTM/programs/senni.pyをRExSTM/setup/py2exe.batにドラッグ&ドロップする．
   2. コマンドプロンプトが開き，senni.exeの生成に成功すると下図のような表示がされる．
      キーボード上の任意のキーを押す．
   3. RExSTM/programsディレクトリにsenni.exeが生成されていることを確認する．
   4. 同様にRExSTM/programs/analyze_programs/analyze.pyをRExSTM/setup/py2exe.batにドラッグ&ドロップする．
   5. コマンドプロンプトが開き，analyze.exeの生成に成功すると先ほどと同様の表示がされる．
      いずれかのキーを押す．
   6. RExSTM/programs/analyze_programsディレクトリにanalyze.batが生成されていることを確認する．
   以上でビルドは完了する．

## ディレクトリツリー

RExSTMの動作に影響を与えるファイルを以下にまとめる．

RExSTM
├── debug
│ ├── tmp
│ │ └── timer_senni.bat
│ ├── debug_analyze_detail.sh
│ └── debug_jotaivarval.bat
├── lists
│ ├── compile.txt
│ ├── deletefunctions.txt
│ ├── no_included_files.txt
│ └── std.txt
├── log
├── programs
│ ├── analyze_programs
│ │ ├── analyze.exe
│ │ ├── analyze.py
│ │ ├── c_reform.py
│ │ ├── globaldelete.py
│ │ ├── indent.py
│ │ ├── jokenshori.py
│ │ ├── jotaivar.py
│ │ ├── marking.py
│ │ ├── mujoken.py
│ │ ├── pragma.py
│ │ ├── preif.py
│ │ ├── presw.py
│ │ ├── python34.dll
│ │ ├── ReportException.py
│ │ ├── rule_jotaivar.py
│ │ ├── setup.py
│ │ └── table.py
│ ├── add_else.py
│ ├── add_mujoken_statement.py
│ ├── deletefunction.py
│ ├── deltemp.exe
│ ├── exception_handling.py
│ ├── getjotaivalue.py
│ ├── insert_mujoken.py
│ ├── makestm.py
│ ├── python34.dll
│ ├── senni.exe
│ ├── senni.py
│ ├── setup.py
│ ├── split_funcs.py
│ └── trans2celladds.py
├── RExSTMverX.Y.Z.xlsm
├── setup
│ └── py2exe.bat
├── TargetPrograms
├── temp
├── TSV_info
└── TSV_Result

## ルートディレクトリ内の説明

programs内のファイルに対して修正を行うことで，RExSTMの動作を変更することができる．

### debug

デバッグに用いる実行ファイルが置かれている．
debug内のファイルの説明

### lists

条件処理表を生成する際のコンパイル方法を指定するドキュメントファイルが置かれている．
lists内のファイルの説明

### log

RExSTM初回実行時は空である．
エラー発生時にログファイルが生成される．

### programs

RExSTMの動作のうち，Excel上で行う動作以外の動作（構文解析，条件処理表作成，状態遷移表作成）を行うためのPythonスクリプトが置かれている．
RExSTMの動作を変更する場合は，このディレクトリ内のファイルを変更すること。
programs内のファイルの説明

### setup

ビルドに必要な実行ファイルが置かれている．
setup内のファイルの説明

### TargetPrograms

RExSTM初回実行時は空である．
解析対象とするソースコードをこのディレクトリに置く．

### temp

RExSTM初回実行時は空である．
状態遷移表を生成するための一時ファイルが生成される．

### TSV_info

RExSTM初回実行時は空である．
状態遷移表を生成するための一時ファイルが生成される．

### TSV_Result

RExSTM初回実行時は空である．
状態遷移表を生成するための一時ファイルが生成される．

### RExSTMverX.Y.Z.xlsm

構文解析、条件処理表作成、状態遷移表作成をするマクロ付Excelファイル.
このファイルを開くことでRExSTMが起動する．

## debug内のファイルの説明

- tmp/timer_senni.bat

  debug_senni.bat実行時のタイムアウト処理を行う．

- debug_analyze_detail.sh

  構文解析，条件処理表作成のデバッグモードのツール．
  詳細はdebug/readme.txtを参照．

- debug_senni.bat

  状態遷移表作成のデバッグモードのツール．
  詳細はdebug/readme.txtを参照．

## lists内のファイルの説明

- compile.txt

  条件処理表作成時のコンパイラ及びコンパイルオプションを記述する．
  RExSTM初回実行時にはデフォルトのコンパイラ及びコンパイルオプションが記述されている．

- deletefunction.txt

  jotaivar.py,deletefunction.pyで削除する関数を参照する際に用いられる．

- no_included_files.txt

  ユーザがマクロ展開したくないヘッダファイルを記述する．

- std.txt

  標準ライブラリのヘッダファイルが記述されている．
  このファイルに記述されたヘッダファイルはマクロ展開されない．

## programs内のファイル，ディレクトリの説明

各Pythonスクリプトはsenni.pyによって呼び出される．

- analyze_programs

  構文解析，条件処理表作成を行うスクリプトがまとめられている．

- add_else.py

  条件式に状態変数を含む制御構文にelse句がない場合，無処理のelseを挿入する．

- add_mujoken_statement.py

  Excel上でユーザが選択した状態変数を含む条件式のネストの外側に，「無条件」イベントで実行される処理がある場合， それらの処理を，各状態における処理の前後に付加する．
  （「無条件」イベントについてはinsert_mujoken.pyを参照）

- deletefunction.py

  Excel上でユーザが選択した状態変数がローカル変数の場合，Cファイルにおいてその変数が定義される関数以外の記述部分を削除する．

- deltemp.bat

  一時ファイルの削除を行う実行ファイル．

- exception_handling.py

  ユーザが選択した状態変数を含む制御構文のネストの深さや，状態変数の取りうる値の種類が既定の値よりも大きい場合，警告・エラー文を生成する．

- getjotaivalue.py

  与えられたCファイルにおいて，ユーザが選択した状態変数が取りうる値を全て取得する． また，状態変数の更新が起こるときのイベントを全て取得する．

- insert_mujoken.py

  Excel上でユーザが選択した状態変数の各状態における処理にイベントが存在しない場合， 「無条件」という名前のイベントを追加する．

- makestm.py

  状態変数が含まれる条件式のネストの内側にある制御構文を，状態遷移表における処理として扱うようにする．

- python34.dll

  senni.exeの実行時に必要なDLLファイル．

- senni.exe

  senni.pyを変換して生成された実行ファイル．

- senni.py

  状態遷移表作成を開始する．
  programsフォルダ内のpythonスクリプトを呼び出す．

- setup.py

  py2exe.batの実行のために必要な一時ファイル． RExSTMの動作には直接影響しない．

- split_funcs.py

  Excel上でユーザが選択したソースファイルの処理・条件式を関数ごとに分割する． split_funcs.py以降のモジュールは分割された各関数における処理・条件式を対象に実行する．

- trans2celladds.py

  各イベント・処理・状態変数名・状態変数の取りうる値それぞれにセル番地を割り当てて，状態遷移表のセル情報を作成する． 罫線の範囲と，着色の対象とするセル情報も作成する． また，各関数におけるこれらのセル情報をすべて統合する．

## analyze_programs内のファイルの説明

各Pythonスクリプトはanalyze.pyによって呼び出される．

- analyze.exe

  analyze.pyを変換して生成された実行ファイル．

- analyze.py

  構文解析，条件処理表作成を開始する．
  programs/analyze_programs内のpythonスクリプトを呼び出す．

- c_reform.py

  中括弧の位置を固定する．
  プロトタイプ宣言を削除する．

- globaldelete.py

  グローバル変数のためのダミー関数を作成する．

- indent.py

  中括弧に応じてインデントのタブ文字を付与する．

- jokenshori.py

  条件処理表を作成するためのセル情報（関数ごと）を出力する．

- jotaivar.py

  pragma.pyで出力された解析済みCファイルから状態変数候補の変数を探し，変数名のリストを出力する．

- marking.py

  if文で無処理のものを削除する．
  条件式にマーキングする．
  関数でif文および代入文を持たないものを削除する．

- mujoken.py

  ネストの深さをチェックし，対象Cファイルにおける最大の深さに満たないネストに対して無条件if文の追加を行う．

- pragma.py

  プリプロセス命令およびアセンブリ処理を削除する．

- preif.py

  様々な表記のif文をc_reform.pyで定義したものと同じ表記に変換する．

- presw.py

  switch文をif文に変換する．

- python34.dll

  analyze.exeの実行時に必要なDLLファイル.

- ReportException.py

  エラーメッセージを出力する．

- rule_jotaivar.py

  jotaivar.pyで出力された状態変数候補リストに存在する変数のうち，その変数が使われるif文のブロック内で変数への代入が発生しない場合， 状態変数候補リストから削除する．

- setup.py

  py2exe.batの実行のために必要な一時ファイル． 動作には直接影響しない．

- table.py

  jokenshori.pyで出力された，条件処理表を作成するためのセル情報（関数ごと）を1つに統合する．
  条件処理表に描画する罫線の範囲情報を出力する．

## setup内のファイルの説明

- py2exe.bat

  pythonファイルからexeファイルを生成する．
  生成されたbatファイルはpythonファイルと同じディレクトリ内に生成される．

## 参考資料

RExSTMは以下の研究に基づいて開発されている．

1. 「組込みソフトウェアを対象とした状態遷移表支援ツール」，山本椋太他（最終閲覧日：2019年2月6日）
2. ET2013 JASAブースセミナー発表資料「状態遷移表リバースモデリングへの適用紹介」，竹田彰彦（最終閲覧日：2019年2月6日）