9a648682ccaa8ef63583548c3edb01c6542d7885Christian Maeder{- |
e9458b1a7a19a63aa4c179f9ab20f4d50681c168Jens ElknerModule : ./Common/RunParsers.hs
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
9a648682ccaa8ef63583548c3edb01c6542d7885Christian Maeder
3f69b6948966979163bdfe8331c38833d5d90ecdChristian MaederMaintainer : Christian.Maeder@dfki.de
9a648682ccaa8ef63583548c3edb01c6542d7885Christian MaederStability : provisional
9a648682ccaa8ef63583548c3edb01c6542d7885Christian MaederPortability : portable
f3a94a197960e548ecd6520bb768cb0d547457bbChristian Maeder
e6d40133bc9f858308654afb1262b8b483ec5922Till Mossakowskitest some parsers (and printers)
9a648682ccaa8ef63583548c3edb01c6542d7885Christian Maeder-}
9a648682ccaa8ef63583548c3edb01c6542d7885Christian Maeder
95834d47204eec8e8a076639b805928ecb8ce46eChristian Maedermodule Common.RunParsers (exec, StringParser, toStringParser, fromAParser)
95834d47204eec8e8a076639b805928ecb8ce46eChristian Maeder where
9a648682ccaa8ef63583548c3edb01c6542d7885Christian Maeder
10b02b2343246df6773585636fe3ddbefa3b6a1bChristian Maederimport Common.AnalyseAnnos (addGlobalAnnos)
bccea164bdfc2ddc3d1e20749bb5477a46eab3a6Christian Maederimport Common.AnnoParser
9a648682ccaa8ef63583548c3edb01c6542d7885Christian Maederimport Common.AnnoState
95834d47204eec8e8a076639b805928ecb8ce46eChristian Maederimport Common.DocUtils
9a648682ccaa8ef63583548c3edb01c6542d7885Christian Maederimport Common.GlobalAnnotations
10b02b2343246df6773585636fe3ddbefa3b6a1bChristian Maederimport Common.Lexer (parseString)
10b02b2343246df6773585636fe3ddbefa3b6a1bChristian Maederimport Common.Parsec ((<<))
3141ac1ae0a0b9f86af05f439bc79316451b94f3Carsten Fischerimport Common.Result
605065f212e589cd3ea24be7db99a71aeb858215Christian Maederimport Common.IO
10b02b2343246df6773585636fe3ddbefa3b6a1bChristian Maeder
9a648682ccaa8ef63583548c3edb01c6542d7885Christian Maederimport System.Environment
9a648682ccaa8ef63583548c3edb01c6542d7885Christian Maeder
10b02b2343246df6773585636fe3ddbefa3b6a1bChristian Maederimport Text.ParserCombinators.Parsec
10b02b2343246df6773585636fe3ddbefa3b6a1bChristian Maederimport Text.ParserCombinators.Parsec.Pos
10b02b2343246df6773585636fe3ddbefa3b6a1bChristian Maeder
414ffa281d82f05a2d742c702f8e06b0cb05b229Christian Maedertype StringParser = GlobalAnnos -> AParser () String
9a648682ccaa8ef63583548c3edb01c6542d7885Christian Maeder
95834d47204eec8e8a076639b805928ecb8ce46eChristian MaederfromAParser :: Pretty a => AParser () a -> StringParser
10b02b2343246df6773585636fe3ddbefa3b6a1bChristian MaederfromAParser p ga = fmap (flip (showGlobalDoc ga) "") p
9a648682ccaa8ef63583548c3edb01c6542d7885Christian Maeder
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian MaedertoStringParser :: Pretty a => (GlobalAnnos -> AParser () a) -> StringParser
10b02b2343246df6773585636fe3ddbefa3b6a1bChristian MaedertoStringParser p ga = fmap (flip (showGlobalDoc ga) "") $ p ga
9a648682ccaa8ef63583548c3edb01c6542d7885Christian Maeder
9a648682ccaa8ef63583548c3edb01c6542d7885Christian Maederexec :: [(String, StringParser)] -> [(String, StringParser)] -> IO ()
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maederexec lps fps = do
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder l <- getArgs
605065f212e589cd3ea24be7db99a71aeb858215Christian Maeder setStdEnc Utf8
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder case l of
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 Maeder
9a648682ccaa8ef63583548c3edb01c6542d7885Christian MaedercheckLines :: GlobalAnnos -> StringParser -> IO ()
95834d47204eec8e8a076639b805928ecb8ce46eChristian MaedercheckLines ga p =
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder getContents >>= putStr . unlines . scanLines ga p 1 . lines
9a648682ccaa8ef63583548c3edb01c6542d7885Christian Maeder
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian MaederscanLines :: GlobalAnnos -> StringParser -> Line -> [String] -> [String]
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian MaederscanLines ga p n inp = case inp of
cdb68707ccdbff6aef4f34a897a8650515685feeChristian Maeder [] -> []
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder x : l -> parseLine ga p x n : scanLines ga p (n + 1) l
9a648682ccaa8ef63583548c3edb01c6542d7885Christian Maeder
9a648682ccaa8ef63583548c3edb01c6542d7885Christian MaederparseLine :: GlobalAnnos -> StringParser -> String -> Line -> String
95834d47204eec8e8a076639b805928ecb8ce46eChristian MaederparseLine ga p line n =
9a648682ccaa8ef63583548c3edb01c6542d7885Christian Maeder let pos = setSourceLine (initialPos "") n
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder parser = do
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder setPosition pos
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder i <- p ga
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder eof
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder return i
e953bea49e7f0e1a43bccf2a66c5e2a2b50848e0Christian Maeder in showParse $ runParser parser (emptyAnnos ()) "" line
9a648682ccaa8ef63583548c3edb01c6542d7885Christian Maeder
9a648682ccaa8ef63583548c3edb01c6542d7885Christian MaederparseSpec :: GlobalAnnos -> StringParser -> IO ()
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian MaederparseSpec ga p =
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder getContents >>= putStrLn . showParse
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder . runParser (p ga << eof) (emptyAnnos ()) ""
9a648682ccaa8ef63583548c3edb01c6542d7885Christian Maeder
9a648682ccaa8ef63583548c3edb01c6542d7885Christian MaedershowParse :: Either ParseError String -> String
95834d47204eec8e8a076639b805928ecb8ce46eChristian MaedershowParse e = case e of
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder Left err -> "parse error at " ++ showErr err ++ "\n"
50e3ab1e0cfdc82e3ba02da47b24635a808b331cChristian Maeder Right x -> x