Writing a minimal Lua implementationをやる
パーサーを実装する練習になりそう
Rust 文法メモ
- expect
- panic した時に、エラーメッセージに情報を追加できる
- derive (継承)
- Into
- https://doc.rust-lang.org/std/convert/trait.Into.html
- Into<Param> : Param型に変換できる
- ちなみに、From トレイト (ある型から別の型への変換) 定義するとIntoも同時に定義される
Lexier の実装は終わった
一般的なToken kind (種類)
- identifier: names the programmer chooses
- keyword: names already in the programming language
- separator (also known as punctuators): punctuation characters and paired-delimiters
- operator: symbols that operate on arguments and produce results
- literal: numeric, logical, textual, reference literals
- comment: line, block (Depends on the compiler if compiler implements comments as tokens otherwise it will be stripped)
Lexier の実装は DONE
module の読み込み方わかんなくなったけど、チュートリアルにあった。
useとパスをスコープに追加することは、ファイルシステムにおいてシンボリックリンクを張ることに似ています。
parser までは、泥臭い実装だな〜というイメージで、特にわからなかったところとかはあまりない
Compileから難しくなった... そもそもアセンブリに近いところを知らないからなのかもしれない
Program counter
次に実行すべき命令が入っているアドレスを記憶する
Call stack
プログラムで実行中のサブルーチン (プログラム中で意味や内容がまとまっている作業をひとつの手続きとしたもの ≒ 関数) に関する情報を格納するスタックである
Stack pointer
スタックのデータ構造において、次に(一時的に)情報を置く番地を表す
Stack Frame
サブルーチン毎にコールスタックに格納する情報
一つの関数を呼び出すたびにスタックに積まれるデータのひとかたまり
Frame pointer
フレームポインタからスタックポインタの間のアドレスがスタックフレームとなるようにフレームポインタの間の値がセットされます
以下の関数呼び出しの内容がわかりやすい
一旦写経は終わった... いくつか間違っていて、やっぱり単体テスト書いとけばよかった... となった
Lexier のテストは書いたけど、データを準備するのが大変だから書くのをやめていた
スタックにデータを積んで、いい感じに処理しているのはわかった。関数の処理におけるポインタの挙動は、完全に理解できたわけではないけど、これは違う教材で補ったほうが良さそう。
ちなみに関数の処理は、スタックに呼ばれた時点の frame pointer, program counter, 引数の数, 変数と引数 (領域のみ) を作って処理していくイメージ。frame pointer, program counter は、関数が終わった時の元の処理に戻るために使う