sclass EnglishDateParser > DateStructures { bool assumeFuture = true; // e.g. for "tuesday" [not used] LS tok; L> longestParses(S s) { L> l = pwt_filterByType SomeDate(allParses(s)); new L> topDogs; for (ParsedWithTokens p : l) for (int i = p.iStart; i < p.iRemaining; i += 2) listPut(topDogs, i, pwt_winner(_get(topDogs, i), p)); ret uniquify(nonNulls(topDogs)); } SomeDate parse(S s) { ret getVar(first(longestParses(s))); } ItIt allParses(S s) { tok = javaTok(s); new L out; L> years = lazyListFromIterator(nestedIterator parseYear(lai_codeTokens(tok)); print(+years); out.addAll(years); for (ParsedWithTokens year : years) for (ParsedWithTokens slash : parseFixedToken("/", year.remaining())) for (ParsedWithTokens month : parseMonth(slash.remaining())) for (ParsedWithTokens slash2 : parseFixedToken("/", month.remaining())) for (ParsedWithTokens day : parseDayOfMonth(slash2.remaining())) out.add(pwt_combine(new Day(day!, new Month(month!, new Year(year!))), year, day)); ret itIt(out); } ItIt> parseNumber(ListAndIndex toParse) { ret mapI_nonNulls(pwt_followingTokens(1, 2, toParse), p -> isInteger(p!) ? p.withValue(parseInt(p!)) : null); } ItIt> parseYear(ListAndIndex toParse) { ret filterI(parseNumber(toParse), p -> between(p!, 1900, 2100)); } ItIt> parseMonth(ListAndIndex toParse) { ret filterI(parseNumber(toParse), p -> between(p!, 1, 12)); } ItIt> parseDayOfMonth(ListAndIndex toParse) { ret filterI(parseNumber(toParse), p -> between(p!, 1, 31)); } ItIt> parseFixedToken(S token, ListAndIndex toParse) { ret filterI(pwt_followingTokens(1, 2, toParse), p -> eqic(p!, token)); } }