static WoodyRule findWoodyRuleInSource(S src, S ruleName) { L lines = lines(src); for i, S s over lines: { L tok = javaTok(s); if (jfind(tok, "RULE " + ruleName) >= 0) { new WoodyRule rule; rule.nameInFile = ruleName; rule.lineInFile = i; Explain e = explain(s, ctxParsingRules(), "rule"); if (e == null) fail("Bad rule: " + s); rule.condition = e.sub(1).string(); int opening = indexOfTrim(lines, "{", i); if (opening >= 0) { for (i++; i < opening; i++) { L tok2 = javaTok(lines.get(i)); if (eqGet(tok2, 1, "[") && eqGet(tok2, 5, "]") && eqGet(tok2, 7, "=")) rule.properties.put(tok2.get(3), unquoteCtx(trim(join(subList(tok2, 9))))); } int closing = indexOfClosingCurlyBracket(lines, opening); rule.body = lines(subList(lines, opening+1, closing)); } ret rule; } } null; }