diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2015-09-27 22:42:46 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2015-09-27 22:42:46 -0700 |
commit | 35396ddf01daef0d3dea12f2ed960d9693d58eed (patch) | |
tree | 3424947f640eb1c1b812d7de0992d7deb6b56d98 /regex.c | |
parent | 5ac2c633f7bc24daae047890c1b9383ff43b5800 (diff) | |
download | txr-35396ddf01daef0d3dea12f2ed960d9693d58eed.tar.gz txr-35396ddf01daef0d3dea12f2ed960d9693d58eed.tar.bz2 txr-35396ddf01daef0d3dea12f2ed960d9693d58eed.zip |
Optimization for one-character range.
* regex.c (reg_optimize): [a] -> a. Also take advantage
of this where the complement case generates [a].
Diffstat (limited to 'regex.c')
-rw-r--r-- | regex.c | 9 |
1 files changed, 7 insertions, 2 deletions
@@ -1736,7 +1736,11 @@ static val reg_optimize(val exp) val args = rest(exp); if (sym == set_s) { - return if3(rest(exp), exp, t); + if (!args) + return t; + if (!rest(args) && chrp(first(args))) + return first(args); + return exp; } else if (sym == cset_s) { return if3(rest(exp), exp, wild_s); } else if (sym == compound_s) { @@ -1788,7 +1792,8 @@ static val reg_optimize(val exp) val sym2 = first(arg); if (sym2 == cset_s) return list(or_s, - list(optional_s, cons(set_s, rest(arg)), nao), + list(optional_s, reg_optimize(cons(set_s, rest(arg))), + nao), list(compound_s, wild_s, list(oneplus_s, wild_s, nao), nao), nao); if (sym2 == set_s) |