module Parse(read, show, term)
where 

import "cn.hs"

readTerm :: ReadS Term -- the global entry point

readVec  :: [Term] -> ReadS Term -- read an application
readVec l  string = (\s -> 
		     let rt = readTerm s in 
		     if null rt then [(flatten l,s)]
		     else rt >>= (\(r,rr) -> readVec (r:l) rr)) string

flatten  :: [Term] -> Term
flatten [a] = a
flatten (a:as) = App (flatten as) a

readSingleVar :: ReadS Term  -- try to read an Integer, interpreted as Var
readSingleVar s = lex s >>= (\(s,ss) -> reads s >>= (\(n,_) -> [(Var n,ss)]))


-- -------------------------------------------------------------------

readTerm string = ((\ string -> lex string >>= 
		    (\(s,ss) -> 
		    if s=="" then [] else
		    if s=="." then readVec [] ss else
		    if s=="L" then [(Lam r,rr) | (r,rr) <- 
				    (readParen False readTerm ss)] else
		    if s=="B" then [(Bet r,rr) | (r,rr) <- 
				    (readParen False readTerm ss)] else
		    if s=="R" then [(Rep r,rr) | (r,rr) <- 
				    (readParen False readTerm ss)] 
		    else reads s >>= (\(n,_) -> [((Var n),ss)]))) string)
		  ++ readParen True (readVec []) string

instance Read Term where
		   readsPrec _ s = readTerm ( "(" ++ s ++ ")" )
				   
term :: String -> Term
term = read
       



