Как сохранить состояние в 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 вашим конкретным типом состояния.