我正在使用Parsec解析表达式,我想使用Parsec中的用户状态跟踪这些表达式中的变量。 不幸的是我真的没办法怎么做。

给出以下代码:

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 -> ...

所以, ParsecT sumau将是Set.Set 但是我如何将状态更新集成到var呢?

我试过modify $ Set.insert v类的东西,但这不起作用,因为Set.Set不是状态monad。

#1楼 票数:17 已采纳

不幸的是,Yuras对updateParserState的建议并不是最优的(如果你想要修改Parsec的内部状态你也可以使用该函数); 相反,您应该将一个适用于您的自定义用户状态(即类型为u -> u )的函数传递给modifyState ,例如在此示例中:

expr  = do
  x <- identifier
  modifyState (+1)
  -- ^ in this example, our type u is Int
  return (Id x)

或使用getStateputState函数的任意组合。 对于您的情况,您可以执行以下操作:

modifyState (Set.insert v)

有关详细信息,请参阅此链接

有关在Parsec中使用用户状态的更多教程介绍, 本文档虽然陈旧,但应该是相关的。

#2楼 票数:1

您可以使用updateParserState

  ask by bzn translate from so

未解决问题?本站智能推荐:

2回复

如何简化修改用户状态的Parsec规则

在学习Parsec时,我发现有些冗长的规则,例如 可以通过将char功能提升到Parsec / ParsecT monad中来简化。 现在,我正在尝试简化修改用户状态的规则: 我可以轻松地将insert :: Char -> String -> PhonemeClassM
2回复

一种简单的方法来改变Parsec用户状态的类型?

我正在寻找一种简单的方法来组合ParsecT代码的两个部分,它们具有相同的流和monad,但具有不同的用户状态和结果。 基本上这样的函数会很好: 问题是,用户状态在某些情况下确实很有用,但我需要在不同时间使用不同的状态,并且不希望状态类型更大。 我是否必须以某种方式修改状态以实现此目的,
2回复

Haskell-带状态的Parsec

我有一个文件,其中以String格式保存游戏状态。 该字符串由招式,通过分隔列表, 。 从这个动作列表中,我必须重建游戏状态。 因此,从概念上讲,对于我解析的每一步,我想适当地修改游戏状态并将这个游戏状态传递给下一步的解析。 从概念上讲,这可能等同于在开始时有一个空列表,并且对于每个移动都将解析的移
1回复

Parsec的setState不会重置消费状态

我试图了解 Parsec 如何重置其状态,以及该状态的一部分。 我对以下代码的行为感到惊讶: 我希望parseFinal能够成功解析“At”。 这是我的推理( | 表示输入的当前状态): <|>尝试parseAbReset ,解析直到“A|t”,然后它在char 'b'上失败而不消耗输入
2回复

在Haskell中解析Parsec

我有2个解析器: 如果它不起作用,我如何构建一个尝试一个然后另一个的解析器? 我无法弄清楚要归还什么。 必须有一个聪明的方法来做到这一点。 谢谢。 编辑: 添加更多信息...... 我正在学习Haskel,所以我开始: 然后我读了关于F-algebra( 这里 )的内
1回复

haskell中的attoparsec或parsec

我必须解析一些文件并将它们转换为某些预定义的数据类型。 Haskell似乎为此提供了两个包: attoparsec 秒差距 它们之间有什么区别,哪一个更适合根据某些规则解析文本文件?
1回复

“尝试”在Parsec中的表现如何?

为了弄清楚try在parsec中是如何工作的,我把它放到了ghci中: 我不完全确定我的期望,但这不是我所期待的,因为我认为try的全部目的是当预期的事情不存在时不会导致错误。
1回复

Haskell中Parsec的“电池”

我是Haskell的新手,我一直在尝试使用Parsec作为练习来编写JSON解析器。 这大部分进展顺利,我能够用相对较少的代码解析列表和对象,这些代码也是可读的(太棒了!)。 但是,对于JSON,我还需要解析像这样的原语 整数(可能已签名) 浮动(可能使用科学记数法,如“3.4e