Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing haskell一个文本有两个解析器_Parsing_Haskell - Fatal编程技术网

Parsing haskell一个文本有两个解析器

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

现在我编写了两个解析器,第一个用于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 >>= 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。它不起作用,问题是我无法将两个解析器组合成一个文件。