Slide 1

Slide 1 text

TypeScript 小ネタ: 型のみで実装する正規表現エンジン n4mlz GitHub: https://github.com/n4mlz Twitter: https://twitter.com/n4mlz UNTIL. LT #0x07 2025-05-17

Slide 2

Slide 2 text

2 後で書く 自己紹介

Slide 3

Slide 3 text

3 TypeScript の型はチューリング完全 ⚫ 例: 数独チェッカー TypeScript の型 ⚫ 例: Brainfuck インタプリタ https://github.com/gruhn/typescript-sudoku/ https://github.com/susisu/typefuck

Slide 4

Slide 4 text

4 TypeScript の型はチューリング完全 TypeScript の型 うおお、俺もなんか作りてえ 正規表現エンジン作るぞ

Slide 5

Slide 5 text

5 TypeScript の型だけで正規表現エンジン作った ⚫ Regex により true または false に評価される 成果物

Slide 6

Slide 6 text

6 準備: 論理演算の定義 ⚫ 条件型 (Conditional Types) を使用して分岐を作る 型で正規表現エンジンを作る

Slide 7

Slide 7 text

7 準備: 文字列操作の定義 ⚫ テンプレートリテラル型 (Template Literal Types) を使用して 先頭文字の抽出、残りの文字の抽出、文字の結合を作る 型で正規表現エンジンを作る

Slide 8

Slide 8 text

8 1文字に対するマッチング ⚫ Pattern も Text も1文字であると仮定しているので、 ワイルドカード (.) のみ気にすればよい 型で正規表現エンジンを作る

Slide 9

Slide 9 text

9 ? や * を先頭に含む文字列に対応する ⚫ ? や * がマッチした場合、その後は自身を再帰的に適用することで 「文字列」に対応 型で正規表現エンジンを作る

Slide 10

Slide 10 text

10 文字の終端に対応する ⚫ ? や * を含む文字列を取りまとめ、 パターンの終端が $ であるかをチェックする 型で正規表現エンジンを作る

Slide 11

Slide 11 text

11 マッチングの開始点を作る ⚫ 先頭が ^ でない場合: ‹Pattern› と ^.*‹Pattern› が等価であること を利用し、任意の開始点からのマッチングに対応する (テク) ⚫ Regexp<“bc”, “abcd”> が true に評価されるようになる 型で正規表現エンジンを作る

Slide 12

Slide 12 text

12 完成 ⚫ 型のみで簡易的な正規表現エンジンを作ることができた 完成

Slide 13

Slide 13 text

13 最後に Gist に公開しています! 気になったら見ていってください https://gist.github.com/n4mlz 次はスタックマシンや一次元セルオートマトンを作りたい