// usually returns value from 0 to 1 (possibly higher values too depending on pattern) static double mmo2_scoredMatch(MMOPattern pattern, S s) { ret mmo2_scoredMatch(pattern, s, false, false); } static double mmo2_scoredMatch(MMOPattern pattern, S s, bool startOfLine, bool endOfLine) { ifdef mmo2_scoredMatch_debug printFunctionCall mmo2_scoredMatch(pattern, s, startOfLine, endOfLine); endifdef if (pattern == null) ret 0; S s2 = trim(s); if (pattern cast MMOPattern.StartOfLine) ret mmo2_scoredMatch(pattern.p, s2, true, endOfLine); if (pattern cast MMOPattern.EndOfLine) ret mmo2_scoredMatch(pattern.p, s2, startOfLine, true); if (pattern cast MMOPattern.Phrase) ret mmo2_match(pattern, s, startOfLine, endOfLine) ? 1 : 0; if (pattern cast MMOPattern.And) ret doubleProduct(map(pattern.l, pat -> mmo2_scoredMatch(pat, s2, startOfLine, endOfLine))); if (pattern cast MMOPattern.Or) ret doubleMax(map(pattern.l, pat -> mmo2_scoredMatch(pat, s2, startOfLine, endOfLine))); if (pattern cast MMOPattern.Not) ret invertZeroToOne(mmo2_scoredMatch(pattern.p, s2, startOfLine, endOfLine)); if (pattern cast MMOPattern.Weighted) ret mmo2_scoredMatch(pattern.p, s2, startOfLine, endOfLine)*pattern.weight; fail("what. " + pattern); } static double mmo2_scoredMatch(S pattern, S s) { ret mmo2_scoredMatch(mmo2_parsePattern(pattern), s); }