generated at
re_expand
ExpandHelpCoffeeScriptによる実装
prototype汚染を使っている
やり方が汚い……

layout
generator.coffee がentry point
main.coffee はdemo用コード

実装
scanner で字句解析し
これclassじゃなくて逐次解析のgeneratorでよくない?
たとえばこんな感じ
read.ts
export 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(/(?<!\\)(\(|\))/) を使う
まじか後読み (正規表現)だめなのか
てことはこの正規表現使えないじゃん!
対応関係にない括弧はエスケープされているものと見なす
エラーにしたほうがいいかな?
そっちのほうがいいか
構文を正すよう促せるtakker
ここは逐次解析がむずかしそうなので、文字列全体を正規表現で分割させている
括弧で入れ子の構造を作った後、括弧以外の箇所をそれぞれ記号と文字列に分ける
type Token = "|" | "+" | "*" | "?" | string | Token[]
配列を括弧と見なす
この情報を逐次NFA変換器に渡す
regexp で正規表現のNFAを生成
generator でNFAを木構造に展開しながらasearchで曖昧検索をかける
一回の検索ごとにNFAを構築しているからやや効率が悪い
ここの実装は変えたいな
ファイル名とかは実行時にGlossaryとして追加しているのか。なるほど~takker

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

#2022-02-03 07:17:10
#2022-02-01 06:40:45
#2022-01-31 06:48:50
#2022-01-10 22:47:27