summaryrefslogtreecommitdiff
path: root/src/GF/Canon/CanonToJS.hs
diff options
context:
space:
mode:
authorbringert <bringert@cs.chalmers.se>2006-11-30 22:50:25 +0000
committerbringert <bringert@cs.chalmers.se>2006-11-30 22:50:25 +0000
commitba13ff08d2dd38de9abdb8b59125b73471404d44 (patch)
tree0df109b56f1827042f6b6d7ad71cc1dd22decf99 /src/GF/Canon/CanonToJS.hs
parentc2ecc9d5543a7fc495edbe03ec8cb2e9632dc774 (diff)
Added the beginnings of GFCC to JavaScript conversion.
Diffstat (limited to 'src/GF/Canon/CanonToJS.hs')
-rw-r--r--src/GF/Canon/CanonToJS.hs48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/GF/Canon/CanonToJS.hs b/src/GF/Canon/CanonToJS.hs
new file mode 100644
index 000000000..484ebcac8
--- /dev/null
+++ b/src/GF/Canon/CanonToJS.hs
@@ -0,0 +1,48 @@
+module GF.Canon.CanonToJS (prCanon2js) where
+
+import GF.Canon.GFC
+import GF.Canon.CanonToGFCC
+import qualified GF.Canon.GFCC.AbsGFCC as C
+import qualified GF.JavaScript.AbsJS as JS
+import qualified GF.JavaScript.PrintJS as JS
+
+
+prCanon2js :: CanonGrammar -> String
+prCanon2js = JS.printTree . gfcc2js . mkCanon2gfcc
+
+gfcc2js :: C.Grammar -> JS.Program
+gfcc2js (C.Grm _ _ cs) = concrete2js (head cs) -- FIXME
+
+concrete2js :: C.Concrete -> JS.Program
+concrete2js (C.Cnc c ds) = JS.Program (map cncdef2js ds)
+
+cncdef2js :: C.CncDef -> JS.Element
+cncdef2js (C.Lin (C.CId f) t) =
+ JS.FunDef (JS.Ident ("lin_"++f)) [children] [JS.Return (term2js t)]
+
+term2js :: C.Term -> JS.Expr
+term2js t =
+ case t of
+ C.R xs -> call "arr" (map term2js xs)
+ C.P x y -> JS.EMember (term2js x) (term2js y)
+ C.S xs -> call "seq" (map term2js xs)
+ C.K t -> tokn2js t
+ C.V i -> JS.EIndex (JS.EVar children) (JS.EInt i)
+ C.C i -> JS.EInt i
+ C.F (C.CId f) -> call ("lin_"++f) [JS.EVar children]
+ C.FV xs -> call "variants" (map term2js xs)
+ C.W str x -> call "suffix" [JS.EStr str, term2js x]
+ C.RP x y -> call "rp" [term2js x, term2js y]
+ C.TM -> call "meta" []
+
+argIdent :: Integer -> JS.Ident
+argIdent n = JS.Ident ("x" ++ show n)
+
+tokn2js :: C.Tokn -> JS.Expr
+tokn2js (C.KS s) = JS.EStr s
+
+children :: JS.Ident
+children = JS.Ident "cs"
+
+call :: String -> [JS.Expr] -> JS.Expr
+call f xs = JS.ECall (JS.EVar (JS.Ident f)) xs