日経ソフトウエアの記事「スクリプト言語をゼロから作ろう」で解説されていた「MIL」という言語の処理系をつくってみました
概要
MILという言語の処理系をActionScriptで作ってみた。
ソースコードはGitHubに→ http://github.com/ser1zw/MIL
MILとは
日経ソフトウエア2010年8月号の記事「スクリプト言語をゼロから作ろう」のために作られたスクリプト言語。オリジナルのコードはC言語で900行。
http://itpro.nikkeibp.co.jp/article/MAG/20091120/340842/?ST=nsw#201008
- MILの仕様
- 使用できるデータ型: 整数型と文字列型のみ
- 制御構造: if文, if-else文, while文, goto文, gosub-return文
- goto, gosubのラベルには「*」をつける
- if文, if-else文, while文は{ }を省略できない
- 出力: print文
- 1行コメント: #から行末までコメント
- その他: 文の最後はセミコロン「;」が必要
- サンプルコード
# フィボナッチ数列を表示 f0 = 0; f1 = 1; f2 = 0; print(f1); while (1) { f2 = f1 + f0; if (f2 > 100) { goto *end; } print(f2); f0 = f1; f1 = f2; } *end
おおざっぱな解説
全体の流れは
ソースコードを字句解析→構文解析+バイトコード生成→仮想マシンでバイトコードを実行
という感じ。詳しくは日経ソフトウエアの記事を読んでね。
1. 字句解析
ソースコードをトークンという単位に分割する。
たとえば、
a = 10 + 20;
なら、それぞれの役割ごとに
「a」「=」「10」「+」「20」「;」
という6つの部分(トークン)に区切る。
これを行うのをレキシカルアナライザという。
2. 構文解析
字句解析の結果を見て、何をどんな順番で計算すればいいのかを解釈する。
たとえば、
a = 10 + 20;
なら「10 + 20を計算し、その結果を変数aに代入する」
みたいな感じ。
これをやるのをパーサという。
3. バイトコード生成
構文解析の結果から、仮想マシンで実行するバイトコードを生成する。
※実用的な言語では構文解析して解析木を作り、最適化後にバイトコードを生成するらしい。しかし、今回は単純化のため、解析木なしでパーサが直接バイトコードを生成する。
4. 仮想マシンでバイトコードを実行
生成されたバイトコードを実行する。今回の仮想マシンは「スタックマシン」という種類。JavaのJVMもスタックマシン。
まとめ
みんなも言語処理系つくればいいと思うよ!