山村久幸

北の大都会に住まうプログラム書き、たまに小説書き。

山村久幸

北の大都会に住まうプログラム書き、たまに小説書き。

最近の記事

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

構文解析にあたってどういう方針で進めるか  字句解析においては、がっつりとパターンを揃えて実装を進めていきました。  構文解析にあたっては、いくつかのトークンの種類に絞って、構文解析、MLIRの生成、MLIRのコンパイルまで進めようかと思います。  インタプリタも同時に開発できれば、なお良しです。 字句解析処理に若干修正が必要そう  字句解析で識別子から組み込み型や予約語への変換をしていましたが、構文解析処理で変換処理を行わせることにします。  それと、インタプリタの

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

      字句解析の実装が完了文字型、文字列型、正規表現パターン型について  文字型はシングルクォート、文字列型はダブルクォート、正規表現パターン型はバッククォートで囲むようにしました。  エスケープシーケンスの扱いについて、以下にまとめます。  字句解析の段階でエスケープ文字(バックスラッシュ)のあとに何が来るかを判定する対象は絞っています。 '\'のあとに改行が続く場合の扱いとして、'\'はトークンに読みません。改行もトークンに読みません。つまりは継続行扱いとなります。 "\

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

        文字コード解析についてUTF-8もサポート対象に  コメントとか出力文字について、日本語などのマルチバイト文字を表示させたいので、UTF-8についてもサポートするようにします。  UTF-8は1バイトから4バイトの長さでエンコードされています。  あらためて、ざっくりとUTF-8についておさらいしますと?  1バイト文字(UnicodeコードポイントU+0000からU+007F)は該当の文字の最上位ビットが0となってます。0x00から0x7fの範囲に収まっています。  

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

          型、演算子、括弧の字句解析が整った型はとりあえず64ビットまで  gallopで使う型はとりあえずは64ビットまでを用意しました。  それ以上のサイズはセルフホスティングができたときにでも。  i32ならば32ビット符号付き整数、u32ならば32ビット符号無し整数です。 演算子もとりあえずは揃えた  zigとかで使われている演算子も含めて解析できるようにはしました。 括弧もとりあえずは揃えた  括弧類も字句解析できるようにはしました。  gallopでは1文字はシン

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

          数値リテラルの字句解析が整った不正なトークンの扱い  ひとまず、前回の最後に出てきた不正な文字を認識した場合の扱いについて触れます。  まず、トークン情報でトークン種別の枝番を採用しました。  10進数値についてはそもそも整数、小数、指数付きの整数、指数付きの小数がありますし、不正なトークンについても不正種別が色々とあることが想定されます。  ですので、トークン種別に枝番を設けることにしました。  不正トークンであることを返すタイミングは不正な文字を検知した、もしくは不完

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

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

          字句解析をするための最後の準備字句解析するにも、まずは標準入力から文字を受け付けるところから  エンコーディングの判定までできたので、字句解析の準備はあと一歩です。  字句解析をするにも標準入力やファイルから文字列を読み込むことから始めなければなりません。  なのでmain処理が必要になります。 main関数は移譲したい  main関数の実処理は別ファイルに書きます。  別ファイルに書く理由としては、そのmain処理に対しテストもできるかも? といった目論見からです。

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

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

          文字コードといっても色々あるけれど?とりあえず、サポートしたいもの……  最低限、ASCIIとUTF-8、UTF-16、UTF-32はサポートしたいです。 それとできればShift-JIS、EUC-JPもサポートできるならしたいです。  ですが、C++によるコンパイラ実装の段階ではASCIIのみサポートする形とします。  ASCIIの文字コードはgallop言語でセルフホスティングコンパイラができたタイミングでサポートすることとしましょう。 まずは手っ取り早く検知できる

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

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

          ビルドについてビルドするならCmakeだね  CMakeでビルドするのが主流ですね。なので、踏襲しましょう。 CMakeLists.txtに書くべきこと  具体的なファイル内容の記述は省くとして、やるべきことだけ列挙しましょうか。 必要なライブラリ群のパスの設定  CLang、LLVM、GoogleTestに関連するコマンド、ライブラリ群、ヘッダファイルのインクルードパスを特定して、変数に設定しましょう。 静的ライブラリのビルドの設定  src/lib配下のソースか

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

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

          コンパイラを作るにあたって新しい言語gallopのソースコードの拡張子について  trotにしましょう。  理由? そもそもgallopって馬の走法の名前なんですよ。競馬場で走っている馬の速さ。それがギャロップなんです。  で、その速さよりちょっと遅いのがトロット。というわけで、ギャロップの一歩手前となる→gallopでビルドされる前の段階→trot。  こんな感じで決まりました。 ディレクトリ構成 .├── CMakeLists.txt├── bin│   └── g

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

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

          続きに手を付ける前に……LLVMをhomebrew版からmacports版に  思うところあって、自分のパッケージ構成管理をhomebrewからMacPortsに変えてみました。  MacPortsのLLVM、LLVMのコア部分とClang部分は別パッケージ扱いのようです。 $ sudo port install llvm-19 mlir-19 clang-19$ sudo port select --set llvm mp-llvm-19$ sudo port sel

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

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

          しょぼいしょぼいっていうけど、どんだけ? 機種名: MacBook Pro 機種ID: MacBookPro11,1 プロセッサ名: デュアルコアIntel Core i5 プロセッサ速度: 2.6 GHz プロセッサの個数: 1 コアの総数: 2 二次キャッシュ(コア単位): 256 KB 三次キャッシュ: 3 MB ハイパー・スレッディング・テクノロジ: 有効 メモリ: 8 GB随分としょぼいマシンである。ちょっとこれで自作プログラミング言語を作ってみ

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