今、逆工学の研究で制御構造の再現に取り組んでいます。
https://github.com/katahiromz/python-asm-parse/blob/main/00-asm-parse-05.py
C/C++風のいくつかのコードブロックが配列として与えられます。各ブロックは次のいずれかのように表せるコードです。
- 式;
- 式; goto ブロック番号;
- 式1; if (式2) goto ブロック番号;
- 式; return;
1)は式を実行して次のブロックに進む。
2)は式を実行してブロック番号のブロックに移動する。
3)はまず、式1を実行する。そして式2が正ならブロック番号のブロックに移動する。式2が偽なら次のブロックに進む。
4)は式を実行して終了する。
正規表現を使ってこの四種への分類はできました。
各ブロック番号はブロック配列におけるインデックスです。
それぞれの式にはC言語風の表現が入ります。
gotoを使わずにこれらのコードブロックをC言語のif, if-else, while, do-while, break, continueを使って書き直したいです。
ドラゴンブックを読んでいますが、いまいちわかりません。先行ブロックの番号、後続ブロックの番号、ブロックの隣接行列はわかります。
追記。テストデータを用意しました。dominators関数を追加しました。
回答1件
あなたの回答
tips
プレビュー