Как сохранить состояние в uu-parsinglib Haskell парсер комбинатор

Я хотел бы иметь возможность использовать get а также put функции от State Monad во время записи uu-parsinglib парсер комбинатор.

Как это может быть сделано? Можно ли как-то создать анализатор состояний с помощью этой библиотеки?

1 ответ

Решение

Шёрд прав в своем комментарии; основной тип дескриптора разбора в uu-parsinglib P st aгде st - это тип, который поддерживает состояние ввода / анализа, а a - тип вывода. Это определено в Text.ParserCombinators.UU.Core.

Некоторые из основных комбинаторов в UU.Core накладывают некоторые ограничения на то, что может быть st, а именно на то, что он должен иметь экземпляры для Eof, StoresErrors, а также HasPosition классы также определены в UU.Core. Другие экземпляры могут потребоваться для полной функциональности.

Пакет Text.ParserCombinators.UU.BasicInstances предоставляет соответствующие экземпляры для всех из них, которые позволяют создавать анализаторы для потоков класса ListLike, которые содержат Char и предоставляют состояние ошибки и положения.

Если вы хотите сделать синтаксические анализаторы для чего-то отличного от контейнеров ListLike класса Char с положением и состоянием ошибки, например, для анализа на основе некоторого типа токена или для хранения произвольного предоставленного пользователем состояния, вам нужно будет создать модуль, аналогичный Text.ParserCombinators.UU.BasicInstances, в которых вы предоставляете свои собственные экземпляры, которые соответствуют вашим потребностям и потребностям библиотеки синтаксического анализа.

По вашему запросу, я думаю, вам нужно будет увеличить Str a s loc тип данных (который используется для st введите P st a) с полями, необходимыми для реализации интерфейса MonadState, затем предоставьте (в дополнение к экземплярам, ​​уже имеющимся в UU.BasicInstances) экземпляр для MonadState (P <your new type> a) который использует ваш расширенный тип Str для предоставления get а также set, UU.Core уже предоставляет экземпляр Monad для P st a, так что это не должно быть слишком сложно, если вы ограничите экземпляр MonadState вашим конкретным типом состояния.

Другие вопросы по тегам