From eb7b0286016714128aae742b4cedccc3dc30a9a0 Mon Sep 17 00:00:00 2001 From: aarne Date: Sat, 10 Nov 2007 10:23:35 +0000 Subject: [PATCH] printing grammarReference.js with gfc -jsref --- src/GF/Devel/GFC.hs | 21 +++++++++++---------- src/GF/Devel/GFCCtoJS.hs | 22 +++++++++++++++++++++- src/GF/Devel/PrintGFCC.hs | 1 + 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/GF/Devel/GFC.hs b/src/GF/Devel/GFC.hs index 1e66d29a5..917a469e9 100644 --- a/src/GF/Devel/GFC.hs +++ b/src/GF/Devel/GFC.hs @@ -50,20 +50,21 @@ file2gfcc f = ---- TODO: nicer and richer print options -alsoPrint opts abs gr (opt,name) = - if oElem (iOpt opt) opts - then do - let outfile = name - let output = prGFCC opt gr - writeFile outfile output - putStrLn $ "wrote file " ++ outfile - else return () +alsoPrint opts abs gr (opt,name) = do + if oElem (iOpt opt) opts + then do + let outfile = name + let output = prGFCC opt gr + writeFile outfile output + putStrLn $ "wrote file " ++ outfile + else return () printOptions = [ ("haskell","GSyntax.hs"), ("haskell_gadt","GSyntax.hs"), - ("js","grammar.js") + ("js","grammar.js"), + ("jsref","grammarReference.js") ] usageMsg = - "usage: gfc (-h | --make (-noopt) (-js | -haskell | -haskell_gadt)) (-src) FILES" + "usage: gfc (-h | --make (-noopt) (-js | -jsref | -haskell | -haskell_gadt)) (-src) FILES" diff --git a/src/GF/Devel/GFCCtoJS.hs b/src/GF/Devel/GFCCtoJS.hs index 65d3185e2..5ec438bc7 100644 --- a/src/GF/Devel/GFCCtoJS.hs +++ b/src/GF/Devel/GFCCtoJS.hs @@ -1,4 +1,4 @@ -module GF.Devel.GFCCtoJS (gfcc2js) where +module GF.Devel.GFCCtoJS (gfcc2js,gfcc2grammarRef) where import qualified GF.GFCC.Macros as M import qualified GF.GFCC.DataGFCC as D @@ -84,3 +84,23 @@ children = JS.Ident "cs" new :: String -> [JS.Expr] -> JS.Expr new f xs = JS.ENew (JS.Ident f) xs + +-- grammar reference file for js applications. AR 10/11/2007 + +gfcc2grammarRef :: D.GFCC -> String +gfcc2grammarRef gfcc = + encodeUTF8 $ refs + where + C.CId abstr = D.absname gfcc + refs = unlines $ [ + "// Grammar Reference", + "function concreteReference(concreteSyntax, concreteSyntaxName) {", + "this.concreteSyntax = concreteSyntax;", + "this.concreteSyntaxName = concreteSyntaxName;", + "}", + "var myAbstract = " ++ abstr ++ " ;", + "var myConcrete = new Array();" + ] ++ [ + "myConcrete.push(new concreteReference(" ++ c ++ ",\"" ++ c ++ "\"));" + | C.CId c <- D.cncnames gfcc] + diff --git a/src/GF/Devel/PrintGFCC.hs b/src/GF/Devel/PrintGFCC.hs index 462c175c7..18c174cd7 100644 --- a/src/GF/Devel/PrintGFCC.hs +++ b/src/GF/Devel/PrintGFCC.hs @@ -11,4 +11,5 @@ prGFCC printer gr = case printer of "haskell" -> grammar2haskell gr "haskell_gadt" -> grammar2haskellGADT gr "js" -> gfcc2js gr + "jsref" -> gfcc2grammarRef gr _ -> printGFCC gr