しょぼいマシンで自作プログラミング言語を作ってみる (8)

型、演算子、括弧の字句解析が整った

型はとりあえず64ビットまで

 gallopで使う型はとりあえずは64ビットまでを用意しました。
 それ以上のサイズはセルフホスティングができたときにでも。
 i32ならば32ビット符号付き整数、u32ならば32ビット符号無し整数です。

演算子もとりあえずは揃えた

 zigとかで使われている演算子も含めて解析できるようにはしました。

括弧もとりあえずは揃えた

 括弧類も字句解析できるようにはしました。
 gallopでは1文字はシングルクォート(0x27)で、文字列はダブルクォート(0x22)で囲むよう規定します。
 それとバッククォート(0x60)は正規表現用にしようかと思います。

 文字列の複数行はどうしましょうかね?
 goだとバッククォートで複数行サポートされています。
 rustではダブルクォートでサポートされているのですか。でもって、改行前にバックスラッシュ(0x5c)をつけることで改行されないようにしていると……。
 rust方式を採用します。

っと、ここでちょっとパフォーマンス・チューニング。

 テストを実行していて、パフォーマンスが少し気になりました。特に演算子のトークン化で時間がかかっているのが気になりました。1つ処理するだけで100ミリ秒はちょっと時間がかかりすぎです。
 実用性に耐えうるものではないので、高速化することを試みます。
 std::vector<char>で文字列を走査していたのですが、どうにも遅いなと思ったので、std::stringからc_str()で取得したポインタを使います。
 で、ポインタ操作でアクセスすることでかなりの速度改善が見込める予定ですが……。

 演算子のトークン化では4パターン実行するだけで遅くて1秒、平均で0.8秒かかっていたのに、改善するだけで60パターン流しても2ミリ秒……。随分と高速化しましたね。劇的な速度改善です。

 今回はかなり短いですが、ここまでです。
 次回はコメントの字句解析、文字型、文字列型の字句解析に取り掛かります。

いいなと思ったら応援しよう!