質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

613閲覧

【逆工学】gotoを使わない表現に書き換える

katahiromz

総合スコア186

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2022/04/06 14:00

編集2022/04/08 00:50

今、逆工学の研究で制御構造の再現に取り組んでいます。

https://github.com/katahiromz/python-asm-parse/blob/main/00-asm-parse-05.py

C/C++風のいくつかのコードブロックが配列として与えられます。各ブロックは次のいずれかのように表せるコードです。

  1. 式;
  2. 式; goto ブロック番号;
  3. 式1; if (式2) goto ブロック番号;
  4. 式; return;

1)は式を実行して次のブロックに進む。
2)は式を実行してブロック番号のブロックに移動する。
3)はまず、式1を実行する。そして式2が正ならブロック番号のブロックに移動する。式2が偽なら次のブロックに進む。
4)は式を実行して終了する。

正規表現を使ってこの四種への分類はできました。
各ブロック番号はブロック配列におけるインデックスです。
それぞれの式にはC言語風の表現が入ります。
gotoを使わずにこれらのコードブロックをC言語のif, if-else, while, do-while, break, continueを使って書き直したいです。

ドラゴンブックを読んでいますが、いまいちわかりません。先行ブロックの番号、後続ブロックの番号、ブロックの隣接行列はわかります。

追記。テストデータを用意しました。dominators関数を追加しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

C

1while(pc >= 0){ 2 if(pc == 0){コードブロック0;pc++;} 3 else if(pc == 1){コードブロック1;pc = 3;} 4 else if(pc == 2){コードブロック2;if(条件){pc = 4;}else{pc++;}} 5 else if(pc == 3){コードブロック3;pc = -1;} 6 ... 7}

こうすれば、要件は満たします。(お望みのものとは限りませんが…。むしろ、機械語を解釈するCPUのエミュレーティングに近いですね。)

投稿2022/04/07 15:50

majiponi

総合スコア1720

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問