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

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

import Modules
import Option
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 = case fileSuffix file of
  "cf" -> do
     let opts' = addOptions (options [beVerbose]) opts
     sgr <- getCFGrammar opts' file
     ioeIO $ print sgr -----
     return st
  "gfcm" -> do
     (_,_,cgr) <- compileOne opts (compileEnvShSt st []) file
     ioeErr $ updateShellState opts st (cgr,(emptyMGrammar,[]))  
  _ -> do
     let osb = if oElem showOld opts 
                 then addOptions (options [beVerbose]) opts -- for old, no emit
                 else addOptions (options [beVerbose, emitCode]) opts -- for new,do
     grts <- compileModule osb st file
     ioeErr $ updateShellState opts st grts
     --- liftM (changeModTimes rts) $ grammar2shellState opts gr