我正在使用秒差距解析一个表达式,并且我想使用秒差距中的用户状态来跟踪这些表达式中的变量。不幸的是我真的不知道该怎么做。
给出以下代码:
import Data.Set as Set
inp = "$x = $y + $z"
data Var = V String
var = do char '$'
n <- many1 letter
let v = Var n
-- I want to modify the set of variables here
return v
parseAssignment = ... -- parses the above assignment
run = case runIdentity $ runParserT parseAssignment Set.empty "" inp of
Left err -> ...
Right -> ...
So, the u
in ParsecT s u m a
将会Set.Set
。但是我如何将状态更新集成到var
?
我尝试过类似的东西modify $ Set.insert v
,但这不起作用,因为Set.Set
不是一个状态单子。
不幸的是,尤拉斯的建议updateParserState
不是最佳的(如果您想修改 Parsec 的内部状态,您可以使用该函数as well);相反,您应该传递一个适用于您的自定义用户状态的函数(即类型u -> u
) to modifyState
,例如本例中:
expr = do
x <- identifier
modifyState (+1)
-- ^ in this example, our type u is Int
return (Id x)
或使用以下任意组合getState
and putState
功能。对于你的情况,你会做类似的事情:
modifyState (Set.insert v)
See 这个链接 http://hackage.haskell.org/packages/archive/parsec/3.1.1/doc/html/Text-Parsec-Prim.html#v%3aputState了解更多信息。
有关以秒差距处理用户状态的更多类似教程的介绍,这个文件 http://research.microsoft.com/en-us/um/people/daan/download/parsec/parsec.pdf虽然很老,但应该是相关的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)