在解析期间对不同类型的术语进行分区

Jon*_*rdy 3 parsing haskell parsec

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

a :: Parser A
b :: Parser B
Run Code Online (Sandbox Code Playgroud)

我有一个表示这些术语序列的数据类型.

data C = C [A] [B]
Run Code Online (Sandbox Code Playgroud)

如果我的输入是一系列混合术语,那么c :: Parser CAs与Bs 分开,保留其顺序的好方法是什么?例如,给定以下定义:

data A = A Char
data B = B Char
a = A <$> oneOf "Aa"
b = B <$> oneOf "Bb"
Run Code Online (Sandbox Code Playgroud)

"abAbBBA"会解析序列aAAbbBB.我有一种感觉,我需要使用StateT,但我不确定具体细节,只需要朝着正确的方向努力.

ham*_*mar 7

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

c :: Parser C
c = uncurry C . partitionEithers <$> many ((Left <$> a) <|> (Right <$> b))
Run Code Online (Sandbox Code Playgroud)