e6d40133bc9f858308654afb1262b8b483ec5922Till MossakowskiDescription : test some parsers (and printers)
9a648682ccaa8ef63583548c3edb01c6542d7885Christian MaederCopyright : (c) Christian Maeder and Uni Bremen 2002-2003
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu ProdescuLicense : GPLv2 or higher, see LICENSE.txt
3f69b6948966979163bdfe8331c38833d5d90ecdChristian MaederMaintainer : Christian.Maeder@dfki.de
9a648682ccaa8ef63583548c3edb01c6542d7885Christian MaederStability : provisional
9a648682ccaa8ef63583548c3edb01c6542d7885Christian MaederPortability : portable
e6d40133bc9f858308654afb1262b8b483ec5922Till Mossakowskitest some parsers (and printers)
95834d47204eec8e8a076639b805928ecb8ce46eChristian Maedermodule Common.RunParsers (exec, StringParser, toStringParser, fromAParser)
10b02b2343246df6773585636fe3ddbefa3b6a1bChristian Maederimport Common.AnalyseAnnos (addGlobalAnnos)
10b02b2343246df6773585636fe3ddbefa3b6a1bChristian Maederimport Common.Lexer (parseString)
414ffa281d82f05a2d742c702f8e06b0cb05b229Christian Maedertype StringParser = GlobalAnnos -> AParser () String
95834d47204eec8e8a076639b805928ecb8ce46eChristian MaederfromAParser :: Pretty a => AParser () a -> StringParser
10b02b2343246df6773585636fe3ddbefa3b6a1bChristian MaederfromAParser p ga = fmap (flip (showGlobalDoc ga) "") p
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian MaedertoStringParser :: Pretty a => (GlobalAnnos -> AParser () a) -> StringParser
10b02b2343246df6773585636fe3ddbefa3b6a1bChristian MaedertoStringParser p ga = fmap (flip (showGlobalDoc ga) "") $ p ga
9a648682ccaa8ef63583548c3edb01c6542d7885Christian Maederexec :: [(String, StringParser)] -> [(String, StringParser)] -> IO ()
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maederexec lps fps = do
605065f212e589cd3ea24be7db99a71aeb858215Christian Maeder setStdEnc Utf8
6bcdf8fc684a7a2d03f41bba002cfeaa0fbe023cChristian Maeder [] -> parseSpec emptyGlobalAnnos . snd $ head fps
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder opt : tl -> do
9029484754c7b2037321e7cbd077580866845265Christian Maeder let lps' = filter (\ (s, _) -> s == opt) lps
9029484754c7b2037321e7cbd077580866845265Christian Maeder fps' = filter (\ (s, _) -> s == opt) fps
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder ga <- case tl of
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder [] -> return emptyGlobalAnnos
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder annoFile : _ -> do
5a448e9be8c4482a978b174b744237757335140fChristian Maeder str <- readFile annoFile
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder maybe (error "run parser") return $ maybeResult
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder $ addGlobalAnnos emptyGlobalAnnos
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder $ parseString annotations str
5a448e9be8c4482a978b174b744237757335140fChristian Maeder -- should not fail but may return empty annos
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder case (lps', fps') of
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder ([], []) -> do
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder putStrLn ("unknown option: " ++ opt)
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder p <- getProgName
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder putStrLn $ "Usage: " ++ p ++ " [OPTIONS] <Annotations> < infile"
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder putStrLn "where OPTIONS is one of:"
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder putStrLn $ unwords $ map fst lps ++ map fst fps
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder ([], (_, hd) : _) -> parseSpec ga hd
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder ((_, hd) : _, _) -> checkLines ga hd
9a648682ccaa8ef63583548c3edb01c6542d7885Christian MaedercheckLines :: GlobalAnnos -> StringParser -> IO ()
95834d47204eec8e8a076639b805928ecb8ce46eChristian MaedercheckLines ga p =
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder getContents >>= putStr . unlines . scanLines ga p 1 . lines
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian MaederscanLines :: GlobalAnnos -> StringParser -> Line -> [String] -> [String]
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian MaederscanLines ga p n inp = case inp of
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder x : l -> parseLine ga p x n : scanLines ga p (n + 1) l
9a648682ccaa8ef63583548c3edb01c6542d7885Christian MaederparseLine :: GlobalAnnos -> StringParser -> String -> Line -> String
95834d47204eec8e8a076639b805928ecb8ce46eChristian MaederparseLine ga p line n =
9a648682ccaa8ef63583548c3edb01c6542d7885Christian Maeder let pos = setSourceLine (initialPos "") n
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder setPosition pos
e953bea49e7f0e1a43bccf2a66c5e2a2b50848e0Christian Maeder in showParse $ runParser parser (emptyAnnos ()) "" line
9a648682ccaa8ef63583548c3edb01c6542d7885Christian MaederparseSpec :: GlobalAnnos -> StringParser -> IO ()
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian MaederparseSpec ga p =
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder getContents >>= putStrLn . showParse
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder . runParser (p ga << eof) (emptyAnnos ()) ""
9a648682ccaa8ef63583548c3edb01c6542d7885Christian MaedershowParse :: Either ParseError String -> String
95834d47204eec8e8a076639b805928ecb8ce46eChristian MaedershowParse e = case e of
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder Left err -> "parse error at " ++ showErr err ++ "\n"