Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

109
LINES

< > BotCompany Repo | #1007988 // flexMatchIC2_left - flexMatch (ignore case, with (a|b), left-associative)

JavaX fragment (include)

static bool flexMatchIC2_left_debug;

static bool flexMatchIC2_left(S pat, S s) {
  ret flexMatchIC2_left(pat, s, null);
}

static bool flexMatchIC2_left(S pat, S s, Matches m) {
  ret flexMatchIC2_left(javaTok(pat), javaTok_cached(unnull(s)), m);
}

static bool flexMatchIC2_left(S pat, S s, Matches m, bool joinBrackets) {
  ret flexMatchIC2_left(javaTok(pat), javaTok_cached(unnull(s)), m, joinBrackets);
}

static bool flexMatchIC2_left(L<S> tokpat, L<S> tokfull, Matches m) {
  ret flexMatchIC2_left(tokpat, tokfull, m, true);
}

static bool flexMatchIC2_left(L<S> tokpat, L<S> tokfull, Matches m, bool joinBrackets) {
  tokpat = codeTokens(joinBrackets ? joinBrackets(tokpat) : tokpat);
  for (int i = 0; i < l(tokpat); i++)
    if (eq(tokpat.get(i), "*"))
      tokpat.add(i++, "!*"); // insert single-token wildcard in front to avoid empty matches
  if (joinBrackets) tokfull = joinBrackets(tokfull);
  L<S> tok = codeTokens(tokfull);
  new BitSet bla;
  new BitSet bla2;
  if (!flexMatchIC2_left_impl(tokpat, 0, tok, 0, bla, bla2)) ret false;
  if (m != null) {
    new L<S> l;
    for (int i = 1; i < l(tokfull); i += 2) {
      if (bla.get(i/2)) {
        int j = i;
        while (j < l(tokfull) && bla.get(j/2)) j += 2;
        l.add(join(subList(tokfull, i, j-1)));
        i = j-2;
      } else if (bla2.get(i/2))
        l.add(tokfull.get(i));
    }
    m.m = toStringArray(l);
  }
  ret true;
}

static bool flexMatchIC2_left_impl(L<S> pat, int ipat, L<S> tok, int itok, BitSet bla, BitSet bla2) {
  if (flexMatchIC2_left_debug)
    print("flexMatchIC2_left pat=" + structure(subList(pat, ipat)) + " tok=" + structure(subList(tok, itok)) + " " + structure(bla));
  if (ipat >= l(pat))
    ret itok >= l(tok);
  S t = pat.get(ipat);
  
  if (eq(t, "*")) { // the flex wildcard (0 or more tokens)
    bla.set(itok);
    if (itok < l(tok)) {
      if (flexMatchIC2_left_debug) print("Trying one or more tokens");
      if (flexMatchIC2_left_impl(pat, ipat, tok, itok+1, bla, bla2)) {
        if (flexMatchIC2_left_debug) print("Success!");
        ret true; // success, leave mark
      }
    }
    bla.clear(itok); // fail, undo marking
    
    if (flexMatchIC2_left_debug) print("Trying zero tokens");
    if (flexMatchIC2_left_impl(pat, ipat+1, tok, itok, bla, bla2)) {
      if (flexMatchIC2_left_debug) print("Success!");
      ret true;
    }
    
    if (flexMatchIC2_left_debug) print("Failed * matching");
    ret false;
  }
  if (itok >= l(tok)) {
    if (flexMatchIC2_left_debug)
      print("too much pattern");
    ret false;
  }
  if (eq(t, "!*")) { // the single-token wildcard
    bla.set(itok);
    if (flexMatchIC2_left_impl(pat, ipat+1, tok, itok+1, bla, bla2))
      ret true; // success, leave mark
    bla.clear(itok); // fail, undo marking
    ret false;
  }
  S realt = tok.get(itok);
  if (t.startsWith("(") && t.endsWith(")")) {
    // quick pre-check
    if (flexMatchIC2_left_debug)
      print("flexMatchIC2_left precheck " + t + " " + realt);
    if (!containsIgnoreCase(t, realt)) false;
    // real check
    L<S> list = splitAt(dropFirstAndLast(t), "|");
    if (flexMatchIC2_left_debug)
      print("flexMatchIC2_left real check " + struct(list));
    if (!containsIgnoreCase(list, realt)) false;
    bla2.set(itok);
  } else if (neqic(realt, t)) {
    if (flexMatchIC2_left_debug)
      print("mismatch");
    ret false;
  }
  
  // it is a token match. consume and proceed
  if (flexMatchIC2_left_impl(pat, ipat+1, tok, itok+1, bla, bla2))
    true;
  else {
    bla2.clear(itok);
    false;
  }
}

Author comment

Began life as a copy of #1005501

download  show line numbers  debug dex  old transpilations   

Travelled to 13 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt

No comments. add comment

Snippet ID: #1007988
Snippet name: flexMatchIC2_left - flexMatch (ignore case, with (a|b), left-associative)
Eternal ID of this version: #1007988/2
Text MD5: 34a60a5746ebae9c57e48195ceff31aa
Author: stefan
Category: javax / parsing
Type: JavaX fragment (include)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2017-04-18 03:07:07
Source code size: 3656 bytes / 109 lines
Pitched / IR pitched: No / No
Views / Downloads: 459 / 452
Version history: 1 change(s)
Referenced in: #1006654 - Standard functions list 2 (LIVE, continuation of #761)