如何在uu-parsinglib Haskell解析器组合器中维护一个状态

时间:2013-08-13 20:48:27

标签: parsing haskell state monads uu-parsinglib

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

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

1 个答案:

答案 0 :(得分:3)

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

UU.Core中的一些基本组合器对st可以有什么限制,即它必须具有EofStoresErrorsHasPosition类的实例在UU.Core。完整功能可能需要其他实例。

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

如果你想在具有位置和错误状态的Char的ListLike容器之外的其他东西上进行解析,例如根据某些Token类型进行解析或者存储任意用户提供的状态,你将需要创建一个类似于Text.ParserCombinators.UU.BasicInstances,您可以在其中提供满足您需求的实例以及解析库的需求。

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