void smartParser1(S program) { // split into paragraphs and unindent LS paragraphs = map autoUnindent(map rtrim(/*XXX*/ tok_splitAtEmptyLines(program))); print("Got " + n2(paragraphs, "parapraph")); // print the parapraphs print(joinWithEmptyLines(map(s -> indentx("> ", s), paragraphs))); // throw away comment-only and quoted paragraphs (assume it's a title) LS paragraphs2 = antiFilter(paragraphs, s -> isSingleLine(trim(s)) && isQuoted(trim(s)) || countJavaTokens(s) == 0 || endsWith(rtrim(s), "----")); print("Got " + n2(paragraphs2, "filtered paragraph")); print(joinWithEmptyLines(map(s -> indentx("> ", s), paragraphs2))); // find fact paragraphs print(map allLinesAreUnindented(paragraphs2)); Pair p1 = filterAntiFilter(s -> !isSingleLine(trim(s)) && allLinesAreUnindented(s), paragraphs2); LS multiFactParagraphs = p1.a, paragraphs3 = p1.b; for (S para : multiFactParagraphs) for (S s : tlft(para)) addFact(s); // find logic rules new LS paragraphs4; for (S para : paragraphs3) { PairS p = splitAtDoubleArrow_pair(para); if (p == null) continue with paragraphs4.add(para); addLogicRule(new LogicRule(splitAtAmpersand2(p.a), splitAtAmpersand2(p.b))); } pnlStruct("Unparsed - assuming facts", paragraphs4); // assume the unparsed stuff consists of facts for (S para : paragraphs4) addFact(para); originalFacts = cloneCISet(facts); }