module GF.Grammar.API ( Grammar, emptyGrammar, checkTerm, computeTerm, showTerm, TermPrintStyle(..), TermPrintQual(..), ) where import GF.Infra.Ident import GF.Infra.CheckM import GF.Infra.Modules (greatestResource) import GF.Compile.GetGrammar import GF.Grammar.Macros import GF.Grammar.Parser import GF.Grammar.Printer import GF.Grammar.Grammar import GF.Compile.Rename (renameSourceTerm) import GF.Compile.CheckGrammar (inferLType) import GF.Compile.Compute (computeConcrete) import GF.Data.Operations import GF.Infra.Option import qualified Data.ByteString.Char8 as BS import Text.PrettyPrint type Grammar = SourceGrammar emptyGrammar :: Grammar emptyGrammar = emptySourceGrammar checkTerm :: Grammar -> Term -> Err Term checkTerm gr t = do mo <- maybe (Bad "no source grammar in scope") return $ greatestResource gr checkTermAny gr mo t checkTermAny :: Grammar -> Ident -> Term -> Err Term checkTermAny gr m t = (fmap fst . runCheck) $ do t <- renameSourceTerm gr m t (t,_) <- inferLType gr [] t return t computeTerm :: Grammar -> Term -> Err Term computeTerm = computeConcrete showTerm :: TermPrintStyle -> TermPrintQual -> Term -> String showTerm style q t = render $ case style of TermPrintTable -> vcat [p <+> s | (p,s) <- ppTermTabular q t] TermPrintAll -> vcat [ s | (p,s) <- ppTermTabular q t] TermPrintDefault -> ppTerm q 0 t data TermPrintStyle = TermPrintTable | TermPrintAll | TermPrintDefault