static MMOPattern mmo2_parsePattern(S s) { // drop outer brackets and tokenize s = trim(tok_deRoundBracket(trim(s))); LS tok = javaTokWithBrackets(s); // commas (or) - "car, vehicle" LS l = tok_splitAtComma(tok); if (l(l) > 1) ret new MMOPattern.Or(lambdaMap mmo2_parsePattern(l)); // plus (and) - "give + money" l = tok_splitAtPlus(tok); if (l(l) > 1) ret new MMOPattern.And(lambdaMap mmo2_parsePattern(l)); // exclam (not) - "!something" if (startsWith(s, "!")) ret new MMOPattern.Not(mmo2_parsePattern(dropFirst(s))); // ^... - match start of line if (startsWith(s, "^")) ret new MMOPattern.StartOfLine(mmo2_parsePattern(dropFirst(s))); // ...$ - match end of line if (endsWith(s, "$")) ret new MMOPattern.EndOfLine(mmo2_parsePattern(dropLast(s))); // ...*0.5 - weighted pattern l = tok_splitAtAsterisk(tok); if (l(l) == 2) ret new MMOPattern.Weighted(parseDouble(second(l)), mmo2_parsePattern(first(l))); // phrase (possibly quoted) ret new MMOPattern.Phrase(unquote(s), isQuoted(s)); }