これまでに、ウィンドウ内に存在するモノをEvaと呼び、その存在と動作を記述するスクリプト言語をA言語と呼ぼうという話までしました。ということは、それを開くコードが必要です。まず、ファイルメニューに「開く」コマンドを追加します。
ちなみに、ここの設定は次のようにします。
メニューのコマンドを処理するには次のようにします。
ここでIDM_OPENなんか知らないよというエラーが表示されますが、これはVisual C++のバグだと思います。ビルドすると正常に作成されますが、うっとうしいようであれば、resource.hを読み込んで#define IDM_OPENの行をコピペすれば消えるので、また消しておきます。
ともかく、メニューが正常に動くことを確認するためにメッセージボックスを表示します。次のようになります。
それでは、ファイル読み込みの実体を作りこんでいきます。
Windowsに標準で用意されている機能を使います。ヘッダーに次のようなインクルードを入れないとエラーが出ます。
それでは処理の中身です。まずファイル名を取得する部分です。
ファイル名の取得は次のような感じです。
中身を読みだす部分は次のようになります。文字コードがUTF16LTのBOM付ですので、最初のワードはBOM=Byte Order MarkerであるFFFEとなっていますので、読み飛ばします。
ここでは読みだした中身をタイトルバーに表示します。右側はメモ帳です。ファイルを保存するときに文字コードをUTF16LEにします。
このあとは、読みだしたA言語のスクリプトをコンパイルして実行するということになります。
コンピュータサイエンスの基礎となる形式言語学にはチョムスキーとチューリングの流れがあります。チョムスキーの正規表現と文脈自由文法、チューリングのオートマトンとスタック付きオートマトンはそれぞれ等価であることが証明されています。基本的に定義はチョムスキーで、処理はチューリングという感じです。
ちなみに形式言語学は言語理論の骨格をなすものです。意味論と形式論は肉と骨の関係です。骨なしでは立つことも歩くこともできませんが、食べつくされた後に捨てられるのが骨です。
それではA言語の文法を決めてコンパイラを作成します。チョムスキーの標準理論に従って、字句解析・構文解析・意味理解の三段階とします。まあ、すっきりとは切り分けできませんけどね。
まず例文として Text("hello world") { Locate(100,100) } を取り上げます。A言語では基本単位となる文(statement)をキーワード[ラベル](パラメータ){コンテンツ}とします。コンテンツの中には複数の文が含まれることがあります。またいくつかの要素が省略されることもあります。とりあえず上の例文を字句解析すると次のようになります。
Text : キーワード T_TEXT
{ : 左カッコ T_IN
"hello world" : 文字列 T_STR
) : 右カッコ T_OUT
{ : 左ブレイス T_BEGIN
Locate : キーワード T_LOCATE
( : 左カッコ : T_IN
100 : 数値(100) T_NUM
, : コンマ T_COMMA
100 : 数値(100) T_NUM
) : 右カッコ T_OUT
} : 右ブレイス T_END
とりあえず字句解析の結果であるトークン(token)の種類としては、T_ERROR, T_EOF, T_NUM, T_VAL, T_STR, T_LABEL, T_IN, T_OUT, T_BEGIN, T_END, T_COMMA, T_TEXT, T_LOCATE, T_CLICK, T_SET, T_ON, T_OFF などを考えます。
では、なぜA言語なのか。A列車と同様に、それが近道だぜという話です。WinAPIでは、WM_なんとかに振り回されることになりますが、A言語ならやりたいことを書くことが主体的にできることと、そもそもWindowsというプラットフォームに依存してはいないという点がメリットとなると思っています。
それでは、実際のコードを作成していきます。ということで工事中になります。まあ、完成しても前に見せたものと同じ結果が得られるだけですけどね。ただ、この先の発展性が違うと思います。