summaryrefslogtreecommitdiff
path: root/src/GF/Compile/RemoveLiT.hs
blob: 14a9a1da1d06b67413d811d350c650716fa3a737 (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
57
58
59
60
61
----------------------------------------------------------------------
-- |
-- Module      : RemoveLiT
-- Maintainer  : AR
-- Stability   : (stable)
-- Portability : (portable)
--
-- > CVS $Date: 2005/04/21 16:21:45 $ 
-- > CVS $Author: bringert $
-- > CVS $Revision: 1.6 $
--
-- remove obsolete (Lin C) expressions before doing anything else. AR 21/6/2003
--
-- What the program does is replace the occurrences of Lin C with the actual
-- definition T given in lincat C = T ; with {s : Str} if no lincat is found.
-- The procedure is uncertain, if T contains another Lin.
-----------------------------------------------------------------------------

module GF.Compile.RemoveLiT (removeLiT) where

import GF.Grammar.Grammar
import GF.Infra.Ident
import GF.Infra.Modules
import GF.Grammar.Macros
import GF.Grammar.Lookup
import GF.Grammar.Predef

import GF.Data.Operations

import Control.Monad

removeLiT :: SourceGrammar -> Err SourceGrammar
removeLiT gr = liftM MGrammar $ mapM (remlModule gr) (modules gr)

remlModule :: SourceGrammar -> SourceModule -> Err SourceModule
remlModule gr mi@(name,mo) = do
  js1 <- mapMTree (remlResInfo gr) (jments mo)
  return (name,mo{jments = js1})

remlResInfo :: SourceGrammar -> (Ident,Info) -> Err Info
remlResInfo gr (i,info) = case info of
  ResOper pty ptr    -> liftM2 ResOper (ren pty) (ren ptr)
  CncCat pty ptr ppr -> liftM3 CncCat (ren pty) (ren ptr) (ren ppr)
  CncFun mt  ptr ppr -> liftM2 (CncFun mt)      (ren ptr) (ren ppr)
  _ -> return info
 where 
   ren = remlPerh gr

remlPerh gr pt = case pt of
  Yes t -> liftM Yes $ remlTerm gr t
  _ -> return pt

remlTerm :: SourceGrammar -> Term -> Err Term
remlTerm gr trm = case trm of
  LiT c -> look c >>= remlTerm gr
  _ -> composOp (remlTerm gr) trm
 where
   look c = err (const $ return defLinType) return $ lookupLincat gr m c
   m = case [cnc | (cnc,m) <- modules gr, isModCnc m] of
     cnc:_ -> cnc   -- actually there is always exactly one
     _     -> cCNC