Closed11

ちいさなWebブラウザを作ってみようをやってみる

nissy-devnissy-dev

htmlのパースを書くが、その前に使うライブラリである combine を勉強

https://docs.rs/combine/4.6.0/combine/
https://qnighy.hatenablog.com/entry/2017/02/19/220338

パーサーにはいくつかの大きな分類があるらしい

  • top down parser
    • 解析木の根から葉へと導出を繰り返す
    • 出現するtokenと構文規則を元に何を解析するのか予想しながら下へ進む
    • LL(k)は、k個先のトークンの先読みをしながらパースする方法
      • バックトラッキングと呼ばれる処理のやり直しの必要がなくなる
    • 人の手で書きやすい
  • bottom up parser
    • 解析木の葉から根へと導出を繰り返す
    • LR 法などが有名
    • 人の手で書くのは難しく、パーサージェネレーターなどで生成する

詳しくは文脈自由文法とかから勉強した方が良さそう。

nissy-devnissy-dev

文脈自由文法の定義は以下がわかりやすい
文脈自由文法の中でも特に(決定性)有限オートマトンを記述するできるものが正則文法と呼ばれる。正規表現も、正則文法の1つである。
https://www.momoyama-usagi.com/entry/info-automaton07

有限オートマトンには、決定性と非決定性がある。決定性オートマトンは、状態遷移図のたどり方が必ず1本道で、状態と入力によって次に遷移すべき状態が一意に定まるもの。(非決定性はそれ以外)
https://www.momoyama-usagi.com/entry/info-automaton02

nissy-devnissy-dev

Rust の From と Into について

https://qiita.com/hadashiA/items/d0c34a4ba74564337d2f

https://doc.rust-lang.org/stable/rust-by-example/conversion/from_into.html

オートボクシング

プリミティブ型をラッパークラスへの自動変換すること。js primer にも紹介されている。

const str = "string";
// プリミティブ型の値に対してメソッド呼び出しを行う
str.toUpperCase();
// `str`へアクセスする際に"string"がラッパーオブジェクトへ変換され、
// ラッパーオブジェクトはStringのインスタンスなのでメソッドを呼び出せる
// つまり、上のコードは下のコードと同じ意味である
(new String(str)).toUpperCase();

https://jsprimer.net/basic/wrapper-object/

Rust では上記のような暗黙的な型変換を行わない (From を定義して明示する) ことで、メモリ管理のコストや実行時の型変換がなくなり実行速度のアドバンテージを得ている。

nissy-devnissy-dev

CSSのボックスモデル

https://developer.mozilla.org/ja/docs/Learn/CSS/Building_blocks/The_box_model

inline/block の違いをちゃんと理解できた気がする。特に以下の違いは覚えておきたい。
inline directon/block directionとは水平/垂直方向のことを指す。

  • inline
    • width/height 尊重されない
    • 改行が入らない
  • block
    • width/height 尊重される
    • 改行が入る
  • inline-block
    • width/height 尊重される
    • 改行が入らない
nissy-devnissy-dev

JSの部分についてもおおよそ終わった。コードを clone してきたら、すでに実装済だったので基本はコードを読んだだけ。読むだけでも、半分くらいしか理解できていない。v8 の組み込みや rust 上での dom 表現とv8 でのdom表現の binding のところはかなり難しかった。

このスクラップは2022/05/15にクローズされました