minosys script を作ろう (4)
ここからは実装に入るので、言語実装にお決まりのパターンに入ります。
現在の実装は
https://github.com/minosys-jp/minosys-script.git
に置いてあります。(作成途中なので、まだコンパイルできません!)
Token の切り出し
まず、token をどういう単位にするか決めなくてはなりません。
構文解析のしやすさを考慮して、ここでは、以下のように
切り分けることにしました。
記号 | 意味 |
---|---|
LT_NULL | スクリプトの終端 |
LT_NL | セミコロン(文の終わり) |
LT_TAG | 予約語でない文字列 |
LT_INT | 整数 |
LT_DNUM | 浮動小数点数 |
LT_STRING | リテラル文字列 |
LT_BEGIN | 複文の開始 |
LT_BEND | 複文の終了 |
LT_OP | 演算子 |
LT_VAR | 変数 |
LT_FUNC | 関数呼び出し(lexでは使っていない) |
LT_FUNCDEF | 関数定義(lexでは使っていない) |
LT_HTML | HTML文書 |
LT_<予約語> | 指定された予約語に相当 |
現在の予約語は以下の通りです。
this, super, if, else, for, while, break, continue,
return, global, new, class, import
実装言語が C であれば flex を使って省力化することも可能ですが、
(っていうか、普通そうする)将来、他言語による実装も可能にする
ため、あえて C++ で実装してみました。
HTML モードと minosys script モードがあるので、state が若干
複雑です。
それ以外の実装は、教科書通りになっています。速度の遅さもそのまま。
次回は構文解析と解析木の作成について考えます。