From 958fdaa0731b22ac051caae2c9730b1d660149c7 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Mon, 17 Mar 2014 13:50:16 -0700 Subject: Reject reversed {m,n} repeats where m > n. --- awkreg.awk | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/awkreg.awk b/awkreg.awk index 088b53f..52c8353 100644 --- a/awkreg.awk +++ b/awkreg.awk @@ -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) } -- cgit v1.2.3