packages feed

uAgda-1.2.0.0: Main.hs

module Main where


import System.IO ( stdin, hGetContents )
import System.Environment ( getArgs )
import Options 
import qualified Normal

{-
import LexSyntax
import ParSyntax
import SkelSyntax
import PrintSyntax
-}

import RawSyntax
import AbsSynToTerm
import TypeCheckerNF
import Basics
import Terms
import Display
import Text.PrettyPrint.HughesPJ (render)
import qualified Data.Sequence as S


import Language.LBNF.Runtime (ParseMonad(..))

-- type ParseFun a = [Token] -> Err a

myLLexer = tokens -- myLexer

type Verbosity = Int

putStrV :: Verbosity -> Doc -> IO ()
putStrV v s = if verb options >= v then putStrLn (render s) else return ()

runFile f = do
  putStrV 1 $ "Processing file:" <+> text f
  contents <- readFile f
  run contents f

instance Pretty Token where
    pretty = text . show

run s fname = let ts = myLLexer s in case pExp ts of
   Bad err -> do 
     putStrLn "Parse Failed."
     putStrV 1 $ "Tokens:" <+> pretty ts
     putStrLn $ fname ++ ":" ++ err
     return False
   Ok tree -> do 
     process fname tree

process fname modul = do
  let resolved = runResolver $ resolveTerm modul
  -- putStrV 2 $ "\n[Abstract Syntax]\n\n" ++ show tree
  -- putStrV 2 $ "\n[Linearized tree]\n\n" ++ printTree tree
  putStrV 2 $ "[Resolved into]" $$ pretty resolved
  let (checked,info) = runChecker $ iType mempty resolved
  case info of
    [] -> return ()
    _ -> putStrV 0 $ vcat info -- display constraints, etc.
  case checked of
    Right (a,b,_) -> do 
       putStrV 0 $ "nf =" <+> pretty a
       putStrV 0 $ "ty =" <+> pretty b
{-
       case b of 
         (Pi i s t) -> do
           putStrV v $ "s ∈ ⟦S⟧ =" <+> prettyTerm (S.singleton i) (zerInRel s)
           putStrV v $ "T =" <+> prettyTerm (S.singleton i) t
         _ -> putStrV v "not a function!"
-}
       return True
    Left (e,err) -> do let Irr (line,col) = termPosition e 
                       putStrV 0 (text fname <> ":" <> pretty line <> ":" <> pretty (col - 1) <> ":" <+> err)
                       return False
      
{-
showTree tree
 = do
      putStrV 2 $ "\n[Abstract Syntax]\n\n" ++ show tree
      putStrV 2 $ "\n[Linearized tree]\n\n" ++ printTree tree
-}

main :: IO ()
main = do 
  results <- mapM runFile (files options)
  let oks = filter id results
  putStrV 0 $ pretty (length oks) <> "/" <> pretty (length results) <+> "files typecheck."