И то и другое достаточно очевидно. В первом случае просто ищешь слова (чуть сложнее, если case-insensitive поиск, но ничего уберсложного), а во втором случае вообще максимально просто: тупо берёшь алфавит языка, потом по слову проверяешь, в какие алфавиты подходит. Отсекаешь алфавиты пока текст не кончится или не останется один.
Мой макрос принимает варианты перечисления. Я должен сгенерировать match по этим вариантам, причём первая ветка будет Coproduct::Inl(T), вторая - Coprod::Inr(Coproduct::Inr(U)) и т.д. Это возможно сделать с помощью macro_rules!?