Method code for $compiler.parse_string_new()

[Turn off line numbering]
  1: arg vars, tokens;
  2: var mode, out, word, token, i, tmp, ret;
  3: 
  4: if (!tokens)
  5:     return [[], vars];
  6: mode = ['spaces, 'plain];
  7: i = 1;
  8: out = [];
  9: word = "";
 10: while (i <= tokens.length()) {
 11:     refresh();
 12:     token = tokens[i++];
 13:     switch (mode[1]) {
 14:         case 'spaces:
 15:             if (token != " ") {
 16:                 i--;
 17:                 mode = mode.subrange(2);
 18:             }
 19:         case 'plain:
 20:             if (!(token in ["{", "["])) {
 21:                 if (token == " ") {
 22:                     // No scatter because .check can throw
 23:                     if ((| (ret = ._check_glue(tokens, i)) |)) {
 24:                         i = ret[1];
 25:                         mode = [ret[2], @mode];
 26:                         if (word)
 27:                             out += [word];
 28:                         word = "";
 29:                         continue;
 30:                     }
 31:                 }
 32:                 word += token.sed("\\(.)", "%1", "g");
 33:             } else {
 34:                 if (word)
 35:                     out += [word];
 36:                 word = "";
 37:                 mode = ['spaces, token == "{" ? 'fmtname : 'genname, @mode];
 38:             }
 39:         case 'fmtname, 'genname:
 40:             if (mode[1] == 'fmtname && token == "quote") {
 41:                 mode = mode.subrange(2);
 42:                 out += [$format.new_tag("quote", [], [tokens[i++]])];
 43:                 i++;
 44:             } else {
 45:                 if (token in glue_table)
 46:                     mode = [mode[1], 'spaces, @mode.subrange(2)];
 47:                 mode = ['spaces, 'flags, #[], token, @mode];
 48:             }
 49:         case 'flags:
 50:             if (token in ["}", "]"]) {
 51:                 ret = (> ._make_tag(token, mode[4], vars, mode[3], mode[2], []) <);
 52:                 vars = ret[2];
 53:                 out += [ret[1]];
 54:                 mode = mode.subrange(5);
 55:             } else if (token == "=") {
 56:                 throw(~parse, "Value flag with no key.");
 57:             } else if (token == ":") {
 58:                 mode = ['spaces, 'args, out, mode[2], @mode.subrange(3)];
 59:                 out = [];
 60:             } else if ((| tokens[i] == "=" |)) {
 61:                 mode = ['flagvalue, token, @mode];
 62:                 i++;
 63:             } else {
 64:                 mode = mode.replace(2, mode[2].add(token, 1));
 65:             }
 66:         case 'flagvalue:
 67:             if (token in ["}", "]", ":"]) {
 68:                 mode = mode.subrange(3);
 69:                 i--;
 70:             } else if (token == " ") {
 71:                 mode = mode.subrange(3);
 72:             } else if (!(token in ["[", "{"])) {
 73:                 mode = ['spaces, @mode.subrange(3).replace(2, mode[4].add(mode[2], token.sed("\\(.)", "%1", "g")))];
 74:             } else {
 75:                 if (word)
 76:                     out += [word];
 77:                 word = "";
 78:                 mode = ['spaces, token == "{" ? 'fmtname : 'genname, 'flagset, @mode.subrange(2)];
 79:             }
 80:         case 'flagset:
 81:             i--;
 82:             mode = ['spaces, @mode.subrange(3).replace(2, mode[4].add(mode[2], out[out.length()]))];
 83:             out = out.subrange(1, out.length() - 1);
 84:         case 'args:
 85:             if (token in ["}", "]"]) {
 86:                 if (word) {
 87:                     out += [word];
 88:                     word = "";
 89:                 }
 90:                 ret = ._make_tag(token, mode[5], vars, mode[4], mode[3], out);
 91:                 vars = ret[2];
 92:                 out = mode[2] + [ret[1]];
 93:                 mode = mode.subrange(6);
 94:             } else if (token in ["{", "["]) {
 95:                 if (word)
 96:                     out += [word];
 97:                 word = "";
 98:                 mode = ['spaces, token == "{" ? 'fmtname : 'genname, @mode];
 99:             } else {
100:                 if (token == " ") {
101:                     if ((| (ret = ._check_glue(tokens, i)) |)) {
102:                         i = ret[1];
103:                         mode = [ret[2], @mode];
104:                         if (word)
105:                             out += [word];
106:                         word = "";
107:                         continue;
108:                     }
109:                 }
110:                 word += token.sed("\\(.)", "%1", "g");
111:             }
112:     }
113: }
114: if (word)
115:     out += [word];
116: while (mode[1] == 'spaces)
117:     mode = mode.subrange(2);
118: if (mode != ['plain])
119:     throw(~parse, "Unclosed tag.");
120: return [out, vars];

// Created 17-Jul-1996 as a part of ColdCore, see: @help Credit

Tlon