module Parsing.TestProgram where
import System.IO ( stdin, hGetContents )
import System.Environment ( getArgs, getProgName )
import GHC.Exts
import Control.Monad
import Control.Applicative (pure)
import Parsing.Chart hiding (fingerprint,mkTree)
import Data.Matrix.Quad
import Data.Pair
import Algebra.RingUtils
type Verbosity = Int
putStrV :: Verbosity -> String -> IO ()
putStrV v s = if v > 1 then putStrLn s else return ()
mainTest :: forall category token.
(RingP [(category,Any)], Eq category) =>
((category,Any) -> String) ->
(Bool -> token -> Pair [(category,Any)]) ->
(String -> [token]) ->
(token -> (Int,Int)) ->
(category -> String) ->
(category -> [category]) ->
IO ()
mainTest showAst cnfToksToCat myLLexer getTokPos describe follows =
do args <- getArgs
case args of
[] -> hGetContents stdin >>= run "stdin" 2
"-s":fs -> mapM_ (runFile 0) fs
fs -> mapM_ (runFile 2) fs
where
neighbors a b = b `elem` follows a
showResults :: [(category,Any)] -> IO ()
showResults x = do
putStrLn $ show (length x) ++ " results"
forM_ x $ \(cat,ast) -> do
putStrLn $ describe cat
putStrLn $ showAst (cat,ast)
runFile v f = putStrLn f >> readFile f >>= run f v
run f v s =
do case rs of
[(_,x,_)] -> showResults x
_ -> do let errs = pairs rs
best = minimum $ map quality errs
mapM_ (putStrLn . showErr ts) $ filter (\x -> quality x == best) errs
when (v >= 2) $ do
writeFile (f ++ ".xpm") (genXPM $ fingerprint chart)
let scatt = scatterplot chart
putStrLn $ "Scatterplot data size:" ++ show (length scatt)
writeFile (f ++ ".data") scatt
where ts = myLLexer s
chart = mkTree $ zipWith cnfToksToCat (cycle [False,True]) ts
rs = results chart
showTokPos :: (Int,Int) -> String
showTokPos (l,c) = show l ++ "," ++ show (c1)
showPos :: [token] -> Int -> String
showPos ts x = showTokPos (getTokPos $ ts !! x)
showErr ts ((_,x',p),(_,y',_)) =
showPos ts p ++ ": cannot combine " ++ showBestCat x' ++ " with " ++ showBestCat y'
quality (a@(_,x',p),b@(_,y',_)) = (or [ neighbors x y | x <- map fst x', y <- map fst y'],
(resSz a) Prelude.+ (resSz b))
showBestCat ((x,_):_) = describe x
pairs (x:y:xs) = (x,y):pairs (y:xs)
pairs _ = []
resSz (i,_,j) = ji