re_expand
やり方が汚い……
layout
generator.coffee
がentry point
main.coffee
はdemo用コード
実装
scanner
で字句解析し
これclassじゃなくて逐次解析のgeneratorでよくない?
たとえばこんな感じ
read.tsexport function* read(text: Iterable<string>) {
let escapeNext = false;
let plainText = "";
for (const chars of text) {
for (const char of chars) {
if (escapeNext) {
plainText += `\\${char}`;
escapeNext = false;
continue;
}
if (!"()|?+*\\".includes(char)){
plainText += char;
continue;
}
if (char === "\\") {
escapeNext = true;
continue;
}
yield plainText;
yield char;
plainText = "";
}
}
if (plainText !== "") yield plainText;
}
尤もちゃんと手を加えるなら、 regexp
と一体化させたほうがいいと思う
まず (
)
の対応だけ一度に調べる
エスケープされていない括弧で全部分割する
.split(/(?<!\\)(\(|\))/)
を使う
てことはこの正規表現使えないじゃん!
対応関係にない括弧はエスケープされているものと見なす
エラーにしたほうがいいかな?
そっちのほうがいいか
構文を正すよう促せる

ここは逐次解析がむずかしそうなので、文字列全体を正規表現で分割させている
括弧で入れ子の構造を作った後、括弧以外の箇所をそれぞれ記号と文字列に分ける
type Token = "|" | "+" | "*" | "?" | string | Token[]
配列を括弧と見なす
この情報を逐次NFA変換器に渡す
regexp
で正規表現のNFAを生成
generator
でNFAを木構造に展開しながら
asearchで曖昧検索をかける
一回の検索ごとにNFAを構築しているからやや効率が悪い
ここの実装は変えたいな
ファイル名とかは実行時にGlossaryとして追加しているのか。なるほど~

2022-01-12
まだ Generator
と RegExpParser
のテストが途中
それ以外のテストは作って通した
どこかミスっているっぽい
Generator
の出力がおかしい
状態遷移機械を外から取り出せるように改造する必要があったので
[]
をパースしていないがいいのだろうか?