プログラミング言語をつくってみる


自作パーサジェネレータを使って、簡単な言語制作に入っています。

自作パーサジェネレータのトラブル

以下のような感じのルールを定義し、パーサジェネレータに入れてたところ、ちょっとしたトラブルに見舞われました。

問題は、

の順番です。このジェネレータでは、| の順に if 文にしていることと、使う字句解析がキーワードなど関係なく英数字の文字列は IDENTIFIER として認識していることで、declare_var の 1 トークン目の "var" というトークンを IDENTIFIER として先に認識してしまい、declare_var にうまく判断されませんでした。

もちろん、| declare_var ";" → | expr ";" の順にすれば問題なのですが、作っていくうちに不具合を多発しそうなため、修正しました。

EBNF 内で使用した文字列は KEYWORD として認識

EBNF からパーサを生成する際に、使用している記号を用いない文字列について、字句解析にキーワードに認識するように登録することにしました。あわせて、記号に該当する文字列も記号として認識するようにしました。これで、先のように順序の影響が少なくなったと思います。

キーワードもいちいち別に書いて ID 降ってというのも面倒だったため、これでほぼ文法定義のところだけに集中できるようになったと思います。

俺スクリプト第一弾

ということで、先の文法に bool 用のキーワードと、関数呼び出しっぽい文法を追加、ついでにうっかりブロックのあとに ; をつけても大丈夫なようにして、以下のようなプログラミング言語を作ってみようと思います。

この文法をジェネレータに入れ、以下のコードをパースしてみたところ、期待通りの動作をしてくれました。

とりあえず、print 関数を組み込みでやって、最低限動作するまでにしてみようと思います。