sclass MMOPattern { srecord Or(L l) > MMOPattern {} srecord And(L l) > MMOPattern {} srecord Phrase(S phrase) > MMOPattern {} } // s = e.g. "(what, give) + (mrnuke, mrnuke's, mr + (nuke, nuke's)) + (url, address)" static MMOPattern mmo_parsePattern(S s) { s = trim(tok_deRoundBracket(trim(s))); LS tok = javaTokWithBrackets(s); LS l = tok_splitAtComma(tok); if (l(l) > 1) ret new MMOPattern.Or(lambdaMap mmo_parsePattern(l)); l = tok_splitAtPlus(s); if (l(l) > 1) ret new MMOPattern.And(lambdaMap mmo_parsePattern(l)); ret new MMOPattern.Phrase(s); }