SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

MASMとなでしこによるオリジナルコンパイラの制作

MASMとなでしこによるオリジナルコンパイラの制作 4

メッセージボックス関数の拡張と変数の宣言の実装

  • このエントリーをはてなブックマークに追加

前回はついにVEFBLのコンパイラを作成しました。今回はメッセージボックス関数(msgbox)でタイトルを指定できるようにしたり、変数を宣言できるようにします。

  • このエントリーをはてなブックマークに追加

はじめに

 本連載では、日本語プログラミング言語の中で高いシェアを占める「なでしこ」を使用して、BASICライクな自作言語のコンパイラを作成します。

 前回、「MASMとなでしこによるオリジナルコンパイラの制作 3」では、自作プログラミング言語「VEFBL」のコンパイラを作成しました。今回はメッセージボックス関数の拡張と変数の実装をします。今まで作成してきたソースコードは過去の記事を参照してください。

過去の記事

メッセージボックスの実装 1

複数の引数の実装

 メッセージボックスは既に実装していますが、タイトルはまだ実装していません。また、タイトルの指定は普通のBASIC言語と同じように、特別設定しなくてもデフォルトの値が使われるようにしたいところです。

 しかし、そのためにはトークン分割で複数の引数を取れるようにする必要があります。ここでは引数をバッファを配列形式にすることで複数取得できるようにします。1つ目の引数は「バッファ¥0」、2つ目の引数は「バッファ¥1」、3つ目の引数は「バッファ¥2」……というようになります。

改行について
 以降、掲載しているプログラムコードでは1行に収まらなかった場合、改行記号を付加し改行していますが、実際は改行の無い1行のソースコードになります。ソースコードをコピーする場合は、ペーストしたソースコードから改行を取り除いて実行するようにしてください。
 
build.nako(太字が変更箇所)
もし、コマンドライン¥1が空ならば、
「ファイル名を指定してください」と表示。
終わる。
コマンドライン¥1を開く。
それを表示。

バッファは空。          //変数「空」の中身には何も入っていません
文字列中は、いいえ。    //現在の位置が文字列の中であるか
最新命令は、空。        //さっき指定されたばかりの命令
アセンブリは空。        //出力するアセンブリ
アセンブリデータは空。  //出力するアセンブリデータ
文字列数は0。           //文字列の数

コマンドライン¥1を開く。
それを文字列分解して、反復
        //このようにすれば文字列に変数を埋め込めます
もし、バッファが「print」ならば、
 最新命令はバッファ。
 バッファは空。
         //まだ他の場所にprintがあっても
         //「print(なんとか)print」などとなってしまい
         //検出できなくなる
違えば、もし、バッファが「msgbox」ならば、
 最新命令はバッファ。
 バッファは空。
違えば、もし、対象が「,」&&文字列中がいいえならば、
         //「&&」は「両方OKだったらOK」
  バッファは「{バッファ}{改行}」。
違えば、もし、対象が「"」ならば、
            //「"」は一般的な言語では文字列の最初を表す
 もし、文字列中がはいならば、
  文字列中は、いいえ。
  もし、最新命令が「print」ならば、
   アセンブリデータに「STR{文字列数} db "{バッファ}", 0」を配列追加。
   アセンブリに「invoke OutputString, offset STR{文字列数}」を
配列追加。
   文字列数は文字列数+1。
   バッファは空。
  違えば、もし、最新命令が「msgbox」ならば、
   アセンブリデータに「STR{文字列数} db "{バッファ¥0}", 0」
を配列追加。
   もし、バッファ¥1が空ならば、
    アセンブリに「invoke MessageBoxA, 0, offset STR{文字列数},
 offset STR{文字列数}, 0」を配列追加。
   違えば、
    アセンブリデータに「STR{文字列数+1} db "{バッファ¥1}",
 0」を配列追加。
    アセンブリに「invoke MessageBoxA, 0, offset STR{文字列数},
 offset STR{文字列数+1}, 0」を配列追加。
    文字列数は文字列数+1。    //文字列を1つ多く使ったので
   文字列数は文字列数+1。
   バッファは空。
 違えば、
  文字列中は、はい。
  バッファは空。    //文字列の最初についてしまう「"」対策
違えば、もし、対象が改行でなければ、
 バッファは「{バッファ}{対象}」。
         //上記以外の場合
         //printの後の半角スペースとかは
         //この行から5行上で対処してしまっています

「.586
.model flat, stdcall

include iolib.inc
includelib iolib.lib
include kernel32.inc
includelib kernel32.lib

.data
{アセンブリデータ}

.code
_start:
{アセンブリ}
invoke ExitProcess, 0
end _start
」を「{コマンドライン¥1}.asm」に保存。

 実装が終わったら、実行ファイル「build.exe」を作成し、「vefbl」フォルダ内に配置します(旧「build.exe」を上書きします)。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
メッセージボックスの実装 2

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
MASMとなでしこによるオリジナルコンパイラの制作連載記事一覧

もっと読む

この記事の著者

KMY(かみぃ)

とあるごく平凡な中学生。兵庫県在住。日本語プログラミング言語「なでしこ」に惹かれ、たくさんのプログラムを作り利用している。なでしこ以外にも、他の言語を心得ており、HTMLがなでしこの次に得意であり、Perlが第3位(かも)。ベクターにも多彩な作品を残している。作文がど苦手。KMYpage

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/996 2008/08/26 14:03

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング