Schemeの数値リテラルにマッチする正規表現(6)
部分式呼び出しを使って短くしてみた.一度treeを作ってから再帰的に正規表現を構成する戦略.
naiveな実装で1124bytes,頑張って探索して11141110bytes.名前付きグループがあると括弧の意味が変わる問題がなければ909bytes(Gオプションが使えれば910bytes.現状テストできないけど).ただのgroupingが伸びるから1kくらいかも.
(24:50)部分式呼び出ししないのに名前が付いてる所が4ヶ所あったので,それを縮めて1082bytes.
/((((#(?<r>b)(?<_h>(#(?<e>[ei]))?))|(\g<_h>#(?<r>b)))(((?<_0>[+-]?(?<_1>(([01]+# *)|((?<a>[01]+#*)(?<t>\/)(?<b>[01]+#*))))))|((?<a>\g<_0>)(?<t>@)(?<b>\g<_0>))|(( ?<a>\g<_0>)(?<s>[+-])(?<b>\g<_1>)?(?<t>i))|((?<s>[+-])(?<b>\g<_1>)?(?<t>i))))|(( (#(?<r>o)\g<_h>)|(\g<_h>#(?<r>o)))(((?<_3>[+-]?(?<_4>(([0-7]+#*)|((?<a>[0-7]+#*) (?<t>\/)(?<b>[0-7]+#*))))))|((?<a>\g<_3>)(?<t>@)(?<b>\g<_3>))|((?<a>\g<_3>)(?<s> [+-])(?<b>\g<_4>)?(?<t>i))|((?<s>[+-])(?<b>\g<_4>)?(?<t>i))))|((((#(?<r>d))?\g<_ h>)|(\g<_h>(#(?<r>d))?))(((?<n>[+-]?(?<_7>(([0-9]+#*)|(((?<a>[0-9]+#*)(?<t>\/)(? <b>[0-9]+#*)))|(?<f>(((?<_a>[0-9]+#*(?<_i>([esfdl](?<p>[+-]?[0-9]+))?)))|((?<_b> \.[0-9]+#*\g<_i>))|((?<_c>[0-9]+\.[0-9]*#*\g<_i>))|((?<_d>[0-9]+#+\.#*\g<_i>)))) ))))|((?<a>\g<n>)(?<t>@)(?<b>\g<n>))|((?<a>\g<n>)(?<s>[+-])(?<b>\g<_7>)?(?<t>i)) |((?<s>[+-])(?<b>\g<_7>)?(?<t>i))))|(((#(?<r>x)\g<_h>)|(\g<_h>#(?<r>x)))(((?<_e> [+-]?(?<_f>((\h+#*)|((?<a>\h+#*)(?<t>\/)(?<b>\h+#*))))))|((?<a>\g<_e>)(?<t>@)(?< b>\g<_e>))|((?<a>\g<_e>)(?<s>[+-])(?<b>\g<_f>)?(?<t>i))|((?<s>[+-])(?<b>\g<_f>)? (?<t>i)))))(?<_g>(?=[\t-\r "();\[\]{-}]|\z))/i