summaryrefslogtreecommitdiff
path: root/src/GF/API/IOGrammar.hs
blob: a00ef18a6b375b9353c03d51a3f05b1f689d946b (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
module IOGrammar where

import Option
import Abstract
import qualified GFC
import PGrammar
import TypeCheck
import Compile
import ShellState

import Operations
import UseIO
import Arch

import Monad (liftM)

-- for reading grammars and terms from strings and files

--- a heuristic way of renaming constants is used
string2absTerm :: String -> String -> Term 
string2absTerm m = renameTermIn m . pTrm

renameTermIn :: String -> Term -> Term
renameTermIn m = refreshMetas [] . rename [] where
  rename vs t = case t of
    Abs x b -> Abs x (rename (x:vs) b)
    Vr c    -> if elem c vs then t else Q (zIdent m) c
    App f a -> App (rename vs f) (rename vs a)
    _ -> t

string2annotTree :: GFC.CanonGrammar -> Ident -> String -> Err Tree
string2annotTree gr m = annotate gr . string2absTerm (prt m) ---- prt

----string2paramList :: ConcreteST -> String -> [Term]
---string2paramList st = map (renameTrm (lookupConcrete st) . patt2term) . pPattList

shellStateFromFiles :: Options -> ShellState -> FilePath -> IOE ShellState
shellStateFromFiles opts st file = do
  let osb = addOptions (options [beVerbose, emitCode]) opts ---
  grts <- compileModule osb st file
  ioeErr $ updateShellState opts st grts
  --- liftM (changeModTimes rts) $ grammar2shellState opts gr