Parsing haskell一个文本有两个解析器
我有一个文本,有两种不同的文本形式,例如: 123:ABC 456:DEF ABC:123 386:HDG DEF:456 现在我编写了两个解析器,第一个用于123:ABC,这个表单,另一个用于ABC:456。我想知道的是如何在一个主函数中创建两个解析器Parsing haskell一个文本有两个解析器,parsing,haskell,Parsing,Haskell,我有一个文本,有两种不同的文本形式,例如: 123:ABC 456:DEF ABC:123 386:HDG DEF:456 现在我编写了两个解析器,第一个用于123:ABC,这个表单,另一个用于ABC:456。我想知道的是如何在一个主函数中创建两个解析器 123:ABC 456:DEF ABC:123 386:HDG DEF:456 aa=B.readFile logFile >>= print . parseOnly aaParser bb=B.readFile logFile
123:ABC
456:DEF
ABC:123
386:HDG
DEF:456
aa=B.readFile logFile >>= print . parseOnly aaParser
bb=B.readFile logFile >>= print . parseOnly bbParser
main :: IO ()
main =B.readFile logFile >>= print . parseOnly aaParser --there is missing the aaparser and I need both of them for the text above
很难从您的实现中分辨出解析器的输出形式,因此很难知道它们是如何组合的。一种可能的方法是使两种不同格式中的每一种对应于代数数据类型的不同数据构造函数。一个简单的解决方案可能如下所示:
module TinyParse(parseABC123Format) where
import Text.ParserCombinators.Parsec
import Text.ParserCombinators.Parsec.Char
data TwoTypes
= ABCNums String String
| NumsABC String String
deriving (Eq, Show)
parseABC123Format :: String -> [TwoTypes]
parseABC123Format str = case parse parseABC123File "ABC123" str of
Left err -> error $ show err
Right p -> p
parseABC123File :: Parser [TwoTypes]
parseABC123File = endBy parseEither spaces
parseEither :: Parser TwoTypes
parseEither = parseABC123 <|> parse123ABC
parseABC123 :: Parser TwoTypes
parseABC123 = do
threeLetters <- parseABC
semi <- char ':'
threeNumbers <- parseNums
return $ ABCNums threeLetters threeNumbers
parse123ABC :: Parser TwoTypes
parse123ABC = do
threeNumbers <- parseNums
semi <- char ':'
threeLetters <- parseABC
return $ NumsABC threeNumbers threeLetters
parseNums :: Parser String
parseNums = do
d1 <- digit
d2 <- digit
d3 <- digit
return (d1:d2:d3:[])
parseABC :: Parser String
parseABC = do
l1 <- upper
l2 <- upper
l3 <- upper
return (l1:l2:l3:[])
模块TinyParse(解析ABC123格式),其中
导入Text.ParserCombinators.Parsec
导入Text.ParserCombinators.Parsec.Char
数据两种类型
=ABCNums字符串
|NumsABC字符串
推导(等式,显示)
parseABC123Format::String->[TwoTypes]
parseABC123Format str=的案例解析ParseABC123文件“ABC123”str
左错误->错误$show错误
右p->p
parseABC123File::解析器[两种类型]
parseABC123File=endBy parses或空格
ParseOrther::Parser TwoType
ParseOrther=parseABC123 parse123ABC
parseABC123::解析器两种类型
parseABC123=do
现在的问题是将两个解析器组合成一个主函数,将两个解析器组合成一个解析器。我想您要么希望aaParser
匹配,要么希望bbParser
匹配。看起来,将两个解析器中的任何一个与回溯匹配的attoParsec方法是eitherP
。您的aaParser
和bbParser
是什么?我怀疑它们解析整个文件,因此无法直接组合,因为看起来您希望为每一行匹配一种模式或另一种模式,而不是为整个文件。我的aaparser解析文本中的AAA:123和bbparser 123:AAA这两种类型是混合的,所以我需要将两种解析器组合为一个。哈哈!搜索parseOnly
表明OP使用的是attoparsec。它不起作用,问题是我无法将两个解析器组合成一个文件。