parsec-3.1.0 ( http://hackage.haskell.org/package/parsec-3.1.0 ) 适用于任何令牌类型。然而,像 Text.Parsec.Char.satisfy 这样的组合子只为 Char 数据类型定义。似乎没有更通用的对应物可用。
我应该定义自己的版本还是错过了什么?
也许 Haskell 中有不同的解析器库允许:
- 自定义令牌类型
- 自定义解析器状态(我需要解析有状态格式 - Wavefront OBJ)
parsec-3.1.0 ( http://hackage.haskell.org/package/parsec-3.1.0 ) 适用于任何令牌类型。然而,像 Text.Parsec.Char.satisfy 这样的组合子只为 Char 数据类型定义。似乎没有更通用的对应物可用。
我应该定义自己的版本还是错过了什么?
也许 Haskell 中有不同的解析器库允许:
oneOf
、noneOf
和的广义版本可以很容易地anyChar
从广义的 中构建出来:satisfy
oneOfT :: (Eq t, Show t, Stream s m t) => [t] -> ParsecT s u m t
oneOfT ts = satisfyT (`elem` ts)
noneOfT :: (Eq t, Show t, Stream s m t) => [t] -> ParsecT s u m t
noneOfT ts = satisfyT (not . (`elem` ts))
anyT :: (Show t, Stream s m t) => ParsecT s u m t
anyT = satisfyT (const True)
satisfyT :: (Show t, Stream s m t) => (t -> Bool) -> ParsecT s u m t
satisfyT p = tokenPrim showTok nextPos testTok
where
showTok t = show t
testTok t = if p t then Just t else Nothing
nextPos p t s = -- however you update position for your token stream
似乎缺少对这些的概括,但您会注意到,这里的这些概括对某个类型的类型做出了某些假设,而这些假设t
对于某人的令牌类型可能不正确。假设它是 and 的一个实例Show
,Eq
但我可以想象它们以其他方式显示的令牌类型show
,并且可以通过==
and以外的其他方法实现令牌类中的成员资格elem
。
最后,一旦您的令牌类型不再是 a Char
,您如何选择表示位置并因此对其进行更新,很大程度上取决于您对令牌和流的表示。
因此,我可以看到为什么不存在更通用的形式。