読者です 読者をやめる 読者になる 読者になる

日経ソフトウエアの記事「スクリプト言語をゼロから作ろう」で解説されていた「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. 仮想マシンバイトコードを実行
生成されたバイトコードを実行する。今回の仮想マシンは「スタックマシン」という種類。JavaJVMもスタックマシン。

まとめ

みんなも言語処理系つくればいいと思うよ!