summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/GF/Canon/CanonToJS.hs25
-rw-r--r--src/GF/UseGrammar/Custom.hs2
2 files changed, 19 insertions, 8 deletions
diff --git a/src/GF/Canon/CanonToJS.hs b/src/GF/Canon/CanonToJS.hs
index 161a21fb0..bcd64e282 100644
--- a/src/GF/Canon/CanonToJS.hs
+++ b/src/GF/Canon/CanonToJS.hs
@@ -2,20 +2,31 @@ module GF.Canon.CanonToJS (prCanon2js) where
import GF.Canon.GFC
import GF.Canon.CanonToGFCC
+import GF.Canon.Look
+import GF.Data.ErrM
+import GF.Infra.Option
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 gr = gfcc2js $ mkCanon2gfcc gr
+import Control.Monad (mplus)
+import Data.Maybe (fromMaybe)
-gfcc2js :: C.Grammar -> String
-gfcc2js (C.Grm (C.Hdr n _) as cs) = JS.printTree $ JS.Program $ abstract2js n as ++ concatMap (concrete2js n) cs
+prCanon2js :: Options -> CanonGrammar -> String
+prCanon2js opts gr = gfcc2js start $ mkCanon2gfcc gr
+ where
+ start = fromMaybe "S" (getOptVal opts gStartCat
+ `mplus` getOptVal grOpts gStartCat)
+ grOpts = errVal noOptions $ lookupOptionsCan gr
+
+gfcc2js :: String -> C.Grammar -> String
+gfcc2js start (C.Grm (C.Hdr n _) as cs) =
+ JS.printTree $ JS.Program $ abstract2js start n as ++ concatMap (concrete2js n) cs
-abstract2js :: C.CId -> C.Abstract -> [JS.Element]
-abstract2js (C.CId n) (C.Abs ds) =
- [JS.ElStmt $ JS.SDeclOrExpr $ JS.Decl [JS.DInit a (new "Abstract" [])]]
+abstract2js :: String -> C.CId -> C.Abstract -> [JS.Element]
+abstract2js start (C.CId n) (C.Abs ds) =
+ [JS.ElStmt $ JS.SDeclOrExpr $ JS.Decl [JS.DInit a (new "Abstract" [JS.EStr start])]]
++ concatMap (absdef2js a) ds
where a = JS.Ident n
diff --git a/src/GF/UseGrammar/Custom.hs b/src/GF/UseGrammar/Custom.hs
index a358f26b3..b1b3995b8 100644
--- a/src/GF/UseGrammar/Custom.hs
+++ b/src/GF/UseGrammar/Custom.hs
@@ -328,7 +328,7 @@ customMultiGrammarPrinter =
[
(strCI "gfcm", const MC.prCanon)
,(strCI "gfcc", const GFCC.prCanon2gfcc)
- ,(strCI "js", const JS.prCanon2js)
+ ,(strCI "js", JS.prCanon2js)
,(strCI "header", const (MC.prCanonMGr . unoptimizeCanon))
,(strCI "cfgm", prCanonAsCFGM)
,(strCI "graph", visualizeCanonGrammar)