diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-03-17 13:50:16 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-03-17 13:50:16 -0700 |
commit | 958fdaa0731b22ac051caae2c9730b1d660149c7 (patch) | |
tree | 1fbddb02f2ef41d397e89e3f62601f4d3c6c3a8e | |
parent | 8b107355e96eff715e4453728687a74011d3fb9c (diff) | |
download | unix-cruft-958fdaa0731b22ac051caae2c9730b1d660149c7.tar.gz unix-cruft-958fdaa0731b22ac051caae2c9730b1d660149c7.tar.bz2 unix-cruft-958fdaa0731b22ac051caae2c9730b1d660149c7.zip |
Reject reversed {m,n} repeats where m > n.
-rw-r--r-- | awkreg.awk | 35 |
1 files changed, 28 insertions, 7 deletions
@@ -38,6 +38,22 @@ function match_and_eat_else(s, pfx, e) return e } +function eat_digits(s) +{ + match(s, /^[0-9]+/) + if (RLENGTH > 0) + return eat_chars(s, RLENGTH) + return s +} + +function extract_digits(s) +{ + match(s, /^[0-9]+/) + if (RLENGTH > 0) + return substr(s, 1, RLENGTH) + return "" +} + function eat_rchar(c) { if (c ~ /^\\./) @@ -117,16 +133,17 @@ function eat_bracket_exp(e, function eat_rep_notation(n, # local - o) + o, x, y) { o = n n = eat_char(n) - if (n !~ /^[0-9]/) + x = extract_digits(n) + + if (empty(x)) return o - while (n ~ /^[0-9]/) - n = eat_char(n) + n = eat_digits(n) if (matches(n, "}")) return eat_char(n) @@ -139,11 +156,15 @@ function eat_rep_notation(n, if (matches(n, "}")) return eat_char(n) - if (n !~ /^[0-9]/) + y = extract_digits(n) + + if (empty(y)) + return o + + if (x + 0 > y) return o - while (n ~ /^[0-9]/) - n = eat_char(n) + n = eat_digits(n) return match_and_eat_else(n, "}", o) } |