しょぼいマシンで自作プログラミング言語を作ってみる (11)
構文解析にあたって
どういう方針で進めるか
字句解析においては、がっつりとパターンを揃えて実装を進めていきました。
構文解析にあたっては、いくつかのトークンの種類に絞って、構文解析、MLIRの生成、MLIRのコンパイルまで進めようかと思います。
インタプリタも同時に開発できれば、なお良しです。
字句解析処理に若干修正が必要そう
字句解析で識別子から組み込み型や予約語への変換をしていましたが、構文解析処理で変換処理を行わせることにします。
それと、インタプリタの実装を考えるならば、文字種トークン、文字列トークン、正規表現パターントークン、ブロックコメントトークンの字句解析中の場合は構文解析を行わせないようにする必要があります。
ですので、字句解析側で構文解析可能なトークン数を保持しておきましょうか。構文解析側で位置情報を保持しておけば、逐次処理ができそうな気がします。
インタプリタにおいては構文解析中にエラーが発生した場合にどうするか?
その振る舞いが重要になるかとおもいます。正しく構文解析できていた位置までデータを戻して、再入力させれば問題ないかな?
そう思うので、そうなるような方向で実装しましょうか。
まずはどのような文を構文解析して実行できるようにするか
とりあえず、以下のような文を構文解析して実行できるところまでいけたら嬉しいですね。
fmain {
"two white horse is galloping!".echo();
exit(0);
}
いわゆる、"Hello! world!"的な構文です。
fmainブロックはgallop言語特有の構文ですね。いわゆる、他の言語でいうところのmain関数です。
fmainブロックですが、以下のような構文も可能とできたらいいでしょうかね?
fmain gallopping{
"two white horse is galloping!".echo();
exit(0);
}
複数のエントリポイントを用意して、コンパイル時にエントリポイントと実行ファイルのマッピングをすれば、対応するエントリポイントからのコンパイルができるようになる仕組みもいいかもしれません。
ということで、まずはhello worldできるようにします。