diff options
| author | bringert <bringert@cs.chalmers.se> | 2006-11-30 22:50:25 +0000 |
|---|---|---|
| committer | bringert <bringert@cs.chalmers.se> | 2006-11-30 22:50:25 +0000 |
| commit | ba13ff08d2dd38de9abdb8b59125b73471404d44 (patch) | |
| tree | 0df109b56f1827042f6b6d7ad71cc1dd22decf99 /src/GF/Canon/CanonToJS.hs | |
| parent | c2ecc9d5543a7fc495edbe03ec8cb2e9632dc774 (diff) | |
Added the beginnings of GFCC to JavaScript conversion.
Diffstat (limited to 'src/GF/Canon/CanonToJS.hs')
| -rw-r--r-- | src/GF/Canon/CanonToJS.hs | 48 |
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 |
