正規表現に明示的な連接演算子を追加する
https://swtch.com/~rsc/regexp/regexp1.html を読んで、トンプソンの構成法を実装している
記事では後置表記の正規表現からNFAを生成する
. を連接の演算子として利用した後置表現
中置から後置への変換を行うために、もとの正規表現の連接部分に中置の.を追加したい
やることは簡単で、リテラルが2文字続いたら間に.を挟むだけ
ちなみに、入力でメタ文字として扱うのは (, ), |, ?, * ,(.)だけ
以下はRustでの実装
code:rs
// トークン列を受け取り、連接の演算子として明示的に.を利用するトークン列を返す
// e.g. abc|aa => a.b.c|a.a
pub fn regex_to_infix(tokens: &Vec<char>) -> Vec<char> {
let mut v = Vec::new();
let mut literal_is_detected = false;
for t in tokens.iter() {
match t {
c @ ('(' | ')' | '|' | '?' | '+' | '*') => {
v.push(*c);
literal_is_detected = false;
}
c @ _ => {
if literal_is_detected {
v.push('.');
}
v.push(*c);
literal_is_detected = true;
}
}
}
v
}
https://github.com/lemonadern/thompson-construction/blob/master/src/expression_conversion.rs#L52toL74