RunParsers.hs revision bccea164bdfc2ddc3d1e20749bb5477a46eab3a6
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian Maeder{- |
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian MaederModule : $Header$
8ce7b6b96b208cc772742a84faa31ce4bd746066Christian MaederDescription : test some parsers (and printers)
8ce7b6b96b208cc772742a84faa31ce4bd746066Christian MaederCopyright : (c) Christian Maeder and Uni Bremen 2002-2003
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian MaederLicense : similar to LGPL, see HetCATS/LICENSE.txt or LIZENZ.txt
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian MaederMaintainer : Christian.Maeder@dfki.de
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian MaederStability : provisional
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian MaederPortability : portable
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maedertest some parsers (and printers)
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder-}
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maedermodule Common.RunParsers (exec, StringParser, toStringParser, fromAParser)
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder where
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maederimport Common.Lexer((<<), parseString)
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maederimport Text.ParserCombinators.Parsec
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maederimport Text.ParserCombinators.Parsec.Pos
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maederimport Common.AnnoParser
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian Maederimport Common.AnnoState
8ce7b6b96b208cc772742a84faa31ce4bd746066Christian Maederimport Common.DocUtils
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian Maederimport Common.GlobalAnnotations
8ce7b6b96b208cc772742a84faa31ce4bd746066Christian Maederimport Common.AnalyseAnnos(addGlobalAnnos)
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian Maederimport Common.Result
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maederimport System.Environment
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian Maedertype StringParser = GlobalAnnos -> AParser () String
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian MaederfromAParser :: Pretty a => AParser () a -> StringParser
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian MaederfromAParser p ga = fmap (\ a -> showGlobalDoc ga a "") p
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian MaedertoStringParser :: Pretty a => (GlobalAnnos -> AParser () a)
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder -> StringParser
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian MaedertoStringParser p ga = fmap (\ a -> showGlobalDoc ga a "") $ p ga
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian Maeder
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maederexec :: [(String, StringParser)] -> [(String, StringParser)] -> IO ()
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian Maederexec lps fps = do l <- getArgs
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder if null l then
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder parseSpec emptyGlobalAnnos $ snd $ head $ fps
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder else do let opt = head l
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian Maeder lps' = filter (\(s, _) -> s == opt) lps
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder fps' = filter (\(s, _) -> s == opt) fps
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder ga <- if not $ null $ tail l then
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder do let annoFile = head (tail l)
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian Maeder str <- readFile annoFile
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder maybe (error "run parser")
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder return $ maybeResult
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder $ addGlobalAnnos emptyGlobalAnnos
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder $ parseString annotations str
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian Maeder -- should not fail
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian Maeder -- but may return empty annos
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian Maeder else return emptyGlobalAnnos
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder if null lps' && null fps' then
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder do putStrLn ("unknown option: " ++ opt)
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian Maeder p <- getProgName
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder putStrLn("Usage: "++p++
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder " [OPTIONS] <Annotations> < infile")
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian Maeder putStrLn "where OPTIONS is one of:"
8ce7b6b96b208cc772742a84faa31ce4bd746066Christian Maeder putStrLn $ unwords
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian Maeder (map fst lps ++ map fst fps)
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder else if null lps'
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder then parseSpec ga $ snd $ head fps'
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder else checkLines ga $ snd $ head lps'
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian MaedercheckLines :: GlobalAnnos -> StringParser -> IO ()
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian MaedercheckLines ga p =
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder do s <- getContents
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder putStr (unlines (scanLines ga p (lines s) 1))
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian MaederscanLines :: GlobalAnnos -> StringParser -> [String] -> Line -> [String]
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian MaederscanLines _ _ [] _ = []
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian MaederscanLines ga p (x:l) n = (parseLine ga p x n) : (scanLines ga p l (n+1))
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian MaederparseLine :: GlobalAnnos -> StringParser -> String -> Line -> String
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian MaederparseLine ga p line n =
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder let pos = setSourceLine (initialPos "") n
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder parser = do setPosition pos
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder i <- p ga
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder eof
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder return i
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian Maeder in showParse $ runParser parser (emptyAnnos ()) "" line
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian Maeder
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian MaederparseSpec :: GlobalAnnos -> StringParser -> IO ()
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian MaederparseSpec ga p = do str <- getContents
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder putStrLn $ showParse $
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder runParser (p ga << eof) (emptyAnnos ()) "" str
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian Maeder
8ce7b6b96b208cc772742a84faa31ce4bd746066Christian MaedershowParse :: Either ParseError String -> String
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian MaedershowParse e = case e of
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder Left err -> "parse error at " ++ showErr err ++ "\n"
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder Right x -> x
add3ebffeda5101eae1f7a952bf7a75382a6a5e4Christian Maeder