sclass RuleEngine2_MatchedRule { RuleEngine2.Rule rule; Map map; new Map mappingQuality; // key in map to -1, 0 or 1 new LPair matchedLines; O tokenizationFunction; int qualitySum() { ret intSum(values(mappingQuality))-l(map); } RuleEngine2.Rule applyMapping() { new RuleEngine2.Rule r; r.in = map(rule.in, f applyMappingTo); r.out = applyMappingTo(rule.out); ret r; } S applyMappingTo(S s) { ret s == null ? null : join(ai_mapCodeTokensWithMap(tokenize(s), map)); } LS tokenize(S s) { ret (LS) callF(assertNotNull(tokenizationFunction), s); } } static L ai_ruleEngine2_rulesForInput_3b(RuleEngine2 engine, S q) { S tokenize = f javaTokNPunctuationWithBrackets; LS tokI = (LS) callF(tokenize, q); new L l; for (RuleEngine2.Rule rule : engine.rules) { S cond = first(rule.in); LS tokC = (LS) callF(tokenize, cond); Map map = ai_matchTwoTokenizations(tokC, tokI); if (map == null) continue; new RuleEngine2_MatchedRule matched; matched.rule = rule; matched.map = map; matched.matchedLines.add(pair(tokC, tokI)); matched.tokenizationFunction = tokenize; Map qualities = ai_ruleEngine2_mappingQualities(rule); for (S a, b : map) { mapPut(matched.mappingQuality, a, qualities.get(pair(a, b))); } l.add(matched); } ret l; }