Сделал в нисходящем парсере экспериментальное расширение, которое вплотную приближает его возможности в плане устойчивости к появлению неразбираемых фрагментов в предложении к восходящему алгоритму.
Расширение полностью интегрировано в основной алгоритм, поэтому никаких переписываний набора правил не требуется. Достаточно добавлять в набор новые правила с особым флагом, и парсер начнет делать следующее.
Допустим, на входе у нас есть предложение с большим количеством "мусора":
w1 w2 я w3 w4 w5 вижу w6 w7 w8 книжку
Обход "лишних" слов выходит за обычные возможности правил пропуска токенов, так как каждое применение такого правила автоматически порождает ветвление процесса разбора на 2 ветки, и для нескольких пропусков число вариантов становится слишком большим. А расширенный алгоритм сопоставления умеет работать с такими контекстами за счет того, что он ищет все возможные комбинации сопоставлений аргументов, автоматически пропуская непонятные фрагменты.
Вот что получается в простейшем (тестовом) случае:
С выделенными ключевыми моментами:
Текущая реализация просто выкидывает пропускаемые слова, даже не привязывая их в дерево. Возможно, этот момент надо будет изменить, чтобы, к примеру, постпроцессором допривязывать оторванные атрибуты существительных в таких предложениях:
какие же это приятные вечера!
Второе расширение, которое прямо вытекает из вышеописанного - теперь можно писать правила, которые будут сами проверять все возможные перестановки своих аргументов при сопоставлении с контекстов. Другими словами, написав правило
сказуемое := подлежащее глагол дополнение
теперь можно поставить флажок и правило будет сопоставляться с
книгу я вижу
вижу книгу я
и так далее