re_expand
やり方が汚い……
layout
generator.coffeeがentry point
main.coffeeはdemo用コード
実装
scannerで字句解析し
これclassじゃなくて逐次解析のgeneratorでよくない?
たとえばこんな感じ
code: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.icon
ここは逐次解析がむずかしそうなので、文字列全体を正規表現で分割させている
括弧で入れ子の構造を作った後、括弧以外の箇所をそれぞれ記号と文字列に分ける
type Token = "|" | "+" | "*" | "?" | string | Token[]
配列を括弧と見なす
この情報を逐次NFA変換器に渡す
regexpで正規表現のNFAを生成
generatorでNFAを木構造に展開しながらasearchで曖昧検索をかける 一回の検索ごとにNFAを構築しているからやや効率が悪い
ここの実装は変えたいな
ファイル名とかは実行時にGlossaryとして追加しているのか。なるほど~takker.icon
2022-01-12
まだGeneratorとRegExpParserのテストが途中
それ以外のテストは作って通した
どこかミスっているっぽい
Generatorの出力がおかしい
状態遷移機械を外から取り出せるように改造する必要があったので
[]をパースしていないがいいのだろうか?