我希望能够在编写解析器组合器时使用get
和put
函数。State Monad
uu-parsinglib
如何才能做到这一点?我可以使用这个库以某种方式创建状态解析器吗?
我希望能够在编写解析器组合器时使用get
和put
函数。State Monad
uu-parsinglib
如何才能做到这一点?我可以使用这个库以某种方式创建状态解析器吗?
Sjoerd 的评论是正确的。uu-parsinglib 中的基本解析描述符类型是P st a
,其中 st 是维护输入/解析状态的类型,a 是输出类型。这是在 Text.ParserCombinators.UU.Core 中定义的。
UU.Core 中的一些基本组合子对 st 可以是什么施加了一些限制,即它必须具有UU.Core 中定义的 、 和类的Eof
实例StoresErrors
。HasPosition
完整功能可能需要其他实例。
Text.ParserCombinators.UU.BasicInstances 包为所有这些提供适当的实例,允许在包含 Char 并提供错误和位置状态的 ListLike 类的流上创建解析器。
如果您想对具有位置和错误状态的 Char 的 ListLike 容器以外的东西进行解析器,例如基于某些 Token 类型进行解析或存储任意用户提供的状态,您将必须创建一个类似于 Text.ParserCombinators 的模块.UU.BasicInstances,您可以在其中提供自己的实例来满足您的需求以及解析库的需求。
对于您的请求,我认为您将需要使用实现 MonadState 接口的必要字段来扩充Str a s loc
数据类型(用于st
in 中的类型P st a
),然后提供(除了 UU.BasicInstances 中已有的实例之外)一个用于MonadState (P <your new type> a)
使用您的增强型 Str 类型来提供get
和set
. UU.Core 已经为 提供了 Monad 实例P st a
,因此如果您将 MonadState 实例约束到您的特定状态类型,这应该不会太难。