突然だけど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 { ... }
第二引数に unicodeES5IdentifierStart
や unicodeES5IdentifierPart
を与え、第一引数に与えたコードポイントが含まれているかをチェックする。
含まれているかのチェック自体は素朴な二分探索法という感じ。2要素で1ペアとしその中に code
が含まれるか調べていく。
isUnicodeIdentifierStart
と isUnicodeIdentifierPart
は lookupInUnicodeMap
のwrapperである。さらにそれらのwrapperである isIdentifierStart
や isIdentifierPart
が存在する。 isIdentifier*
ではascii文字であるならば直ちに ture
を返すことになっている(ES5かES3か区別する必要ないからね)。
isIdentifier*
は今後いたるところで使われる。
感想
scannerはscannerだし読まなくて良い気がしてきた。
今日はここまで。