ちいさなWebブラウザを作ってみようをやってみる
htmlのパースを書くが、その前に使うライブラリである combine を勉強
パーサーにはいくつかの大きな分類があるらしい
- top down parser
- 解析木の根から葉へと導出を繰り返す
- 出現するtokenと構文規則を元に何を解析するのか予想しながら下へ進む
- LL(k)は、k個先のトークンの先読みをしながらパースする方法
- バックトラッキングと呼ばれる処理のやり直しの必要がなくなる
- 人の手で書きやすい
- bottom up parser
- 解析木の葉から根へと導出を繰り返す
- LR 法などが有名
- 人の手で書くのは難しく、パーサージェネレーターなどで生成する
詳しくは文脈自由文法とかから勉強した方が良さそう。
文脈自由文法の定義は以下がわかりやすい
文脈自由文法の中でも特に(決定性)有限オートマトンを記述するできるものが正則文法と呼ばれる。正規表現も、正則文法の1つである。
有限オートマトンには、決定性と非決定性がある。決定性オートマトンは、状態遷移図のたどり方が必ず1本道で、状態と入力によって次に遷移すべき状態が一意に定まるもの。(非決定性はそれ以外)
正規 (正則) 文法、文脈自由文法、文脈依存文法は「チョムスキー階層」として分類される。
正規文法に近づくほど、生成規則の制約が強くなる
ここら辺は、オートマトンとも絡んできて一からちゃんと勉強しないと無理そう...
CS143: Compiler の講義はここ
CSS combinator、ちゃんと知らなかった
Rust の From と Into について
オートボクシング
プリミティブ型をラッパークラスへの自動変換すること。js primer にも紹介されている。
const str = "string";
// プリミティブ型の値に対してメソッド呼び出しを行う
str.toUpperCase();
// `str`へアクセスする際に"string"がラッパーオブジェクトへ変換され、
// ラッパーオブジェクトはStringのインスタンスなのでメソッドを呼び出せる
// つまり、上のコードは下のコードと同じ意味である
(new String(str)).toUpperCase();
Rust では上記のような暗黙的な型変換を行わない (From を定義して明示する) ことで、メモリ管理のコストや実行時の型変換がなくなり実行速度のアドバンテージを得ている。
CSSのボックスモデル
inline/block の違いをちゃんと理解できた気がする。特に以下の違いは覚えておきたい。
inline directon/block directionとは水平/垂直方向のことを指す。
- inline
- width/height 尊重されない
- 改行が入らない
- block
- width/height 尊重される
- 改行が入る
- inline-block
- width/height 尊重される
- 改行が入らない
margin/padding の実装はやってみようかな
Rust の内部可変性についておさらい
参照についてもおさらい
JSの部分についてもおおよそ終わった。コードを clone してきたら、すでに実装済だったので基本はコードを読んだだけ。読むだけでも、半分くらいしか理解できていない。v8 の組み込みや rust 上での dom 表現とv8 でのdom表現の binding のところはかなり難しかった。
margin/padding の実装は、LayoutBox に margin/padding を持たせてそれを render に渡す
render としては PaddedView があったのでそれを使った