summaryrefslogtreecommitdiff
path: root/src/compiler/GF/Compile/PGFtoJSON.hs
blob: 6563ea6c8d8823723dee6773dade04292155f4f6 (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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
module GF.Compile.PGFtoJSON (pgf2json) where

import PGF(showCId)
import PGF.Internal as M

import qualified Text.JSON as JSON
import Text.JSON (JSValue(..))
-- import Text.JSON.Pretty (pp_value)
-- import Text.PrettyPrint (render)

--import GF.Data.ErrM
--import GF.Infra.Option

--import Control.Monad (mplus)
--import Data.Array.Unboxed (UArray)
import qualified Data.Array.IArray as Array
--import Data.Maybe (fromMaybe)
import Data.Map (Map)
import qualified Data.Set as Set
import qualified Data.Map as Map
import qualified Data.IntMap as IntMap

pgf2json :: PGF -> String
pgf2json pgf =
  JSON.encode $ JSON.makeObj
  -- render $ pp_value $ JSON.makeObj
    [ ("abstract", json_abstract)
    , ("concretes", json_concretes)
    ]
 where
   n  = showCId $ absname pgf
   as = abstract pgf
   cs = Map.assocs (concretes pgf)
   start = showCId $ M.lookStartCat pgf
   json_abstract = abstract2json n start as
   json_concretes = JSON.makeObj $ map concrete2json cs

abstract2json :: String -> String -> Abstr -> JSValue
abstract2json name start ds =
  JSON.makeObj
    [ ("name", JSString $ JSON.toJSString name)
    , ("startcat", JSString $ JSON.toJSString start)
    , ("funs", JSON.makeObj $ map absdef2js (Map.assocs (funs ds)))
    ]

-- abstract2js :: String -> Abstr -> JS.Expr
-- abstract2js start ds = new "GFAbstract" [JS.EStr start, JS.EObj $ map absdef2js (Map.assocs (funs ds))]

absdef2js :: (CId,(Type,Int,Maybe ([Equation],[[M.Instr]]),Double)) -> (String,JSValue)
absdef2js (f,(typ,_,_,_)) = (showCId f,sig)
  where
    (args,cat) = M.catSkeleton typ
    sig = JSON.makeObj
      [ ("args", JSArray $ map (mkJSString.showCId) args)
      , ("cat", mkJSString $ showCId cat)
      ]

mkJSString :: String -> JSValue
mkJSString = JSString . JSON.toJSString

-- lit2js (LStr s) = JS.EStr s
-- lit2js (LInt n) = JS.EInt n
-- lit2js (LFlt d) = JS.EDbl d

concrete2json :: (CId,Concr) -> (String,JSValue)
concrete2json (c,cnc) = (showCId c,JSNull)

-- concrete2js :: (CId,Concr) -> JS.Property
-- concrete2js (c,cnc) =
--   JS.Prop l (new "GFConcrete" [mapToJSObj (lit2js) $ cflags cnc,
--                                JS.EObj $ [JS.Prop (JS.IntPropName cat) (JS.EArray (map frule2js (Set.toList set))) | (cat,set) <- IntMap.toList (productions cnc)],
--                                JS.EArray $ (map ffun2js (Array.elems (cncfuns cnc))),
--                                JS.EArray $ (map seq2js (Array.elems (sequences cnc))),
--                                JS.EObj $ map cats (Map.assocs (cnccats cnc)),
--                                JS.EInt (totalCats cnc)])
--   where
--    l  = JS.IdentPropName (JS.Ident (showCId c))
-- {-
--    litslins = [JS.Prop (JS.StringPropName    "Int") (JS.EFun [children] [JS.SReturn $ new "Arr" [JS.EIndex (JS.EVar children) (JS.EInt 0)]]),
--                JS.Prop (JS.StringPropName  "Float") (JS.EFun [children] [JS.SReturn $ new "Arr" [JS.EIndex (JS.EVar children) (JS.EInt 0)]]),
--                JS.Prop (JS.StringPropName "String") (JS.EFun [children] [JS.SReturn $ new "Arr" [JS.EIndex (JS.EVar children) (JS.EInt 0)]])]
-- -}
--    cats (c,CncCat start end _) = JS.Prop (JS.IdentPropName (JS.Ident (showCId c))) (JS.EObj [JS.Prop (JS.IdentPropName (JS.Ident "s")) (JS.EInt start)
--                                                                                             ,JS.Prop (JS.IdentPropName (JS.Ident "e")) (JS.EInt end)])
-- {-
-- mkStr :: String -> JS.Expr
-- mkStr s = new "Str" [JS.EStr s]
-- 
-- mkSeq :: [JS.Expr] -> JS.Expr
-- mkSeq [x] = x
-- mkSeq xs = new "Seq" xs
-- 
-- argIdent :: Integer -> JS.Ident
-- argIdent n = JS.Ident ("x" ++ show n)
-- -}
-- children :: JS.Ident
-- children = JS.Ident "cs"
-- 
-- frule2js :: Production -> JS.Expr
-- frule2js (PApply funid args) = new "Apply"  [JS.EInt funid, JS.EArray (map farg2js args)]
-- frule2js (PCoerce arg)       = new "Coerce" [JS.EInt arg]
-- 
-- farg2js (PArg hypos fid) = new "PArg" (map (JS.EInt . snd) hypos ++ [JS.EInt fid])
-- 
-- ffun2js (CncFun f lins) = new "CncFun" [JS.EStr (showCId f), JS.EArray (map JS.EInt (Array.elems lins))]
-- 
-- seq2js :: Array.Array DotPos Symbol -> JS.Expr
-- seq2js seq = JS.EArray [sym2js s | s <- Array.elems seq]
-- 
-- sym2js :: Symbol -> JS.Expr
-- sym2js (SymCat n l)    = new "SymCat" [JS.EInt n, JS.EInt l]
-- sym2js (SymLit n l)    = new "SymLit" [JS.EInt n, JS.EInt l]
-- sym2js (SymVar n l)    = new "SymVar" [JS.EInt n, JS.EInt l]
-- sym2js (SymKS t)       = new "SymKS"  [JS.EStr t]
-- sym2js (SymKP ts alts) = new "SymKP"  [JS.EArray (map sym2js ts), JS.EArray (map alt2js alts)]
-- sym2js SymBIND         = new "SymKS"  [JS.EStr "&+"]
-- sym2js SymSOFT_BIND    = new "SymKS"  [JS.EStr "&+"]
-- sym2js SymSOFT_SPACE   = new "SymKS"  [JS.EStr "&+"]
-- sym2js SymCAPIT        = new "SymKS"  [JS.EStr "&|"]
-- sym2js SymALL_CAPIT    = new "SymKS"  [JS.EStr "&|"]
-- sym2js SymNE           = new "SymNE"  []
-- 
-- alt2js (ps,ts) = new "Alt" [JS.EArray (map sym2js ps), JS.EArray (map JS.EStr ts)]
-- 
-- new :: String -> [JS.Expr] -> JS.Expr
-- new f xs = JS.ENew (JS.Ident f) xs
-- 
-- mapToJSObj :: (a -> JS.Expr) -> Map CId a -> JS.Expr
-- mapToJSObj f m = JS.EObj [ JS.Prop (JS.IdentPropName (JS.Ident (showCId k))) (f v) | (k,v) <- Map.toList m ]