!7 p { callAnswerFunctionVerbose("Can you tell me what time it is?"); } sclass TokConsumer { L l; int i; *(L *l) {} S peek() { ret get(l, i); } S next() { ret get(l, i++); } L remainingTokens() { ret subList(l, i); } } sS answer(S s) { L tok = codeTokens(dropPunctuation(javaTok(s))); TokConsumer c = new(tok); S verb = printStruct("verb", consumeVerb(c)); if (verb != null) { S noun = printStruct("noun", consumeNoun(c)); if (noun != null) ret group(verb, noun, rest(c)); } ret joinWithSpace(tok); } static Set verbs = asSet(splitAtSpace("can does will tell")); static Set nouns = asSet(splitAtSpace("i you he she it we someone me")); static S consumeVerb(TokConsumer c) { ret consumeFromList(verbs, c); } static S consumeNoun(TokConsumer c) { ret consumeFromList(nouns, c); } static S consumeFromList(Set set, TokConsumer c) { if (set.contains(toLower(c.peek()))) ret c.next(); null; } sS group(S... parts) { new L l; for (S part : parts) { L tok = javaTokC(part); if (l(tok) > 1) l.add("(" + joinWithSpace(tok) + ")"); else l.addAll(tok); } ret joinWithSpace(l); } sS rest(TokConsumer c) { ret joinWithSpace(c.remainingTokens()); }