parsing - 在解析过程中划分不同类型的术语

标签 parsing haskell parsec

我有两个用于不同类型术语的解析器。

a :: Parser A
b :: Parser B

我有一个表示这些术语序列的数据类型。
data C = C [A] [B]

如果我的输入是一系列混合词,那么写 c :: Parser C 的好方法是什么?分隔 A来自 B s,保持他们的秩序?例如,给定这些定义:
data A = A Char
data B = B Char
a = A <$> oneOf "Aa"
b = B <$> oneOf "Bb"
"abAbBBA"将解析为序列 aAAbbBB .我有一种感觉,我需要使用 StateT ,但我不确定具体情况,只需要朝着正确的方向插入。

最佳答案

一个简单的解决方案是首先将其解析为 Either A B 的列表然后使用 partitionEithers 将其拆分为两个列表,然后应用 C构造函数到。

c :: Parser C
c = uncurry C . partitionEithers <$> many ((Left <$> a) <|> (Right <$> b))

关于parsing - 在解析过程中划分不同类型的术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10417821/

相关文章:

haskell - 很难让 Parsec 解析器正确跳过空格

python - 如何提取之间的文本 <br> python

php - 如何在不触及 HTML 元素的情况下修改 HTML 字符串?

java - ANTLR4 替代规则的访问者方法

parsing - 什么时候可以使用读取进行模棱两可的解析?

sqlite - 使用 Scotty 和 Sqlite 并在 Monad 方面遇到一些麻烦

haskell - 了解 `mapA` 以获得直觉

multithreading - Data.ByteString.readFile 是否阻塞所有线程?

haskell - 如果取消缩进与任何外部缩进级别不匹配,则使 Text.Parsec.Indent 解析失败

haskell - 在haskell中解析Karva符号