角待ちは対空

おもむろガウェイン

Typescriptのコードを読む #1

突然だけどTypescriptのコードを読んでいくことにする。特に目的はない、のでどこから読んでいいかわからないけど、scannerからいく。そして、scanner自体もそこそこあるし、疲れるので、大体関数1個ずつくらいのペースで行くのではないか。飽きたらやめる。

lookupInUnicodeMap

TypeScript/scanner.ts at 3cd9f3d2d4afc1c817ea53b3e40d9598197e9aaa · Microsoft/TypeScript · GitHub

ES3以前とES5移行で識別子に使えるコードポイントが違うので使える文字であるのかチェックするのがlookupInUnicodeMapである。

識別子に使える文字も最初に使えるコードポイントとそれ移行に使えるコードポイントは違うため

  • unicodeES5IdentifierStart
  • unicodeES5IdentifierPart

のように2つの定数が定義されている。(もちろんES3版もある)

この配列の見方は、たとえば [2, 2, 4, 6] のようになっていれば2〜2と4〜6、つまり2、4、5、6が含まれるということである。

Goで正規表現のバイトコードを見たときもこういう感じの表現の仕方をしていたのでこれがセオリーっぽい。

function lookupInUnicodeMap(code: number, map: number[]): boolean {
    ...
}

第二引数に unicodeES5IdentifierStartunicodeES5IdentifierPart を与え、第一引数に与えたコードポイントが含まれているかをチェックする。

含まれているかのチェック自体は素朴な二分探索法という感じ。2要素で1ペアとしその中に code が含まれるか調べていく。

isUnicodeIdentifierStartisUnicodeIdentifierPartlookupInUnicodeMap のwrapperである。さらにそれらのwrapperである isIdentifierStartisIdentifierPart が存在する。 isIdentifier* ではascii文字であるならば直ちに ture を返すことになっている(ES5かES3か区別する必要ないからね)。

isIdentifier* は今後いたるところで使われる。

感想

scannerはscannerだし読まなくて良い気がしてきた。

今日はここまで。