Commit 9e456b9b authored by Genki Sakanashi's avatar Genki Sakanashi

Replace README.ja

parent 31a99e13
2017.03.24
制御付き疑似命令列から低級アセンブリプログラムへ変換するプログラム.
SimpleConverterがスパゲッティコードになっていたので一から作成し直したもの.
加えて河邉さんが提案した配列機能も実装してある.
実行方法
./parser [-cimds] test.mg > test.mc
オプションの詳細は2016.11.2のレポートを参照すること
\ No newline at end of file
# Malbolge20/ternary
制御付き疑似命令列(中間言語)からMalbolge20用の低級アセンブリ言語へのコンパイラ.
SimpleConverterがスパゲッティコードになっていたので一から作成し直したもの.
### SimpleConverterからの変更点
- 配列の導入([文献[1]](#参考文献)
- 関数の導入([文献[2]](#参考文献)
# Getting Started
### 必要パッケージ
- [flex](https://github.com/westes/flex)
- [Bison](https://www.gnu.org/software/bison/manual/)
flex/Bison の代わりに Lex/Yacc を利用する場合は Makefile を書き換える.(ただし未検証)
### コンパイル方法
```bash
make
```
### 実行方法
```bash
./parser [-mdcis] test.mg > test.mc
```
#### オプション
- `-m`, `-d`
`ROT`/`OPR`命令はモジュールという処理ブロックとして変換されるが,モジュールが連続する場合に,**モジュールからメインの処理フローに一旦戻ってから次のモジュールにジャンプする**`-m`)か,**直接次のモジュールにジャンプする**`-d`)かを切り替える.
どちらのオプションも指定しなかった場合はランダムに決定される.
モジュールの詳細については,文献[1] に記載.
- `-c`, `-i`
`ROT`/`OPR`命令に加えて,`OUTPUT`/`INPUT`/`SET`/`RESET` 命令についても,**モジュールとして扱う**`-c`)か,**メインの処理フローに直接埋め込む**`-i`)かを切り替える.
どちらのオプションも指定しなかった場合はランダムに決定される.
- `-s`
ランダムに決定される場合の乱数のシードを与える
# コンパイル例
## 例1
以下の制御付き疑似命令列をオプションを付けてコンパイルした結果を示す.
```
DEF MAIN
OUTPUT
OUTPUT
END
```
##### `-i` オプションでコンパイル
```
PROGRAM_START_TO ENTRY@MAIN
FLAG 0/2, FLAG_CASE0
FLAG 0/2, FLAG_CASE1
FLAG 0/2, FLAG_CASE2
FLAG 1/2, FLAG_JMP
FLAG 0/2, FLAG_REV_OPR_ROT
ROUTINE GLOBAL{
ENTRY:
BASE:0
CON0:0
CON1:1743392200
CON2:3486784400
}
ROUTINE MAIN{
ENTRY:
OUTPUT
DUP
REV OUTPUT
OUTPUT
DUP
REV OUTPUT
END
}
```
##### `-mc` オプションでコンパイル
```
PROGRAM_START_TO ENTRY@MAIN
FLAG 1/2, FLAG0
FLAG 1/2, FLAG1
FLAG 0/2, FLAG_CASE0
FLAG 0/2, FLAG_CASE1
FLAG 0/2, FLAG_CASE2
FLAG 1/2, FLAG_JMP
FLAG 0/2, FLAG_REV_OPR_ROT
ROUTINE GLOBAL{
ENTRY:
BASE:0
CON0:0
CON1:1743392200
CON2:3486784400
}
ROUTINE MAIN{
ENTRY:
NEXT FLAG0
NEXT FLAG_JMP
IF FLAG_JMP
BRANCH L_OUTPUT
JMP_BACK0:
NEXT FLAG_JMP
IF FLAG_JMP
BRANCH L_OUTPUT
LABEL0:
END
# OUTPUTモジュールが生成される(-cオプションの効果)
L_OUTPUT:
OUTPUT
DUP
REV OUTPUT
NEXT FLAG1
# MAINに戻る(-mオプションの効果)
IF FLAG0
BRANCH JMP_BACK0
NEXT FLAG0
NEXT FLAG1
IF FLAG1
BRANCH LABEL0
NEXT FLAG1
}
```
##### `-dc` オプションでコンパイル
```
PROGRAM_START_TO ENTRY@MAIN
FLAG 1/2, FLAG0
FLAG 1/2, FLAG1
FLAG 0/2, FLAG_CASE0
FLAG 0/2, FLAG_CASE1
FLAG 0/2, FLAG_CASE2
FLAG 1/2, FLAG_JMP
FLAG 0/2, FLAG_REV_OPR_ROT
ROUTINE GLOBAL{
ENTRY:
BASE:0
CON0:0
CON1:1743392200
CON2:3486784400
}
ROUTINE MAIN{
ENTRY:
NEXT FLAG0
NEXT FLAG_JMP
IF FLAG_JMP
BRANCH L_OUTPUT
LABEL0:
END
# OUTPUTモジュールが生成される(-cオプションの効果)
L_OUTPUT:
OUTPUT
DUP
REV OUTPUT
NEXT FLAG1
# MAINに戻らず,次の処理(L_OUTPUT)にジャンプする(-dオプションの効果)
IF FLAG0
BRANCH L_OUTPUT
NEXT FLAG0
NEXT FLAG1
IF FLAG1
BRANCH LABEL0
NEXT FLAG1
}
```
## 例2
以下の制御付き疑似命令列をオプションを付けてコンパイルした結果を示す.
```
VAR X = 300
DEF MAIN
ROT X
OPR X
END
```
##### `-d` オプションでコンパイル
```
PROGRAM_START_TO ENTRY@MAIN
FLAG 1/2, FLAG0
FLAG 1/2, FLAG1
FLAG 0/2, FLAG_CASE0
FLAG 0/2, FLAG_CASE1
FLAG 0/2, FLAG_CASE2
FLAG 1/2, FLAG_JMP
FLAG 0/2, FLAG_REV_OPR_ROT
ROUTINE GLOBAL{
ENTRY:
BASE:0
CON0:0
CON1:1743392200
CON2:3486784400
OPR_U_X:
OPR U_X
ROT_U_X:
NEXT FLAG_REV_OPR_ROT
ROT
U_X:300
IF FLAG_REV_OPR_ROT
BRANCH REV_OPR_U_X
REV ROT
SKIP END_REV_U_X
REV_OPR_U_X:
REV OPR
NEXT FLAG_REV_OPR_ROT
END_REV_U_X:
NEXT FLAG1
# MAINに戻らず,次の処理(OPR_U_X)にジャンプする(-dオプションの効果)
IF FLAG0
BRANCH OPR_U_X
NEXT FLAG0
NEXT FLAG1
IF FLAG1
BRANCH LABEL0@MAIN
NEXT FLAG1
}
ROUTINE MAIN{
ENTRY:
NEXT FLAG0
NEXT FLAG_JMP
IF FLAG_JMP
BRANCH ROT_U_X@GLOBAL
LABEL0:
END
}
```
##### `-m` オプションでコンパイル
```
PROGRAM_START_TO ENTRY@MAIN
FLAG 1/2, FLAG0
FLAG 1/2, FLAG1
FLAG 0/2, FLAG_CASE0
FLAG 0/2, FLAG_CASE1
FLAG 0/2, FLAG_CASE2
FLAG 1/2, FLAG_JMP
FLAG 0/2, FLAG_REV_OPR_ROT
ROUTINE GLOBAL{
ENTRY:
BASE:0
CON0:0
CON1:1743392200
CON2:3486784400
OPR_U_X:
OPR U_X
ROT_U_X:
NEXT FLAG_REV_OPR_ROT
ROT
U_X:300
IF FLAG_REV_OPR_ROT
BRANCH REV_OPR_U_X
REV ROT
SKIP END_REV_U_X
REV_OPR_U_X:
REV OPR
NEXT FLAG_REV_OPR_ROT
END_REV_U_X:
NEXT FLAG1
# MAINに戻る(-mオプションの効果)
IF FLAG0
BRANCH JMP_BACK0@MAIN
NEXT FLAG0
NEXT FLAG1
IF FLAG1
BRANCH LABEL0@MAIN
NEXT FLAG1
}
ROUTINE MAIN{
ENTRY:
NEXT FLAG0
NEXT FLAG_JMP
IF FLAG_JMP
BRANCH ROT_U_X@GLOBAL
JMP_BACK0:
NEXT FLAG_JMP
IF FLAG_JMP
BRANCH OPR_U_X@GLOBAL
LABEL0:
END
}
```
# 参考文献
1. 河邉翔平,酒井正彦,西田直樹,関 浩之,[難読性の高いMalbolgeコードを生成するコンパイラのための中間言語 (2016).](https://www.trs.css.i.nagoya-u.ac.jp/Malbolge/papers/IEICE-Tech-Rep-2016Jul-Malbolge.pdf) 電子情報通信学会技術報告, Vol.116, No.127, pp.105-110
1. 坂梨元軌, 河邉翔平, 酒井正彦, 西田直樹, 橋本健二,[再帰呼び出しを持つC言語サブセットからMalbolgeへのコンパイラ (2017).](https://www.trs.css.i.nagoya-u.ac.jp/Malbolge/papers/IEICE-Tech-Rep-2017Jul-Malbolge.pdf) 電子情報通信学会技術報告, Vol.117, No.136, pp.145-150
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment