何を思ったのかScratchでプログラミング言語を作ろうと思ったけど、難しすぎて計算機で挫折しました。(普段は主にC++でプログラミング言語を作っています)
インタプリタの仕組み
プログラム
字句解析器(Lexer)
字句解析器は、式をTokenと呼ばれる最も小さな要素に分割します。(日本語の文章を単語で分けるイメージ)
構文解析
構文解析器は、字句解析器で生成したtokenの列につながりを持たせます。
そして、演算子の順番を考慮するために、それぞれの優先度ごとに関数を作ります。優先度の低い演算子の関数(例えば = の関数)からはそれよりも優先度の高い演算子の関数を呼びます(例えば +,- の関数)。そして、最も優先度の高い演算子の関数は、要素(例えば 3,a,(3 + 5) など)を表す関数(factor)を呼びます。
この計算機だと、演算子の順位は下の表のようになります。
演算子の名前 | 演算子 |
---|---|
冪乗 | ^ |
掛け算・割り算・余り | *, /, % |
足し算・引き算 | +, - |
比較演算子 | ==, !=, >, < |
論理演算子 | &, |, ! |
代入演算子 | = |
要素(factor)
冪乗
四則演算 余り
比較演算子・論理演算子・代入
四則演算と同じような感じで定義しました
インタプリタ
インタプリタは、構文木を上から辿っていくことで計算していきます。
困った点・工夫した点
関数の戻り値
構文解析は基本再帰で行うのですが、Scratchの関数(どちらかというとサブルーチン)は戻り値を返すことができないので、苦労しました。結局、実際の機械語の関数呼び出しの仕組みを参考にして、戻り値を格納するリストを作り、そこでPushとPopを繰り返すことで実現しました。
オブジェクト
Scratchはオブジェクト指向言語では(多分)ないので、こちらも要素を表すためにメモリーという名前のリストを作り、オブジェクトを表すときはその番号を示すことで実現しました。
結論
Scratchはめんどくさい!
少なくともプログラミング言語を作るときはScratchではない言語で作った方がいいと思います。
ただ、関数やオブジェクトもがんばれがスクラッチで作れることがわかりました。