Я реализовал и использую парсеры GLR в течение 15 лет в качестве внешнего интерфейса для системы преобразования программ.
Я не знаю, что такое "комбинаторный парсер GLR", и я незнакомс вашей записью, так что я не совсем уверен, как это интерпретировать.Я предполагаю, что это какая-то запись функции с карри?Я представляю, что ваши правила комбинатора эквивалентны определению грамматики в терминах терминальных символов, где "char ('a'). Many" соответствует правилам грамматики:
char = "a" ;
char = char "a" ;
парсеры GLR, действительно, производятвсе возможные разборы.Ключевым моментом анализа GLR является его псевдопараллельная обработка всех возможных синтаксических анализов.Если ваши «комбинаторы» могут предлагать несколько разборов (то есть они вырабатывают правила грамматики, своего рода эквивалентные вышеприведенным), и вы действительно подключаете их к анализатору GLR, все они будут испытаны, и только те последовательности произведений, которые выкладываютсятекст выживет (то есть все действительные разборы, например, неоднозначные разборы) сохранятся.
Если вы действительно внедрили синтаксический анализатор GLR, этот набор всех возможных разборов должен был быть для вас предельно понятен.Тот факт, что это не говорит о том, что вы реализовали, не является синтаксическим анализатором GLR.
Восстановление ошибок с помощью синтаксического анализатора GLR возможно, как и с любой другой технологией синтаксического анализа.То, что мы делаем, - это сохраняем множество живых разборов до точки ошибки;когда обнаружена ошибка, мы пытаемся (в psuedo-параллельном механизме синтаксического анализа GLR это легко сделать, если она правильно согнута) все следующее: а) удаление токена-нарушителя, б) вставка всех токенов, которые по существу являются следующими (x)где х это живой анализ.По сути, удалите токен или вставьте тот, который ожидается при живом разборе.Затем мы снова отключаем анализатор GLR.Только действительные разборы (например, ремонт) выживут.Если текущий токен не может быть обработан, анализатор, обрабатывающий поток с удаленным токеном, остается в живых.В худшем случае восстановление парсера GLR приводит к сбросу всех токенов в EOF.Серьезным недостатком этого является то, что время работы анализатора GLR довольно радикально увеличивается при анализе ошибок;если их много в одном месте, время восстановления после ошибки может пройти через крышу.