----------------------------------------------------------------------------- -- | -- Module : Main -- Copyright : (c) Brent Yorgey 2011 -- License : BSD-style (see LICENSE) -- Maintainer : Brent Yorgey -- Stability : experimental -- -- Ott () is a tool for writing -- formal definitions of programming languages and calculi. Often the -- Ott grammars one defines end up being ambiguous, and Ott signals -- its displeasure by spewing forth several massive parse trees in a -- format requiring formidable patience to read. Finding the slight -- differences between two such parse trees is an exercise in -- seizure-inducing tedium. -- -- To the rescue comes ottparse-pretty! Simply paste in each parse -- and it is shown to you in a nicely formatted tree form with all the -- extra meaningless cruft removed. -- -- For example, it turns this: -- -- @ -- (St_node :formula:formula_judgement: (Ste_st (St_node :judgement:judgement_Jtype: (Ste_st (St_node :Jtype:coerce: (Ste_st (St_nonterm G)) (Ste_st (St_nonterm g)) (Ste_st (St_node :s:T_MultiTypeApp: (Ste_st (St_node :s:T_EqTy: (Ste_st (St_node :s:T_MultiTypeApp: (Ste_st (St_node :s:T_MultiKindApp: (Ste_st (St_node :s:T_Cons: (Ste_st (St_nonterm H)))) (Ste_st (St_nonterm k)))) (Ste_st (St_nonterm t)))) (Ste_st (St_node :s:T_MultiKindApp: (Ste_st (St_node :s:T_Cons: (Ste_st (St_nonterm H)))) (Ste_st (St_nonterm k)))))) (Ste_st (St_nonterm t'))))))))) -- @ -- -- into this: -- -- @ -- formula_judgement -- | -- `- judgement_Jtype -- | -- `- coerce -- | -- +- G -- | -- +- g -- | -- `- T_MultiTypeApp -- | -- +- T_EqTy -- | | -- | +- T_MultiTypeApp -- | | | -- | | +- T_MultiKindApp -- | | | | -- | | | +- T_Cons -- | | | | | -- | | | | `- H -- | | | | -- | | | `- k -- | | | -- | | `- t -- | | -- | `- T_MultiKindApp -- | | -- | +- T_Cons -- | | | -- | | `- H -- | | -- | `- k -- | -- `- t' -- @ -- ----------------------------------------------------------------------------- import Text.Ott.Pretty import System.IO (hSetBuffering, BufferMode(..), stdout) import Control.Monad (forever) import Text.Parsec (runParser) import Data.Tree (drawTree) main :: IO () main = do hSetBuffering stdout NoBuffering forever interpTree interpTree :: IO () interpTree = do putStr "> " tStr <- getLine case runParser parseTree () "" tStr of Left err -> print err Right t -> putStr $ drawTree (normalizeTree t)