-- | This small utility allows us to turn a formal language description into
-- either a LaTeX source file or a Haskell module.
module Main where
import System.Console.CmdArgs
import System.IO (openFile, hClose, IOMode (..))
import Text.PrettyPrint.ANSI.Leijen (hPutDoc)
import Data.Foldable (toList)
import FormalLanguage.CFG.Grammar
import FormalLanguage.CFG.Parser
import FormalLanguage.CFG.PrettyPrint.ANSI (printDoc, genGrammarDoc)
import FormalLanguage.CFG.PrettyPrint.Haskell (grammarHaskell)
import FormalLanguage.CFG.PrettyPrint.LaTeX (renderFile, renderLaTeX)
data Options
= LaTeX
{ inFile :: String
, outFile ::String
}
| Ansi
{ inFile :: String
}
| Haskell
{ inFile :: String
, outFile :: String
}
deriving (Show,Data,Typeable)
optionLatex = LaTeX
{ inFile = ""
, outFile = ""
}
optionAnsi = Ansi
{ inFile = ""
}
optionHaskell = Haskell
{ inFile = ""
, outFile = ""
}
main = do
o <- cmdArgs $ modes [{- optionLatex, -} optionAnsi]
-- print o
pr <- case (inFile o) of
"" -> getContents >>= return . parse
fn -> readFile fn >>= return . parse
case pr of
Failure f -> printDoc f
Success s -> case o of
-- LaTeX{..} -> case outFile of
-- "" -> error "need to set output file name"
-- fn -> renderFile fn $ renderLaTeX 2 s
Ansi {..} -> mapM_ (printDoc . genGrammarDoc) $ toList s
-- Haskell{..} -> case outFile of
-- "" -> printDoc $ grammarHaskell s
-- fn -> do h <- openFile fn WriteMode
-- hPutDoc h $ grammarHaskell s
-- hClose h