Skip to content

A compiler for a Pascal-like programming language.

Notifications You must be signed in to change notification settings

W-Zama/MMP-Compiler

Repository files navigation

MMP Compiler

作成者: Wataru Zama

Pascal風の言語であるMMPのコンパイラです.

コンパイル方法1(Compilerクラスを直接使用して,C++のファイル上で実行する)

インスタンス生成

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");

コンパイル方法2(コンパイラの実行ファイルmmpcを使用する)

実行コマンド

以下はmmpcが存在するまたはパスが通っているディレクトリで実行した例である.オプションは必須で,ファイルパスは複数指定できる.ファイルは拡張子を含める必要がある.

mmpc [オプション(必須)] [ファイルのパス1 ファイルのパス2, ...]

以下はオプションの一覧である.

オプション 内容
-c コンパイル結果をターミナルに出力する
-f コンパイル結果をファイルに出力する
-cfまたは-fc コンパイル結果をターミナルとファイルに出力する
-hまたは--help ヘルプを表示する

また,エラー処理も実装済.

仮想マシンによるオブジェクトファイルの実行

プログラムをコンパイルして得られたオブジェクトファイルを仮想マシンを使用して実行する.

オブジェクトファイルを取得する

Compilerクラスから,オブジェクトファイルを取得する.

// オブジェクトファイルを取得
vector<Command> obj = compiler.get_obj();

VMクラスのインスタンスを生成する

VMクラスのインスタンスをオブジェクトファイルで生成する.

// 仮想マシンのインスタンス生成
VM vm(compiler.get_obj());

実行

VM::run関数を用いて,オブジェクトファイルを実行する.入力および出力はターミナルで行われる.

// オブジェクトファイルを実行
vm.run();

コンパイルと実行の例

sample1

ソースコード(/sample/sample1.pas)

READ(A);
A:= A+10;
WRITE(A).

コンパイル結果(オブジェクトファイル,/sample/sample1.obj)

GET 0
LOD 0
LDC 10
ADD
STR 0
PUT 0

実行結果

1を入力した場合.

11

sample2

ソースコード(/sample/sample2.pas)

READ(L);
A:= 0; K:= 1;
WHILE K < L+1 DO
  A:= A+K;
  K:= K+1
ENDWHILE;
WRITE(A).

コンパイル結果(オブジェクトファイル,/sample/sample2.obj)

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クラスのヘッダファイル

誤り処理一覧

Compilerクラス

誤り内容 メッセージ
文(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型で格納されているためこの範囲)
定数が大きすぎます.
カーソルがプログラムの文字列の末尾(ヌルポインタ)を指している状態でエラー プログラムの終わりが正しくありません.

誤りが検出された場合,以下の画像のようにエラーメッセージとエラー該当箇所が赤背景になった文字列が表示されます.


誤り表示

mmpc実行ファイル

誤り内容 メッセージ
共通(全エラーで出力) `詳しくは-hまたは--helpを参照してください.
引数が1つしかない mmpc [オプション(必須)] [ファイルのパス1 ファイルのパス2, ...] の形式で実行してください. 
オプションが正しくない オプションを正しく指定してください. 
 指定されたファイルに.がない  拡張子付きファイルを指定してください.

VMクラス(仮想マシン)

上から順に精査.

誤り内容 メッセージ
入力が数値でない 正常な数値を入力してください. 
入力が2147483647より大きい
(入力値はプログラム内ではint型で格納されているためこの範囲) 
入力された数値が大きすぎます.
入力が負の数   非負の整数を入力してください. 
入力が小数   整数を入力してください. 

About

A compiler for a Pascal-like programming language.

Resources

Stars

Watchers

Forks