作成者: Wataru Zama
Pascal風の言語であるMMPのコンパイラです.
Compilerクラスのインスタンスを生成する.
// インスタンス生成
Compiler compiler;文字列を直接セットする場合はCompiler::set_program_string関数を使用する.
// プログラムの文字列をセットする
compiler.set_program_string("A:=0.");コンパイルするファイル名を指定する場合はCompiler::set_program_file関数を使用する.
// ファイル名をセットする
compiler.set_program_file("sample.pas");Compiler::compile関数を使ってコンパイルする.
// コンパイル
compiler.compile();結果をターミナルに表示する.
// 結果の表示
compiler.print_result();指定したファイルに結果を出力する.
// ファイルに結果を出力
compiler.output_file("sample.obj");以下はmmpcが存在するまたはパスが通っているディレクトリで実行した例である.オプションは必須で,ファイルパスは複数指定できる.ファイルは拡張子を含める必要がある.
mmpc [オプション(必須)] [ファイルのパス1 ファイルのパス2, ...]
以下はオプションの一覧である.
| オプション | 内容 |
|---|---|
| -c | コンパイル結果をターミナルに出力する |
| -f | コンパイル結果をファイルに出力する |
| -cfまたは-fc | コンパイル結果をターミナルとファイルに出力する |
| -hまたは--help | ヘルプを表示する |
また,エラー処理も実装済.
プログラムをコンパイルして得られたオブジェクトファイルを仮想マシンを使用して実行する.
Compilerクラスから,オブジェクトファイルを取得する.
// オブジェクトファイルを取得
vector<Command> obj = compiler.get_obj();VMクラスのインスタンスをオブジェクトファイルで生成する.
// 仮想マシンのインスタンス生成
VM vm(compiler.get_obj());VM::run関数を用いて,オブジェクトファイルを実行する.入力および出力はターミナルで行われる.
// オブジェクトファイルを実行
vm.run();READ(A);
A:= A+10;
WRITE(A).GET 0
LOD 0
LDC 10
ADD
STR 0
PUT 0
1を入力した場合.
11
READ(L);
A:= 0; K:= 1;
WHILE K < L+1 DO
A:= A+K;
K:= K+1
ENDWHILE;
WRITE(A).GET 11
LDC 0
STR 0
LDC 1
STR 10
LOD 10
LOD 11
LDC 1
ADD
LET
CJP 20
LOD 0
LOD 10
ADD
STR 0
LOD 10
LDC 1
ADD
STR 10
UJP 5
PUT 0
10を入力した場合.
55
- sample/: サンプルプログラムのディレクトリ
- sample1.pas: サンプルプログラム1
- sample2.pas: サンプルプログラム2
- ︙
- sample1.obj: サンプルプログラム1の出力オブジェクトファイル
- sample2.obj: サンプルプログラム2の出力オブジェクトファイル
- ︙
- command.cpp:
Commandクラスのソースファイル - command.hpp:
Commandクラスのヘッダファイル - compiler.cpp:
Compilerクラスのソースファイル - compiler.hpp:
Compilerクラスのヘッダファイル - example.cpp:
Compilerクラスのメソッドを使ったコンパイルの例 - example.sh:
example.cppのコンパイルと実行用のシェルスクリプト - mmpc:
mmpc(mini-mini pascal compiler)の実行ファイル - mmpc.cpp:
mmpc実行ファイルのソースファイル - mmpc.sh:
mmpc.cppのコンパイル用のシェルスクリプト - vm.cpp:
VMクラスのソースファイル - vm.hpp:
VMクラスのヘッダファイル
| 誤り内容 | メッセージ |
|---|---|
文(statement)の末尾が;または.でない. |
文の末尾が正しく認識されません. |
文(statement)がREAD文,WRITE文,代入文,;または.のみの文 |
文が正しく認識されません. |
READの左括弧がない |
READ文の左括弧が認識されません. |
READの変数が存在しないか,A-Zでない |
READ文の引数が正しくありません. |
READの右括弧がない |
READ文の右括弧が認識されません. |
WRITEの左括弧がない |
WRITE文の左括弧が認識されません. |
WRITEの変数が存在しないか,A-Zでない |
WRITE文の引数が正しくありません. |
WRITEの右括弧がない |
WRITE文の右括弧が認識されません. |
WHILEの後に空白がない |
WHILE文の後に空白がありません. |
WHILEの後にDOがない |
WHILE文のDOが認識されません. |
DOの後に空白または改行がない |
WHILE文のDOの後に空白または改行がありません. |
ENDWHILEがない |
WHILE文の終わり(ENDWHILE)が認識されません. |
関係式がの演算子が=か>か<の何でもない |
関係式が正しくありません. |
| 符号なし定数が0から始まっている | 定数が0から始まっています. |
| 符号なし定数が2147483647より大きい (符号なし定数はプログラム内ではint型で格納されているためこの範囲) |
定数が大きすぎます. |
| カーソルがプログラムの文字列の末尾(ヌルポインタ)を指している状態でエラー | プログラムの終わりが正しくありません. |
誤りが検出された場合,以下の画像のようにエラーメッセージとエラー該当箇所が赤背景になった文字列が表示されます.
| 誤り内容 | メッセージ |
|---|---|
| 共通(全エラーで出力) | `詳しくは-hまたは--helpを参照してください. |
| 引数が1つしかない | mmpc [オプション(必須)] [ファイルのパス1 ファイルのパス2, ...] の形式で実行してください. |
| オプションが正しくない | オプションを正しく指定してください. |
指定されたファイルに.がない |
拡張子付きファイルを指定してください. |
上から順に精査.
| 誤り内容 | メッセージ |
|---|---|
| 入力が数値でない | 正常な数値を入力してください. |
| 入力が2147483647より大きい (入力値はプログラム内ではint型で格納されているためこの範囲) |
入力された数値が大きすぎます. |
| 入力が負の数 | 非負の整数を入力してください. |
| 入力が小数 | 整数を入力してください. |
