鬼車

Schemeの数値リテラルにマッチする正規表現(6)

部分式呼び出しを使って短くしてみた.一度treeを作ってから再帰的に正規表現を構成する戦略. naiveな実装で1124bytes,頑張って探索して11141110bytes.名前付きグループがあると括弧の意味が変わる問題がなければ909bytes(Gオプションが使えれば910bytes…

名前付きグループがあると括弧の意味が変わる

この前から気になってたんだけど,名前参照と番号参照を同時にしたくて困った. http://www.geocities.jp/kosako3/oniguruma/doc/RE.ja.txt 名前付きキャプチャがあるかないかで()の意味が変わってしまう.今,プログラムで正規表現を生成してて,人間が付け…

Schemeの数値リテラルにマッチする正規表現(5)

昨日までの正規表現にバグがあった. /\.#{digit}+#+\.#*#{suffix}/ は /#{digit}+#+\.#*#{suffix}/ が正解.短い方は1957bytesに,長い方は2793bytesになった.

Schemeの数値リテラルにマッチする正規表現(4)

鬼車の,名前付きキャプチャがあると()がキャプチャしなくなるのを利用して1969bytes.これ以上は部分式呼び出しを使わないと大幅な削減は厳しそう. いろいろキャプチャするバージョンは3061bytesになった.強欲マッチを止めれば2805bytes. 部分式呼び出し…

Schemeの数値リテラルにマッチする正規表現(3)

テストの仕方に問題があって,ある文字列にきっちりマッチするかどうかで確かめてたんだけど,トークンとして抜き出してくるにはそれでは不適切なことがわかった.そこで肯定先読みを使って,区切り文字が続いてるかどうかを調べるようにした. それから,問…

Schemeの数値リテラルにマッチする正規表現(2)

短くしてたんだけど,\dが使えない所為で1割伸びた.2217bytes. /(?:(?:#b(?:#[ei])?|(?:#[ei])?#b)(?:(?:[+-]?(?:(?:[01]+#*)|(?:[01]+#*\/[01]+#*)) )|(?:[+-]?(?:(?:[01]+#*)|(?:[01]+#*\/[01]+#*))@[+-]?(?:(?:[01]+#*)|(?:[01]+#*\/[ 01]+#*)))|(?:[+-…

UTF8で\dが全角数字にマッチ

irb:0> /\d/ =~ "5" => 0 irb:0> /\d/.encoding => #<Encoding:US-ASCII> irb:0> /\d/n.encoding => #<Encoding:US-ASCII> irb:0> re = Regexp.new(/\d/.source.force_encoding(Encoding::ASCII_8BIT)) => /\d/ irb:0> re.encoding => #<Encoding:US-ASCII>ぎゃーす. irb:0> /\d(?:\x80(?!))?/n =~ "5".force_encodin</encoding:us-ascii></encoding:us-ascii></encoding:us-ascii>…

Schemeのブロックコメントにマッチする正規表現(2)

開き括弧と閉じ括弧から,正規表現を生成. def charsetq(c) case c when "[", "-", "]", "\\" "\\#{c}" else c end end def _rec_regexp(str) Array.new(str.length) {|i| [Regexp.quote(str[0, i]), charsetq(str[i, 1])] } end def rec_regexp(s1, s2) a1…

Schemeのブロックコメントにマッチする正規表現

自信はない. re = /(?<block>#\|(?:(?:[^#|]|#[^|]|\|[^#])++|\g<block>)*+\|#)/ str = <</block></block>