summaryrefslogtreecommitdiff
path: root/src/GF/Grammar/API.hs
blob: f1d70e470f291bd0416d3e35d3db861a2f05500b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
module GF.Grammar.API (
  Grammar,
  emptyGrammar,
  checkTerm,
  computeTerm,
  showTerm,
  TermPrintStyle(..), TermPrintQual(..),
  ) where

import GF.Infra.Ident
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 (justCheckLTerm)
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 = do
  t1 <- renameSourceTerm gr m t
  justCheckLTerm gr t1

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