summaryrefslogtreecommitdiffstats
path: root/regex.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-09-27 22:42:46 -0700
committerKaz Kylheku <kaz@kylheku.com>2015-09-27 22:42:46 -0700
commit35396ddf01daef0d3dea12f2ed960d9693d58eed (patch)
tree3424947f640eb1c1b812d7de0992d7deb6b56d98 /regex.c
parent5ac2c633f7bc24daae047890c1b9383ff43b5800 (diff)
downloadtxr-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.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/regex.c b/regex.c
index a4ca5451..d4cfe00c 100644
--- a/regex.c
+++ b/regex.c
@@ -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)