1

我希望能够在编写解析器组合器时使用getput函数。State Monaduu-parsinglib

如何才能做到这一点?我可以使用这个库以某种方式创建状态解析器吗?

4

1 回答 1

3

Sjoerd 的评论是正确的。uu-parsinglib 中的基本解析描述符类型是P st a,其中 st 是维护输入/解析状态的类型,a 是输出类型。这是在 Text.ParserCombinators.UU.Core 中定义的。

UU.Core 中的一些基本组合子对 st 可以是什么施加了一些限制,即它必须具有UU.Core 中定义的 、 和类的Eof实例StoresErrorsHasPosition完整功能可能需要其他实例。

Text.ParserCombinators.UU.BasicInstances 包为所有这些提供适当的实例,允许在包含 Char 并提供错误和位置状态的 ListLike 类的流上创建解析器。

如果您想对具有位置和错误状态的 Char 的 ListLike 容器以外的东西进行解析器,例如基于某些 Token 类型进行解析或存储任意用户提供的状态,您将必须创建一个类似于 Text.ParserCombinators 的模块.UU.BasicInstances,您可以在其中提供自己的实例来满足您的需求以及解析库的需求。

对于您的请求,我认为您将需要使用实现 MonadState 接口的必要字段来扩充Str a s loc数据类型(用于stin 中的类型P st a),然后提供(除了 UU.BasicInstances 中已有的实例之外)一个用于MonadState (P <your new type> a)使用您的增强型 Str 类型来提供getset. UU.Core 已经为 提供了 Monad 实例P st a,因此如果您将 MonadState 实例约束到您的特定状态类型,这应该不会太难。

于 2013-08-13T23:23:48.150 回答