From c5a75c482ccaf1ce955694fb63dd4e05e9d34a02 Mon Sep 17 00:00:00 2001 From: "John J. Camilleri" Date: Wed, 3 Jul 2019 15:07:31 +0200 Subject: [PATCH 01/12] Start work on PGFtoJSON module. Add compiler flag `-f json`. --- gf.cabal | 1 + src/compiler/GF/Compile/Export.hs | 2 + src/compiler/GF/Compile/PGFtoJSON.hs | 116 +++++++++++++++++++++++++++ src/compiler/GF/Infra/Option.hs | 4 +- 4 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 src/compiler/GF/Compile/PGFtoJSON.hs diff --git a/gf.cabal b/gf.cabal index e7a5e100d..156f6518d 100644 --- a/gf.cabal +++ b/gf.cabal @@ -194,6 +194,7 @@ Library GF.Compile.GrammarToCanonical GF.Grammar.CanonicalJSON GF.Compile.PGFtoJS + GF.Compile.PGFtoJSON GF.Compile.PGFtoProlog GF.Compile.PGFtoPython GF.Compile.ReadFiles diff --git a/src/compiler/GF/Compile/Export.hs b/src/compiler/GF/Compile/Export.hs index e0811d40d..7d3337e3d 100644 --- a/src/compiler/GF/Compile/Export.hs +++ b/src/compiler/GF/Compile/Export.hs @@ -7,6 +7,7 @@ import GF.Compile.PGFtoHaskell import GF.Compile.PGFtoJava import GF.Compile.PGFtoProlog import GF.Compile.PGFtoJS +import GF.Compile.PGFtoJSON import GF.Compile.PGFtoPython import GF.Infra.Option --import GF.Speech.CFG @@ -38,6 +39,7 @@ exportPGF opts fmt pgf = FmtCanonicalGF -> [] -- canon "gf" (render80 . abstract2canonical) FmtCanonicalJson-> [] FmtJavaScript -> multi "js" pgf2js + FmtJSON -> multi "json" pgf2json FmtPython -> multi "py" pgf2python FmtHaskell -> multi "hs" (grammar2haskell opts name) FmtJava -> multi "java" (grammar2java opts name) diff --git a/src/compiler/GF/Compile/PGFtoJSON.hs b/src/compiler/GF/Compile/PGFtoJSON.hs new file mode 100644 index 000000000..ec336835a --- /dev/null +++ b/src/compiler/GF/Compile/PGFtoJSON.hs @@ -0,0 +1,116 @@ +module GF.Compile.PGFtoJSON (pgf2json) where + +import PGF(showCId) +import PGF.Internal as M + +import qualified Text.JSON as JSON +--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 + [ ("abstract", json_abstract) + , ("concretes", json_concretes) + ] + -- JS.printTree $ JS.Program [JS.ElStmt $ JS.SDeclOrExpr $ JS.Decl [JS.DInit (JS.Ident n) grammar]] + where + -- n = showCId $ absname pgf + as = abstract pgf + cs = Map.assocs (concretes pgf) + start = showCId $ M.lookStartCat pgf + -- grammar = new "GFGrammar" [js_abstract, js_concrete] + -- js_abstract = abstract2js start as + -- js_concrete = JS.EObj $ map concrete2js cs + json_abstract = abstract2json start as + json_concretes = JSON.makeObj $ map concrete2json cs + +abstract2json :: String -> Abstr -> JSON.JSValue +abstract2json start ds = JSON.JSNull + +-- 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)) -> JS.Property +-- absdef2js (f,(typ,_,_,_)) = +-- let (args,cat) = M.catSkeleton typ in +-- JS.Prop (JS.IdentPropName (JS.Ident (showCId f))) (new "Type" [JS.EArray [JS.EStr (showCId x) | x <- args], JS.EStr (showCId cat)]) +-- +-- lit2js (LStr s) = JS.EStr s +-- lit2js (LInt n) = JS.EInt n +-- lit2js (LFlt d) = JS.EDbl d + +concrete2json :: (CId,Concr) -> (String,JSON.JSValue) +concrete2json (c,cnc) = (showCId c,JSON.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 ] diff --git a/src/compiler/GF/Infra/Option.hs b/src/compiler/GF/Infra/Option.hs index 7e1c22b9d..7455c83c4 100644 --- a/src/compiler/GF/Infra/Option.hs +++ b/src/compiler/GF/Infra/Option.hs @@ -90,6 +90,7 @@ data OutputFormat = FmtPGFPretty | FmtCanonicalGF | FmtCanonicalJson | FmtJavaScript + | FmtJSON | FmtPython | FmtHaskell | FmtJava @@ -328,7 +329,7 @@ optDescr = Option ['f'] ["output-format"] (ReqArg outFmt "FMT") (unlines ["Output format. FMT can be one of:", "Canonical GF grammar: canonical_gf, canonical_json, (and haskell with option --haskell=concrete)", - "Multiple concrete: pgf (default), js, pgf_pretty, prolog, python, ...", -- gar, + "Multiple concrete: pgf (default), json, js, pgf_pretty, prolog, python, ...", -- gar, "Single concrete only: bnf, ebnf, fa, gsl, jsgf, regexp, slf, srgs_xml, srgs_abnf, vxml, ....", -- cf, lbnf, "Abstract only: haskell, ..."]), -- prolog_abs, Option [] ["sisr"] (ReqArg sisrFmt "FMT") @@ -474,6 +475,7 @@ outputFormatsExpl = (("canonical_gf", FmtCanonicalGF),"Canonical GF source files"), (("canonical_json", FmtCanonicalJson),"Canonical JSON source files"), (("js", FmtJavaScript),"JavaScript (whole grammar)"), + (("json", FmtJSON),"JSON (whole grammar)"), (("python", FmtPython),"Python (whole grammar)"), (("haskell", FmtHaskell),"Haskell (abstract syntax)"), (("java", FmtJava),"Java (abstract syntax)"), From ecf9b41db0a058a0477a6f19fba1ba30ca6643c3 Mon Sep 17 00:00:00 2001 From: "John J. Camilleri" Date: Wed, 3 Jul 2019 16:34:07 +0200 Subject: [PATCH 02/12] Finish JSON conversion for abstract --- src/compiler/GF/Compile/PGFtoJSON.hs | 45 ++++++++++++++++++---------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/src/compiler/GF/Compile/PGFtoJSON.hs b/src/compiler/GF/Compile/PGFtoJSON.hs index ec336835a..6563ea6c8 100644 --- a/src/compiler/GF/Compile/PGFtoJSON.hs +++ b/src/compiler/GF/Compile/PGFtoJSON.hs @@ -4,6 +4,10 @@ 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 @@ -19,38 +23,47 @@ 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) ] - -- JS.printTree $ JS.Program [JS.ElStmt $ JS.SDeclOrExpr $ JS.Decl [JS.DInit (JS.Ident n) grammar]] where - -- n = showCId $ absname pgf + n = showCId $ absname pgf as = abstract pgf cs = Map.assocs (concretes pgf) start = showCId $ M.lookStartCat pgf - -- grammar = new "GFGrammar" [js_abstract, js_concrete] - -- js_abstract = abstract2js start as - -- js_concrete = JS.EObj $ map concrete2js cs - json_abstract = abstract2json start as + json_abstract = abstract2json n start as json_concretes = JSON.makeObj $ map concrete2json cs -abstract2json :: String -> Abstr -> JSON.JSValue -abstract2json start ds = JSON.JSNull +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)) -> JS.Property --- absdef2js (f,(typ,_,_,_)) = --- let (args,cat) = M.catSkeleton typ in --- JS.Prop (JS.IdentPropName (JS.Ident (showCId f))) (new "Type" [JS.EArray [JS.EStr (showCId x) | x <- args], JS.EStr (showCId cat)]) --- + +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,JSON.JSValue) -concrete2json (c,cnc) = (showCId c,JSON.JSNull) +concrete2json :: (CId,Concr) -> (String,JSValue) +concrete2json (c,cnc) = (showCId c,JSNull) -- concrete2js :: (CId,Concr) -> JS.Property -- concrete2js (c,cnc) = From cb88b56016f8517ab6d370c3862924f3db806e95 Mon Sep 17 00:00:00 2001 From: "John J. Camilleri" Date: Sun, 7 Jul 2019 17:35:31 +0200 Subject: [PATCH 03/12] Finish compile to PGF JSON, including JSON schema for resulting format. --- src/compiler/GF/Compile/PGFtoJSON.hs | 178 +++++++++--------- src/compiler/GF/Compile/pgf.schema.json | 232 ++++++++++++++++++++++++ 2 files changed, 324 insertions(+), 86 deletions(-) create mode 100644 src/compiler/GF/Compile/pgf.schema.json diff --git a/src/compiler/GF/Compile/PGFtoJSON.hs b/src/compiler/GF/Compile/PGFtoJSON.hs index 6563ea6c8..7b585fc89 100644 --- a/src/compiler/GF/Compile/PGFtoJSON.hs +++ b/src/compiler/GF/Compile/PGFtoJSON.hs @@ -4,17 +4,11 @@ import PGF(showCId) import PGF.Internal as M import qualified Text.JSON as JSON -import Text.JSON (JSValue(..)) +import Text.JSON (JSValue(..), JSON) -- 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 @@ -38,92 +32,104 @@ pgf2json pgf = 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))) + [ ("name", mkJSStr name) + , ("startcat", mkJSStr start) + , ("funs", JSON.makeObj $ map absdef2json (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) +absdef2json :: (CId,(Type,Int,Maybe ([Equation],[[M.Instr]]),Double)) -> (String,JSValue) +absdef2json (f,(typ,_,_,_)) = (showCId f,sig) where (args,cat) = M.catSkeleton typ sig = JSON.makeObj - [ ("args", JSArray $ map (mkJSString.showCId) args) - , ("cat", mkJSString $ showCId cat) + [ ("args", JSArray $ map (mkJSStr.showCId) args) + , ("cat", mkJSStr $ 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 +lit2json :: Literal -> JSValue +lit2json (LStr s) = mkJSStr s +lit2json (LInt n) = mkJSInt n +lit2json (LFlt d) = JSRational True (toRational d) concrete2json :: (CId,Concr) -> (String,JSValue) -concrete2json (c,cnc) = (showCId c,JSNull) +concrete2json (c,cnc) = (showCId c,obj) + where + obj = JSON.makeObj + [ ("flags", JSON.makeObj [ (showCId k, lit2json v) | (k,v) <- Map.toList (cflags cnc) ]) + , ("productions", JSON.makeObj [ (show cat, JSArray (map frule2json (Set.toList set))) | (cat,set) <- IntMap.toList (productions cnc)]) -- TODO + , ("functions", JSArray (map ffun2json (Array.elems (cncfuns cnc)))) + , ("sequences", JSArray (map seq2json (Array.elems (sequences cnc)))) + , ("startCats", JSON.makeObj $ map cats2json (Map.assocs (cnccats cnc))) + , ("totalFIds", mkJSInt (totalCats cnc)) + ] + +cats2json :: (CId, CncCat) -> (String,JSValue) +cats2json (c,CncCat start end _) = (showCId c, ixs) + where + ixs = JSON.encJSDict + [ ("s", start) + , ("e", end) + ] + +frule2json :: Production -> JSValue +frule2json (PApply fid args) = + JSON.makeObj + [ ("type", mkJSStr "Apply") + , ("fid", mkJSInt fid) + , ("args", JSArray (map farg2json args)) + ] +frule2json (PCoerce arg) = + JSON.makeObj + [ ("type", mkJSStr "Coerce") + , ("arg", mkJSInt arg) + ] + +farg2json :: PArg -> JSValue +farg2json (PArg hypos fid) = + JSON.makeObj + [ ("type", mkJSStr "PArg") + , ("hypos", JSArray $ map (mkJSInt . snd) hypos) + , ("fid", mkJSInt fid) + ] + +ffun2json :: CncFun -> JSValue +ffun2json (CncFun f lins) = + JSON.makeObj + [ ("name", mkJSStr $ showCId f) + , ("lins", JSArray (map mkJSInt (Array.elems lins))) + ] + +seq2json :: Array.Array DotPos Symbol -> JSValue +seq2json seq = JSArray [sym2json s | s <- Array.elems seq] + +sym2json :: Symbol -> JSValue +sym2json (SymCat n l) = new "SymCat" [mkJSInt n, mkJSInt l] +sym2json (SymLit n l) = new "SymLit" [mkJSInt n, mkJSInt l] +sym2json (SymVar n l) = new "SymVar" [mkJSInt n, mkJSInt l] +sym2json (SymKS t) = new "SymKS" [mkJSStr t] +sym2json (SymKP ts alts) = new "SymKP" [JSArray (map sym2json ts), JSArray (map alt2json alts)] +sym2json SymBIND = new "SymKS" [mkJSStr "&+"] +sym2json SymSOFT_BIND = new "SymKS" [mkJSStr "&+"] +sym2json SymSOFT_SPACE = new "SymKS" [mkJSStr "&+"] +sym2json SymCAPIT = new "SymKS" [mkJSStr "&|"] +sym2json SymALL_CAPIT = new "SymKS" [mkJSStr "&|"] +sym2json SymNE = new "SymNE" [] + +alt2json :: ([Symbol],[String]) -> JSValue +alt2json (ps,ts) = new "Alt" [JSArray (map sym2json ps), JSArray (map mkJSStr ts)] + +new :: String -> [JSValue] -> JSValue +new f xs = + JSON.makeObj + [ ("type", mkJSStr f) + , ("args", JSArray xs) + ] + +-- | Make JSON value from string +mkJSStr :: String -> JSValue +mkJSStr = JSString . JSON.toJSString + +-- | Make JSON value from integer +mkJSInt :: Integral a => a -> JSValue +mkJSInt = JSRational False . toRational --- 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 ] diff --git a/src/compiler/GF/Compile/pgf.schema.json b/src/compiler/GF/Compile/pgf.schema.json new file mode 100644 index 000000000..2ad1d5442 --- /dev/null +++ b/src/compiler/GF/Compile/pgf.schema.json @@ -0,0 +1,232 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://grammaticalframework.org/pgf.schema.json", + "type": "object", + "title": "PGF JSON Schema", + "required": [ + "abstract", + "concretes" + ], + "properties": { + "abstract": { + "type": "object", + "required": [ + "name", + "startcat", + "funs" + ], + "properties": { + "name": { + "type": "string" + }, + "startcat": { + "type": "string" + }, + "funs": { + "type": "object", + "additionalProperties": { + "type": "object", + "required": [ + "args", + "cat" + ], + "properties": { + "args": { + "type": "array", + "items": { + "type": "string" + } + }, + "cat": { + "type": "string" + } + } + } + } + } + }, + "concretes": { + "type": "object", + "additionalProperties": { + "required": [ + "flags", + "productions", + "functions", + "sequences", + "startCats", + "totalFIds" + ], + "properties": { + "flags": { + "type": "object", + "additionalProperties": { + "type": ["string", "number"] + } + }, + "productions": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/definitions/apply" + }, + { + "$ref": "#/definitions/coerce" + } + ] + } + } + }, + "functions": { + "type": "array", + "items": { + "title": "CncFun", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "lins": { + "type": "array", + "items": { + "type": "integer" + } + } + } + } + }, + "sequences": { + "type": "array", + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/sym" + } + } + }, + "startCats": { + "type": "object", + "additionalProperties": { + "title": "CncCat", + "type": "object", + "required": [ + "s", + "e" + ], + "properties": { + "s": { + "type": "integer" + }, + "e": { + "type": "integer" + } + } + } + }, + "totalFIds": { + "type": "integer" + } + } + } + } + }, + "definitions": { + "apply": { + "required": [ + "type", + "fid", + "args" + ], + "properties": { + "type": { + "type": "string", + "enum": ["Apply"] + }, + "fid": { + "type": "integer" + }, + "args": { + "type": "array", + "items": { + "$ref": "#/definitions/parg" + } + } + } + }, + "coerce": { + "required": [ + "type", + "arg" + ], + "properties": { + "type": { + "type": "string", + "enum": ["Coerce"] + }, + "arg": { + "type": "integer" + } + } + }, + "parg": { + "required": [ + "type", + "hypos", + "fid" + ], + "properties": { + "type": { + "type": "string", + "enum": ["PArg"] + }, + "hypos": { + "type": "array", + "items": { + "type": "integer" + } + }, + "fid": { + "type": "integer" + } + } + }, + "sym": { + "title": "Sym", + "required": [ + "type", + "args" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "SymCat", + "SymLit", + "SymVar", + "SymKS", + "SymKP", + "SymNE" + ] + }, + "args": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "$ref": "#/definitions/sym" + } + ] + } + } + } + } + } +} \ No newline at end of file From a4b1fb03aa88bd501dc7fd2c7c7bd4dae7c4cf72 Mon Sep 17 00:00:00 2001 From: "John J. Camilleri" Date: Sun, 7 Jul 2019 17:38:07 +0200 Subject: [PATCH 04/12] Whitespace fixes --- src/compiler/GF/Compile/PGFtoJSON.hs | 5 ++--- src/compiler/GF/Compile/pgf.schema.json | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/compiler/GF/Compile/PGFtoJSON.hs b/src/compiler/GF/Compile/PGFtoJSON.hs index 7b585fc89..9a86d3e59 100644 --- a/src/compiler/GF/Compile/PGFtoJSON.hs +++ b/src/compiler/GF/Compile/PGFtoJSON.hs @@ -97,7 +97,7 @@ ffun2json (CncFun f lins) = JSON.makeObj [ ("name", mkJSStr $ showCId f) , ("lins", JSArray (map mkJSInt (Array.elems lins))) - ] + ] seq2json :: Array.Array DotPos Symbol -> JSValue seq2json seq = JSArray [sym2json s | s <- Array.elems seq] @@ -119,7 +119,7 @@ alt2json :: ([Symbol],[String]) -> JSValue alt2json (ps,ts) = new "Alt" [JSArray (map sym2json ps), JSArray (map mkJSStr ts)] new :: String -> [JSValue] -> JSValue -new f xs = +new f xs = JSON.makeObj [ ("type", mkJSStr f) , ("args", JSArray xs) @@ -132,4 +132,3 @@ mkJSStr = JSString . JSON.toJSString -- | Make JSON value from integer mkJSInt :: Integral a => a -> JSValue mkJSInt = JSRational False . toRational - diff --git a/src/compiler/GF/Compile/pgf.schema.json b/src/compiler/GF/Compile/pgf.schema.json index 2ad1d5442..a8f31e399 100644 --- a/src/compiler/GF/Compile/pgf.schema.json +++ b/src/compiler/GF/Compile/pgf.schema.json @@ -229,4 +229,4 @@ } } } -} \ No newline at end of file +} From acd4a5e8cd3e75b9aaa07b36442406b392520ede Mon Sep 17 00:00:00 2001 From: "John J. Camilleri" Date: Wed, 10 Jul 2019 08:45:23 +0200 Subject: [PATCH 05/12] Address @heatherleaf's suggestions --- src/compiler/GF/Compile/PGFtoJSON.hs | 42 +++++++++++++++++++++------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/src/compiler/GF/Compile/PGFtoJSON.hs b/src/compiler/GF/Compile/PGFtoJSON.hs index 9a86d3e59..3fd3b60cb 100644 --- a/src/compiler/GF/Compile/PGFtoJSON.hs +++ b/src/compiler/GF/Compile/PGFtoJSON.hs @@ -1,12 +1,35 @@ module GF.Compile.PGFtoJSON (pgf2json) where -import PGF(showCId) -import PGF.Internal as M +import PGF (showCId) +import qualified PGF.Internal as M +import PGF.Internal ( + Abstr, + CId, + CncCat(..), + CncFun(..), + Concr, + DotPos, + Equation(..), + Literal(..), + PArg(..), + PGF, + Production(..), + Symbol(..), + Type, + absname, + abstract, + cflags, + cnccats, + cncfuns, + concretes, + funs, + productions, + sequences, + totalCats + ) import qualified Text.JSON as JSON -import Text.JSON (JSValue(..), JSON) --- import Text.JSON.Pretty (pp_value) --- import Text.PrettyPrint (render) +import Text.JSON (JSValue(..)) import qualified Data.Array.IArray as Array import Data.Map (Map) @@ -17,7 +40,6 @@ 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) ] @@ -56,7 +78,7 @@ concrete2json (c,cnc) = (showCId c,obj) where obj = JSON.makeObj [ ("flags", JSON.makeObj [ (showCId k, lit2json v) | (k,v) <- Map.toList (cflags cnc) ]) - , ("productions", JSON.makeObj [ (show cat, JSArray (map frule2json (Set.toList set))) | (cat,set) <- IntMap.toList (productions cnc)]) -- TODO + , ("productions", JSON.makeObj [ (show cat, JSArray (map frule2json (Set.toList set))) | (cat,set) <- IntMap.toList (productions cnc)]) , ("functions", JSArray (map ffun2json (Array.elems (cncfuns cnc)))) , ("sequences", JSArray (map seq2json (Array.elems (sequences cnc)))) , ("startCats", JSON.makeObj $ map cats2json (Map.assocs (cnccats cnc))) @@ -66,9 +88,9 @@ concrete2json (c,cnc) = (showCId c,obj) cats2json :: (CId, CncCat) -> (String,JSValue) cats2json (c,CncCat start end _) = (showCId c, ixs) where - ixs = JSON.encJSDict - [ ("s", start) - , ("e", end) + ixs = JSON.makeObj + [ ("s", mkJSInt start) + , ("e", mkJSInt end) ] frule2json :: Production -> JSValue From eab9fb88aaa5408c342927693d8593f1e0ba2b91 Mon Sep 17 00:00:00 2001 From: "John J. Camilleri" Date: Wed, 10 Jul 2019 08:49:00 +0200 Subject: [PATCH 06/12] Minor renamings in JSON format --- src/compiler/GF/Compile/PGFtoJSON.hs | 8 ++++---- src/compiler/GF/Compile/pgf.schema.json | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/compiler/GF/Compile/PGFtoJSON.hs b/src/compiler/GF/Compile/PGFtoJSON.hs index 3fd3b60cb..e634dae67 100644 --- a/src/compiler/GF/Compile/PGFtoJSON.hs +++ b/src/compiler/GF/Compile/PGFtoJSON.hs @@ -81,16 +81,16 @@ concrete2json (c,cnc) = (showCId c,obj) , ("productions", JSON.makeObj [ (show cat, JSArray (map frule2json (Set.toList set))) | (cat,set) <- IntMap.toList (productions cnc)]) , ("functions", JSArray (map ffun2json (Array.elems (cncfuns cnc)))) , ("sequences", JSArray (map seq2json (Array.elems (sequences cnc)))) - , ("startCats", JSON.makeObj $ map cats2json (Map.assocs (cnccats cnc))) - , ("totalFIds", mkJSInt (totalCats cnc)) + , ("categories", JSON.makeObj $ map cats2json (Map.assocs (cnccats cnc))) + , ("totalfids", mkJSInt (totalCats cnc)) ] cats2json :: (CId, CncCat) -> (String,JSValue) cats2json (c,CncCat start end _) = (showCId c, ixs) where ixs = JSON.makeObj - [ ("s", mkJSInt start) - , ("e", mkJSInt end) + [ ("start", mkJSInt start) + , ("end", mkJSInt end) ] frule2json :: Production -> JSValue diff --git a/src/compiler/GF/Compile/pgf.schema.json b/src/compiler/GF/Compile/pgf.schema.json index a8f31e399..2058e9a70 100644 --- a/src/compiler/GF/Compile/pgf.schema.json +++ b/src/compiler/GF/Compile/pgf.schema.json @@ -53,8 +53,8 @@ "productions", "functions", "sequences", - "startCats", - "totalFIds" + "categories", + "totalfids" ], "properties": { "flags": { @@ -106,26 +106,26 @@ } } }, - "startCats": { + "categories": { "type": "object", "additionalProperties": { "title": "CncCat", "type": "object", "required": [ - "s", - "e" + "start", + "end" ], "properties": { - "s": { + "start": { "type": "integer" }, - "e": { + "end": { "type": "integer" } } } }, - "totalFIds": { + "totalfids": { "type": "integer" } } From 12079550f847a9f98eb0e1eca2fd0ea3d986a94a Mon Sep 17 00:00:00 2001 From: "John J. Camilleri" Date: Thu, 11 Jul 2019 09:29:49 +0200 Subject: [PATCH 07/12] Remove TypeScript runtime and point to new repository https://github.com/GrammaticalFramework/gf-typescript --- src/runtime/javascript/DEPRECATED.md | 5 +- src/runtime/typescript/.eslintrc | 18 - src/runtime/typescript/MOVED.md | 7 + src/runtime/typescript/README.md | 31 - src/runtime/typescript/gflib.ts | 1619 ------------------------ src/runtime/typescript/js/gflib.js | 1164 ----------------- src/runtime/typescript/js/gflib.js.map | 1 - src/runtime/typescript/tsconfig.json | 12 - 8 files changed, 8 insertions(+), 2849 deletions(-) delete mode 100644 src/runtime/typescript/.eslintrc create mode 100644 src/runtime/typescript/MOVED.md delete mode 100644 src/runtime/typescript/README.md delete mode 100644 src/runtime/typescript/gflib.ts delete mode 100644 src/runtime/typescript/js/gflib.js delete mode 100644 src/runtime/typescript/js/gflib.js.map delete mode 100644 src/runtime/typescript/tsconfig.json diff --git a/src/runtime/javascript/DEPRECATED.md b/src/runtime/javascript/DEPRECATED.md index a4a8993c6..83f4e51d6 100644 --- a/src/runtime/javascript/DEPRECATED.md +++ b/src/runtime/javascript/DEPRECATED.md @@ -1,7 +1,4 @@ # Deprecation notice As of June 2019, this JavaScript version of the GF runtime is considered deprecated, -in favour of the TypeScript version in `../typescript/gflib.ts`. - -If you don't want/need TypeScript and are just looking for a ready-to-use JavaScript version, -see `../typescript/js/gflib.js` which is generated directly from the TypeScript version. +in favour of the TypeScript version in . diff --git a/src/runtime/typescript/.eslintrc b/src/runtime/typescript/.eslintrc deleted file mode 100644 index c0fa0b95e..000000000 --- a/src/runtime/typescript/.eslintrc +++ /dev/null @@ -1,18 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint"], - "extends": ["plugin:@typescript-eslint/recommended"], - "rules": { - "indent": "off", - "@typescript-eslint/indent": ["warn", 2], - "@typescript-eslint/no-use-before-define": ["error", { - "functions": false, - "classes": false - }], - "semi": "off", - "@typescript-eslint/semi": ["warn", "never"], - "quotes": ["warn", "single"], - "@typescript-eslint/camelcase": "off", - "@typescript-eslint/no-unused-vars": ["warn", { "argsIgnorePattern": "^_" }], - } -} diff --git a/src/runtime/typescript/MOVED.md b/src/runtime/typescript/MOVED.md new file mode 100644 index 000000000..3648aa226 --- /dev/null +++ b/src/runtime/typescript/MOVED.md @@ -0,0 +1,7 @@ +# Project moved + +The GF TypeScript runtime has been moved to the repository: + + +If you are looking for an updated version of the JavaScript runtime, +you should also look there. diff --git a/src/runtime/typescript/README.md b/src/runtime/typescript/README.md deleted file mode 100644 index e7905af89..000000000 --- a/src/runtime/typescript/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# GF TypeScript Runtime - -`gflib.ts` is a TypeScript implementation of the GF runtime. -It is ported from an older JavaScript implementation [`gflib.js`](../javascript/gflib.js), -with some improvements. - -Importantly, all **future** updates will only be made to this TypeScript version. - -## Applicability - -This runtime allows you use GF in pure JavaScript, and thus have GF-powered apps without the need for a server backend. -However, it has not been actively maintained as the other runtimes have been. -So its features are limited and it is not efficient, making it really only useful for smaller grammars. - -## Using - -`gflib.ts` can be transpiled to JavaScript by running `tsc` in this folder (of course you need TypeScript installed). -It has no module dependencies. -You can then include the generated `js/gflib.js` file in your application as usual. - -_This generated JavaScript version is also included under version control, -to make it easy for someone to use without having to install TypeScript._ - -Your GF grammar should be compiled with: `gf --make --output-format=js` - -For an example of a working web application using the JavaScript runtime, see `../javascript`. - -## What happened to `gflib.d.ts`? - -There was once a file here called `gflib.d.ts`, which contained TypeScript type definitions for the **old** `gflib.js`. -Since the runtime is now ported to TypeScript, those type definitions are no longer necessary (plus they contained many errors). diff --git a/src/runtime/typescript/gflib.ts b/src/runtime/typescript/gflib.ts deleted file mode 100644 index 52865e969..000000000 --- a/src/runtime/typescript/gflib.ts +++ /dev/null @@ -1,1619 +0,0 @@ -/** - * gflib.ts - * - * by John J. Camilleri - * - * A port of the pure JavaScript runtime (/src/runtime/javascript/gflib.js) into TypeScript - */ - -/** - * A GF grammar is one abstract and multiple concretes - */ -class GFGrammar { // eslint-disable-line @typescript-eslint/no-unused-vars - public abstract: GFAbstract - public concretes: {[key: string]: GFConcrete} - - public constructor(abstract: GFAbstract, concretes: {[key: string]: GFConcrete}) { - this.abstract = abstract - this.concretes = concretes - } - - public translate( - input: string, - fromLang: string, - toLang: string - ): {[key: string]: {[key: string]: string}[]} { - let outputs: {[key: string]: {[key: string]: string}[]} = {} - let fromConcs = this.concretes - if (fromLang) { - fromConcs = {} - fromConcs[fromLang] = this.concretes[fromLang] - } - let toConcs = this.concretes - if (toLang) { - toConcs = {} - toConcs[toLang] = this.concretes[toLang] - } - for (let c1 in fromConcs) { - let concrete = this.concretes[c1] - let trees = concrete.parseString(input, this.abstract.startcat) - if (trees.length > 0) { - outputs[c1] = [] - for (let i in trees) { - outputs[c1][i] = {} - for (let c2 in toConcs) { - outputs[c1][i][c2] = this.concretes[c2].linearize(trees[i]) - } - } - } - } - return outputs - } -} - -/** - * Abstract Syntax Tree - */ -class Fun { - public name: string - public args: Fun[] - public type?: string // only used for meta variables - - public constructor(name: string, ...args: Fun[]) { - this.name = name - this.args = [] - for (let i = 1; i < args.length; i++) { - this.args[i-1] = args[i] - } - } - - public print(): string { - return this.show(0) - } - - public show(prec: number): string { - if (this.isMeta()) { - if (isUndefined(this.type)) { - return '?' - } else { - let s = '?:' + this.type - if (prec > 0) { - s = '(' + s + ')' - } - return s - } - } else { - let s = this.name - let cs = this.args - for (let i in cs) { - s += ' ' + (isUndefined(cs[i]) ? 'undefined' : cs[i].show(1)) - } - if (prec > 0 && cs.length > 0) { - s = '(' + s + ')' - } - return s - } - } - - public getArg(i: number): Fun { - return this.args[i] - } - - public setArg(i: number, c: Fun): void { - this.args[i] = c - } - - public isMeta(): boolean { - return this.name == '?' - } - - public isComplete(): boolean { - if (this.isMeta()) { - return false - } else { - for (let i in this.args) { - if (!this.args[i].isComplete()) { - return false - } - } - return true - } - } - - public isLiteral(): boolean { - return (/^[\"\-\d]/).test(this.name) - } - - public isString(): boolean { - return (/^\".*\"$/).test(this.name) - } - - public isInt(): boolean { - return (/^\-?\d+$/).test(this.name) - } - - public isFloat(): boolean { - return (/^\-?\d*(\.\d*)?$/).test(this.name) && this.name != '.' && this.name != '-.' - } - - public isEqual(obj: Fun): boolean { - if (this.name != obj.name) - return false - - for (let i in this.args) { - if (!this.args[i].isEqual(obj.args[i])) - return false - } - - return true - } -} - -/** - * Abstract syntax - */ -class GFAbstract { - public startcat: string - private types: {[key: string]: Type} // key is function name - - public constructor(startcat: string, types: {[key: string]: Type}) { - this.startcat = startcat - this.types = types - } - - public addType(fun: string, args: string[], cat: string): void { - this.types[fun] = new Type(args, cat) - } - - public getArgs(fun: string): string[] { - return this.types[fun].args - } - - public getCat(fun: string): string { - return this.types[fun].cat - } - - // Annotate (only) meta variables - private annotate(tree: Fun, type?: string): Fun { - let typ: Type | undefined = this.types[tree.name] - if (tree.isMeta()) { - tree.type = type - } else if (!isUndefined(typ)) { - for (let i in tree.args) { - this.annotate(tree.args[i], typ.args[i]) - } - } - return tree - } - - public handleLiterals(tree: Fun, type: string): Fun { - if (tree.name != '?') { - if (type == 'String' || type == 'Int' || type == 'Float') { - tree.name = type + '_Literal_' + tree.name - } else { - let typ = this.types[tree.name] - for (let i in tree.args) { - this.handleLiterals(tree.args[i], typ.args[i]) - } - } - } - return tree - } - - // Hack to get around the fact that our SISR doesn't build real Fun objects. - public copyTree(x: Fun): Fun { - let t = new Fun(x.name) - if (!isUndefined(x.type)) { - t.type = x.type - } - let cs = x.args - if (!isUndefined(cs)) { - for (let i = 0; i < cs.length; i++) { - t.setArg(i, this.copyTree(cs[i])) - } - } - return t - } - - public parseTree(str: string, type?: string): Fun | null { - let pt = this.parseTree_(str.match(/[\w\u00C0-\u00FF\'\.\"]+|\(|\)|\?|\:/g) || [], 0) - return pt ? this.annotate(pt, type) : null - } - - private parseTree_(tokens: string[], prec: number): Fun | null { - if (tokens.length == 0 || tokens[0] == ')') { - return null - } - let t = tokens.shift() - if (!t) return null - if (t == '(') { - let tree = this.parseTree_(tokens, 0) - tokens.shift() - return tree - } else if (t == '?') { - // let tree = this.parseTree_(tokens, 0) - return new Fun('?') - } else { - let tree = new Fun(t) - if (prec == 0) { - let c: Fun | null - let i: number - for (i = 0; (c = this.parseTree_(tokens, 1)) !== null; i++) { - tree.setArg(i,c) - } - } - return tree - } - } -} - -/** - * Type - */ -class Type { - public args: string[] - public cat: string - - public constructor(args: string[], cat: string) { - this.args = args - this.cat = cat - } -} - -/** - * Concrete syntax - */ -class GFConcrete { - public flags: {[key: string]: string} - // private productions: {[key: number]: Rule[]} - private functions: CncFun[] - // private sequences: Sym[][] - public startCats: {[key: string]: {s: number; e: number}} - public totalFIds: number - public pproductions: {[key: number]: Rule[]} - private lproductions: {[key: string]: {fid: FId; fun: CncFun}[]} - - public constructor( - flags: {[key: string]: string}, - productions: {[key: number]: Rule[]}, - functions: CncFun[], - sequences: Sym[][], - startCats: {[key: string]: {s: number; e: number}}, - totalFIds: number - ) { - this.flags = flags - // this.productions = productions - this.functions = functions - // this.sequences = sequences - this.startCats = startCats - this.totalFIds = totalFIds - - this.pproductions = productions - this.lproductions = {} - - for (let fid0 in productions) { - let fid: number = parseInt(fid0) - for (let i in productions[fid]) { - let rule = productions[fid][i] - - if (rule.id == 'Apply') { - rule = rule as Apply - let fun: CncFun = this.functions[rule.fun as FId] - let lproductions = this.lproductions - - rule.fun = fun - - let register = function (args: PArg[], key: string, i: number): void { - if (i < args.length) { - let c = 0 - let arg = args[i].fid - - for (let k in productions[arg]) { - let rule = productions[arg][k] - if (rule.id == 'Coerce') { - rule = rule as Coerce - register(args, key + '_' + rule.arg, i+1) - c++ - } - } - - if (c == 0) { - register(args, key + '_' + arg, i+1) - } - } else { - let set = lproductions[key] - if (set == null) { - set = [] - lproductions[key] = set - } - set.push({fun: fun, fid: fid}) - } - } - register(rule.args, rule.fun.name, 0) - } - } - } - - for (let fun of functions) { - for (let j in fun.lins) { - fun.lins[j] = sequences[fun.lins[j] as number] - } - } - - } - - private linearizeSyms(tree: Fun, tag: string): {fid: FId; table: Sym[][]}[] { - let res = [] - - if (tree.isString()) { - let sym = new SymKS(tree.name) - sym.tag = tag - res.push({fid: -1, table: [[sym]]}) - } else if (tree.isInt()) { - let sym = new SymKS(tree.name) - sym.tag = tag - res.push({fid: -2, table: [[sym]]}) - } else if (tree.isFloat()) { - let sym = new SymKS(tree.name) - sym.tag = tag - res.push({fid: -3, table: [[sym]]}) - } else if (tree.isMeta()) { - // TODO: Use lindef here - let cat = this.startCats[tree.type as string] - - let sym = new SymKS(tree.name) - sym.tag = tag - - for (let fid = cat.s; fid <= cat.e; fid++) { - res.push({fid: fid, table: [[sym]]}) - } - } else { - let cs: {fid: FId; table: Sym[][]}[] = [] - for (let i in tree.args) { - // TODO: we should handle the case for nondeterministic linearization - cs.push(this.linearizeSyms(tree.args[i],tag + '-' + i)[0]) - } - let key = tree.name - for (let i in cs) { - if (isUndefined(cs[i])) { - // Some arguments into this function are undefined - console.warn(`${tree.args[i].name} is undefined`) - return [{ - fid: -5, // signal to parent that I cannot lin properly - table: [[new SymKS(`[${tree.name}]`).tagWith(tag)]] - }] - } else if (cs[i].fid === -5) { - // My child cannot lin properly, just find first matching rule for me - // TODO probably not general enough - for (let k in this.lproductions) { - if (k.includes(tree.name)) { - key = k - break - } - } - break - } else { - key = key + '_' + cs[i].fid - } - } - - for (let i in this.lproductions[key]) { - let rule = this.lproductions[key][i] - let row: {fid: FId; table: Sym[][]} = { - fid: rule.fid, - table: [] - } - for (let j in rule.fun.lins) { - let lin = rule.fun.lins[j] as Sym[] - let toks: Sym[] = [] - row.table[j] = toks - - lin.forEach((sym0: Sym): void => { - switch (sym0.id) { - case 'Arg': - case 'Lit': { - let sym = sym0 as SymCat | SymLit - let ts = cs[sym.i].table[sym.label] - for (let l in ts) { - toks.push(ts[l]) - } - break - } - case 'KS': - case 'KP': { - let sym = sym0 as SymKS | SymKP - toks.push(sym.tagWith(tag)) - break - } - } - }) - } - res.push(row) - } - } - - return res - } - - private syms2toks(syms: Sym[]): TaggedString[] { - let ts: TaggedString[] = [] - for (let i = 0; i < syms.length; i++) { - let sym0 = syms[i] - switch (sym0.id) { - case 'KS': { - let sym = sym0 as SymKS - for (let j in sym.tokens) { - ts.push(new TaggedString(sym.tokens[j], sym.tag as string)) - } - break - } - case 'KP': { - let sym = sym0 as SymKP - let addedAlt = false - if (i < syms.length-1) { - let nextSym = syms[i+1] - if (nextSym.id == 'KS') { - let nextToken = (nextSym as SymKS).tokens[0] - sym.alts.forEach((alt: Alt): void => { - // consider alts here (for handling pre) - if (alt.prefixes.some((p: string): boolean => nextToken.startsWith(p))) { - alt.tokens.forEach((symks: SymKS): void => { - symks.tokens.forEach((t: string): void => { - ts.push(new TaggedString(t, sym.tag as string)) - }) - }) - addedAlt = true - return - } - }) - } - } - if (addedAlt) break - // Fall through here when no alts (or none apply) - sym.tokens.forEach((symks: SymKS): void => { - symks.tokens.forEach((t: string): void => { - ts.push(new TaggedString(t, sym.tag as string)) - }) - }) - break - } - } - } - return ts - } - - public linearizeAll(tree: Fun): string[] { - return this.linearizeSyms(tree,'0').map((r): string => { - return this.unlex(this.syms2toks(r.table[0])) - }) - } - - public linearize(tree: Fun): string { - let res = this.linearizeSyms(tree,'0') - if (res.length > 0) - return this.unlex(this.syms2toks(res[0].table[0])) - else - return '' - } - - public tagAndLinearize(tree: Fun): TaggedString[] { - let res = this.linearizeSyms(tree,'0') - if (res.length > 0) - return this.syms2toks(res[0].table[0]) - else - return [] - } - - private unlex(ts: TaggedString[]): string { - if (ts.length == 0) { - return '' - } - - let noSpaceAfter = /^[\(\-\[]/ - let noSpaceBefore = /^[\.\,\?\!\)\:\;\-\]]/ - - let s = '' - for (let i = 0; i < ts.length; i++) { - let t: string = ts[i].s - let after: string | null = i < ts.length-1 ? ts[i+1].s : null - s += t - if (after != null - && !t.match(noSpaceAfter) - && !after.match(noSpaceBefore) - ) { - s += ' ' - } - } - return s - } - - // private tagIt(obj: Taggable, tag: string): Taggable { - // if (isString(obj)) { - // let o = new String(obj) - // o.setTag(tag) - // return o - // } else { - // let me = arguments.callee - // if (arguments.length == 2) { - // me.prototype = obj - // let o = new me() - // o.tag = tag - // return o - // } - // } - // } - - // public showRules(): string { - // let ruleStr = [] - // ruleStr.push('') - // for (let i = 0, j = this.rules.length; i < j; i++) { - // ruleStr.push(this.rules[i].show()) - // } - // return ruleStr.join('') - // } - - private tokenize(string: string): string[] { - let inToken = false - let start = 0 - let end: number - let tokens = [] - - let i: number - for (i = 0; i < string.length; i++) { - if (string.charAt(i) == ' ' // space - || string.charAt(i) == '\f' // form feed - || string.charAt(i) == '\n' // newline - || string.charAt(i) == '\r' // return - || string.charAt(i) == '\t' // horizontal tab - || string.charAt(i) == '\v' // vertical tab - || string.charAt(i) == String.fromCharCode(160) //   - ) { - if (inToken) { - end = i-1 - inToken = false - tokens.push(string.substr(start,end-start+1)) - } - } else { - if (!inToken) { - start = i - inToken = true - } - } - } - - if (inToken) { - end = i-1 - inToken = false - tokens.push(string.substr(start,end-start+1)) - } - - return tokens - } - - public parseString(string: string, cat: string): Fun[] { - let tokens = this.tokenize(string) - - let ps = new ParseState(this, cat) - for (let i in tokens) { - if (!ps.next(tokens[i])) - return [] - } - return ps.extractTrees() - } - - public complete( - input: string, - cat: string - ): {consumed: string[]; suggestions: string[]} { - // Parameter defaults - if (input == null) input = '' - // if (cat == null) cat = grammar.abstract.startcat - - // Tokenise input string & remove empty tokens - let tokens = input.trim().split(' ') - for (let i = tokens.length - 1; i >= 0; i--) { - if (tokens[i] == '') { - tokens.splice(i, 1) - } - } - - // Capture last token as it may be partial - let current = tokens.pop() - if (current == null) current = '' - - // Init parse state objects. - // ps2 is used for testing whether the final token is parsable or not. - let ps = new ParseState(this, cat) - let ps2 = new ParseState(this, cat) - - // Iterate over tokens, feed one by one to parser - for (let i = 0; i < tokens.length ; i++) { - if (!ps.next(tokens[i])) { - return { 'consumed': [], 'suggestions': [] } // Incorrect parse, nothing to suggest - } - ps2.next(tokens[i]) // also consume token in ps2 - } - - // Attempt to also parse current, knowing it may be incomplete - if (ps2.next(current)) { - ps.next(current) - tokens.push(current) - current = '' - } - - // Parse is successful so far, now get suggestions - let acc = ps.complete(current) - - // Format into just a list of strings & return - let suggs: string[] = [] - if (acc.value) { - acc.value.forEach((a: ActiveItem): void =>{ - a.seq.forEach((s: Sym): void => { - switch (s.id) { - case 'KS': { - (s as SymKS).tokens.forEach((t: string): void => { - suggs.push(t) - }) - break - } - case 'KP': { - (s as SymKP).tokens.forEach((symks: SymKS): void => { - symks.tokens.forEach((t: string): void => { - suggs.push(t) - }) - }) - break - } - } - }) - }) - } - - // Note: return used tokens too - return { 'consumed' : tokens, 'suggestions' : suggs } - } -} - -/** - * A string with a tag - * This avoids modifying the String prototype, which was messy - */ -class TaggedString { - public s: string - public tag: string - - public constructor(s: string, tag: string) { - this.s = s - this.tag = tag - } -} - -/** - * Function ID - */ -type FId = number - -/** - * Rule - */ -type Rule = Apply | Coerce | Const - -/** - * Apply - */ -class Apply { - public id: string - public fun: FId | CncFun - public args: PArg[] - - public constructor(fun: FId | CncFun, args: PArg[]) { - this.id = 'Apply' - this.fun = fun - this.args = args - } - - public show(cat: string): string { - let recStr = [] - recStr.push(cat, ' -> ', (this.fun as CncFun).name, ' [', this.args, ']') - return recStr.join('') - } - - public isEqual(obj: Apply): boolean { - if (this.id != obj.id || this.fun != obj.fun || this.args.length != obj.args.length) - return false - - for (let i in this.args) { - if (this.args[i] != obj.args[i]) - return false - } - - return true - } -} - -/** - * Coerce - */ -class Coerce { - public id: string - public arg: FId - - public constructor(arg: FId) { - this.id = 'Coerce' - this.arg = arg - } - - public show(cat: string): string { - let recStr = [] - recStr.push(cat, ' -> _ [', this.arg, ']') - return recStr.join('') - } -} - -/** - * PArg - */ -class PArg { - public fid: FId - public hypos: FId[] - - public constructor(...hypos: FId[]) { - this.fid = hypos[hypos.length-1] - if (hypos.length > 1) - this.hypos = hypos.slice(0, hypos.length-1) - else - this.hypos = [] - } -} - -/** - * Const - */ -class Const { - public id: string - public lit: Fun - public toks: string[] - - public constructor(lit: Fun, toks: string[]) { - this.id = 'Const' - this.lit = lit - this.toks = toks - } - - public show(cat: string): string { - let recStr = [] - recStr.push(cat, ' -> ', this.lit.print()) - return recStr.join('') - } - - public isEqual(obj: Const): boolean { - if (this.id != obj.id || this.lit.isEqual(obj.lit) || this.toks.length != obj.toks.length) - return false - - for (let i in this.toks) { - if (this.toks[i] != obj.toks[i]) - return false - } - - return true - } -} - -/** - * CncFun - */ -class CncFun { - public name: string - public lins: number[] | Sym[][] - - public constructor(name: string, lins: FId[]) { - this.name = name - this.lins = lins - } -} - -/** - * Sym: Definition of symbols present in linearization records - */ -type Sym = SymCat | SymKS | SymKP | SymLit - -/** - * SymCat: Object to represent argument projections in grammar rules - */ -class SymCat { - public id: string - public i: number - public label: number - - public constructor(i: number, label: number) { - this.id = 'Arg' - this.i = i - this.label = label - } - - public show(): string { - let argStr = [] - argStr.push(this.i, this.label) - return argStr.join('.') - } -} - -/** - * SymKS: Object to represent terminals in grammar rules - */ -class SymKS { - public id: string - public tokens: string[] - public tag?: string - - public constructor(...tokens: string[]) { - this.id = 'KS' - this.tokens = tokens - } - - public show(): string { - let terminalStr = [] - terminalStr.push('"', this.tokens, '"') - return terminalStr.join('') - } - - public tagWith(tag: string): SymKS { - let s = new SymKS() - s.tokens = [...this.tokens] // copy array - s.tag = tag - return s - } -} - -/** - * SymKP: Object to represent pre in grammar rules - */ -class SymKP { - public id: string - public tokens: SymKS[] - public alts: Alt[] - public tag?: string - - public constructor(tokens: SymKS[], alts: Alt[]) { - this.id = 'KP' - this.tokens = tokens - this.alts = alts - } - - public show(): string { - let terminalStr = [] - terminalStr.push('"', this.tokens, '"') - return terminalStr.join('') - } - - public tagWith(tag: string): SymKP { - let s = new SymKP([...this.tokens], [...this.alts]) // copy arguments - s.tag = tag - return s - } -} - -/** - * Alt - */ -class Alt { - public tokens: SymKS[] - public prefixes: string[] - - public constructor(tokens: SymKS[], prefixes: string[]) { - this.tokens = tokens - this.prefixes = prefixes - } -} - -/** - * SymLit: Object to represent pre in grammar rules - */ -class SymLit { - public id: string - public i: number - public label: number - - public constructor(i: number, label: number) { - this.id = 'Lit' - this.i = i - this.label = label - } - - public getId(): string { - return this.id - } - - public show(): string { - let argStr = [] - argStr.push(this.i, this.label) - return argStr.join('.') - } -} - -/** - * Trie - */ -class Trie { - public value: T[] | null - private items: {[key: string]: Trie} - - public constructor() { - this.value = null - this.items = {} - } - - public insertChain(keys: string[], obj: T[]): void { - let node: Trie = this - keys.forEach((key: string): void => { - let nnode = node.items[key] - if (nnode == null) { - nnode = new Trie() - node.items[key] = nnode - } - node = nnode - }) - node.value = obj - } - - public insertChain1(keys: string[], obj: T): void { - let node: Trie = this - keys.forEach((key: string): void => { - let nnode = node.items[key] - if (nnode == null) { - nnode = new Trie() - node.items[key] = nnode - } - node = nnode - }) - if (node.value == null) - node.value = [obj] - else - node.value.push(obj) - } - - public lookup(key: string): Trie { - return this.items[key] - } - - public isEmpty(): boolean { - if (this.value != null) - return false - - for (let _ in this.items) { - return false - } - - return true - } -} - -/** - * ParseState - */ -class ParseState { - private concrete: GFConcrete - private startCat: string - private items: Trie - private chart: Chart - - public constructor(concrete: GFConcrete, startCat: string) { - this.concrete = concrete - this.startCat = startCat - this.items = new Trie() - this.chart = new Chart(concrete) - - let items = [] - - let fids = concrete.startCats[startCat] - if (fids != null) { - let fid: FId - for (fid = fids.s; fid <= fids.e; fid++) { - let exProds = this.chart.expandForest(fid) - for (let j in exProds) { - let rule = exProds[j] as Apply - let fun = rule.fun as CncFun - for (let lbl in fun.lins) { - items.push(new ActiveItem( - 0, - 0, - rule.fun as CncFun, - fun.lins[lbl] as Sym[], - rule.args, - fid, - parseInt(lbl)) - ) - } - } - } - } - - this.items.insertChain([], items) - } - - public next(token: string): boolean { - let acc = this.items.lookup(token) - if (acc == null) { - acc = new Trie() - } - this.process( - this.items.value, - function (fid: FId): Const | null { - switch (fid) { - // String - case -1: - return new Const(new Fun('"'+token+'"'), [token]) - // Integer - case -2: { - let x = parseInt(token,10) - if (token == '0' || (x != 0 && !isNaN(x))) - return new Const(new Fun(token), [token]) - else - return null - } - // Float - case -3: { - let x = parseFloat(token) - if (token == '0' || token == '0.0' || (x != 0 && !isNaN(x))) - return new Const(new Fun(token), [token]) - else - return null - } - } - - return null - }, - function (tokens: string[], item: ActiveItem): void { - if (tokens[0] == token) { - let tokens1 = [] - for (let i = 1; i < tokens.length; i++) { - tokens1[i-1] = tokens[i] - } - acc.insertChain1(tokens1, item) - } - } - ) - - this.items = acc - this.chart.shift() - - return !this.items.isEmpty() - } - - /** - * For a ParseState and a partial input, return all possible completions - * Based closely on ParseState.next() - * currentToken could be empty or a partial string - */ - public complete(currentToken: string): Trie { - - // Initialise accumulator for suggestions - let acc = this.items.lookup(currentToken) - if (acc == null) - acc = new Trie() - - this.process( - // Items - this.items.value, - - // Deal with literal categories - function (_fid: FId): null { - // Always return null, as suggested by Krasimir - return null - }, - - // Takes an array of tokens and populates the accumulator - function (tokens: string[], item: ActiveItem): void { - if (currentToken == '' || tokens[0].indexOf(currentToken) == 0) { //if begins with... - let tokens1 = [] - for (let i = 1; i < tokens.length; i++) { - tokens1[i-1] = tokens[i] - } - acc.insertChain1(tokens1, item) - } - } - ) - - // Return matches - return acc - } - - public extractTrees(): Fun[] { - this.process( - this.items.value, - function (_fid: FId): null { - return null - }, - function (_tokens: string[], _item: ActiveItem): void { - } - ) - - let totalFIds = this.concrete.totalFIds - let forest = this.chart.forest - - function go(fid: FId): Fun[] { - if (fid < totalFIds) { - return [new Fun('?')] - } else { - let trees: Fun[] = [] - - let rules = forest[fid] // could be undefined - for (let j in rules) { - let rule: Rule = rules[j] - if (rule.id == 'Const') { - trees.push((rule as Const).lit) - } else { - rule = rule as Apply - let arg_ix: number[] = [] - let arg_ts: Fun[][] = [] - for (let k in rule.args) { - arg_ix[k] = 0 - arg_ts[k] = go(rule.args[k].fid) - } - - while (true) { - let t = new Fun((rule.fun as CncFun).name) - for (let k = 0; k < arg_ts.length; k++) { - t.setArg(k,arg_ts[k][arg_ix[k]]) - } - trees.push(t) - - let i = 0 - while (i < arg_ts.length) { - arg_ix[i]++ - if (arg_ix[i] < arg_ts[i].length) - break - - arg_ix[i] = 0 - i++ - } - - if (i >= arg_ts.length) - break - } - } - } - - return trees - } - } - - let trees = [] - let fids = this.concrete.startCats[this.startCat] - if (fids != null) { - for (let fid0 = fids.s; fid0 <= fids.e; fid0++) { - - let labels: {[key: number]: boolean} = {} - let rules = this.chart.expandForest(fid0) - rules.forEach((rule): void => { - for (let lbl in (rule.fun as CncFun).lins) { - labels[lbl] = true - } - }) - - for (let lbl0 in labels) { - let lbl: number = parseInt(lbl0) - let fid = this.chart.lookupPC(fid0, lbl, 0) - let arg_ts = go(fid) - for (let i in arg_ts) { - let isMember = false - for (let j in trees) { - if (arg_ts[i].isEqual(trees[j])) { - isMember = true - break - } - } - - if (!isMember) - trees.push(arg_ts[i]) - } - } - } - } - - return trees - } - - private process( - agenda: ActiveItem[] | null, - literalCallback: (fid: FId) => Const | null, // this is right - tokenCallback: (tokens: string[], item: ActiveItem) => void - ): void { - if (agenda != null) { - while (agenda.length > 0) { - let item = agenda.pop() as ActiveItem - let lin = item.seq - - if (item.dot < lin.length) { - let sym0 = lin[item.dot] - switch (sym0.id) { - case 'Arg': { - let sym = sym0 as SymCat - let fid = item.args[sym.i].fid - let label = sym.label - - let items = this.chart.lookupAC(fid,label) - if (items == null) { - let rules = this.chart.expandForest(fid) - for (let j in rules) { - let rule = rules[j] as Apply - agenda.push(new ActiveItem( - this.chart.offset, - 0, - rule.fun as CncFun, - ((rule.fun as CncFun).lins as Sym[][])[label], - rule.args, - fid, - label) - ) - } - this.chart.insertAC(fid,label,[item]) - } else { - let isMember = false - for (let j in items) { - if (items[j].isEqual(item)) { - isMember = true - break - } - } - - if (!isMember) { - items.push(item) - - let fid2 = this.chart.lookupPC(fid,label,this.chart.offset) - if (fid2 != null) { - agenda.push(item.shiftOverArg(sym.i,fid2)) - } - } - } - break - } - case 'KS': { - let sym = sym0 as SymKS - tokenCallback(sym.tokens, item.shiftOverTokn()) - break - } - case 'KP': { - let sym = sym0 as SymKP - let pitem = item.shiftOverTokn() - sym.tokens.forEach((symks: SymKS): void => { // TODO not sure if this is right - tokenCallback(symks.tokens, pitem) - }) - sym.alts.forEach((alt: Alt): void => { - // tokenCallback(alt.tokens, pitem) - alt.tokens.forEach((symks: SymKS): void => { // TODO not sure if this is right - tokenCallback(symks.tokens, pitem) - }) - }) - break - } - case 'Lit': { - let sym = sym0 as SymLit - let fid = item.args[sym.i].fid - let rules = this.chart.forest[fid] - if (rules != null) { - tokenCallback((rules[0] as Const).toks, item.shiftOverTokn()) - } else { - let rule = literalCallback(fid) - if (rule != null) { - fid = this.chart.nextId++ - this.chart.forest[fid] = [rule] - tokenCallback(rule.toks, item.shiftOverArg(sym.i, fid)) - } - } - break - } - } - } else { - let fid = this.chart.lookupPC(item.fid,item.lbl,item.offset) - if (fid == null) { - fid = this.chart.nextId++ - - let items = this.chart.lookupACo(item.offset,item.fid,item.lbl) - if (items != null) { - items.forEach((pitem: ActiveItem): void => { - let i = (pitem.seq[pitem.dot] as SymCat).i - agenda.push(pitem.shiftOverArg(i,fid)) - }) - } - - this.chart.insertPC(item.fid,item.lbl,item.offset,fid) - this.chart.forest[fid] = [new Apply(item.fun,item.args)] - } else { - let labels = this.chart.labelsAC(fid) - if (labels != null) { - for (let lbl in labels) { - agenda.push(new ActiveItem( - this.chart.offset, - 0, - item.fun, - item.fun.lins[lbl] as Sym[], - item.args, - fid, - parseInt(lbl)) - ) - } - } - - let rules = this.chart.forest[fid] - let rule = new Apply(item.fun,item.args) - - let isMember = false - rules.forEach((rule1): void => { - if ((rule1 as Apply).isEqual(rule)) // TODO might need to check if Coerce here - isMember = true - }) - - if (!isMember) - rules.push(rule) - } - } - } - } - } -} - -/** - * Map of label to list of ActiveItems - */ -interface ActiveItemMap {[key: number]: ActiveItem[]} - -/** - * Chart - */ -class Chart { - // private active: {[key: number]: ActiveItem} // key: FId - private active: {[key: number]: ActiveItemMap} // key: FId - private actives: {[key: number]: ActiveItemMap}[] // key: FId - private passive: {[key: string]: FId} - public forest: {[key: number]: Rule[]} // key: FId - public nextId: number - public offset: number - - public constructor(concrete: GFConcrete) { - this.active = {} - this.actives = [] - this.passive = {} - this.forest = {} - this.nextId = concrete.totalFIds - this.offset = 0 - - for (let fid in concrete.pproductions) { - this.forest[fid] = concrete.pproductions[fid] - } - } - - public lookupAC(fid: FId, label: number): ActiveItem[] | null { - let tmp = this.active[fid] - if (tmp == null) - return null - return tmp[label] - } - - public lookupACo(offset: number, fid: FId, label: number): ActiveItem[] | null { - let tmp: ActiveItemMap - - if (offset == this.offset) - tmp = this.active[fid] - else - tmp = this.actives[offset][fid] - - if (tmp == null) - return null - - return tmp[label] - } - - public labelsAC(fid: FId): ActiveItemMap { - return this.active[fid] - } - - public insertAC(fid: FId, label: number, items: ActiveItem[]): void { - let tmp: ActiveItemMap = this.active[fid] - if (tmp == null) { - tmp = {} - this.active[fid] = tmp - } - tmp[label] = items - } - - public lookupPC(fid: FId, label: number, offset: number): FId { - let key = fid+'.'+label+'-'+offset - return this.passive[key] - } - - public insertPC(fid1: FId, label: number, offset: number, fid2: FId): void { - let key = fid1+'.'+label+'-'+offset - this.passive[key] = fid2 - } - - public shift(): void { - this.actives.push(this.active) - this.active = {} - this.passive = {} - this.offset++ - } - - public expandForest(fid: FId): Apply[] { - let rules: Apply[] = [] - let forest = this.forest - - let go = function (rules0: Rule[]): void { - for (let i in rules0) { - let rule = rules0[i] - switch (rule.id) { - case 'Apply': - rules.push(rule as Apply) - break - case 'Coerce': - go(forest[(rule as Coerce).arg]) - break - } - } - } - - go(this.forest[fid]) - return rules - } -} - -/** - * ActiveItem - */ -class ActiveItem { - public offset: number - public dot: number - public fun: CncFun - public seq: Sym[] - public args: PArg[] - public fid: FId - public lbl: number - - public constructor( - offset: number, - dot: number, - fun: CncFun, - seq: Sym[], - args: PArg[], - fid: FId, - lbl: number - ) { - this.offset = offset - this.dot = dot - this.fun = fun - this.seq = seq - this.args = args - this.fid = fid - this.lbl = lbl - } - - public isEqual(obj: ActiveItem): boolean { - return (this.offset== obj.offset && - this.dot == obj.dot && - this.fun == obj.fun && - this.seq == obj.seq && - this.args == obj.args && - this.fid == obj.fid && - this.lbl == obj.lbl) - } - - public shiftOverArg(i: number, fid: FId): ActiveItem { - let nargs: PArg[] = [] - for (let k in this.args) { - nargs[k] = this.args[k] - } - nargs[i] = new PArg(fid) - return new ActiveItem(this.offset,this.dot+1,this.fun,this.seq,nargs,this.fid,this.lbl) - } - - public shiftOverTokn(): ActiveItem { - return new ActiveItem(this.offset,this.dot+1,this.fun,this.seq,this.args,this.fid,this.lbl) - } -} - -/** - * Utilities - */ - -/* from Remedial JavaScript by Douglas Crockford, http://javascript.crockford.com/remedial.html */ -// function isString(a: any): boolean { -// return typeof a == 'string' || a instanceof String -// } -// function isArray(a: any): boolean { -// return a && typeof a == 'object' && a.constructor == Array -// } -function isUndefined(a: any): boolean { // eslint-disable-line @typescript-eslint/no-explicit-any - return typeof a == 'undefined' -} -// function isBoolean(a: any): boolean { -// return typeof a == 'boolean' -// } -// function isNumber(a: any): boolean { -// return typeof a == 'number' && isFinite(a) -// } -// function isFunction(a: any): boolean { -// return typeof a == 'function' -// } -// function dumpObject (obj: any): string { -// if (isUndefined(obj)) { -// return 'undefined' -// } else if (isString(obj)) { -// return '"' + obj.toString() + '"' // FIXME: escape -// } else if (isBoolean(obj) || isNumber(obj)) { -// return obj.toString() -// } else if (isArray(obj)) { -// let x = '[' -// for (let i = 0; i < obj.length; i++) { -// x += dumpObject(obj[i]) -// if (i < obj.length-1) { -// x += ',' -// } -// } -// return x + ']' -// } else { -// let x = '{' -// for (let y in obj) { -// x += y + '=' + dumpObject(obj[y]) + ';' -// } -// return x + '}' -// } -// } - -/** - * Polyfills for older targets - */ - -interface String { - startsWith: (search: string, pos?: number) => boolean; - includes: (search: string, start?: number) => boolean; -} - -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith#Polyfill -if (!String.prototype.startsWith) { - Object.defineProperty(String.prototype, 'startsWith', { - value: function(search: string, pos?: number): boolean { - pos = !pos || pos < 0 ? 0 : +pos - return this.substring(pos, pos + search.length) === search - } - }) -} -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes#Polyfill -if (!String.prototype.includes) { - Object.defineProperty(String.prototype, 'includes', { - value: function(search: string, start?: number): boolean { - 'use strict' - if (typeof start !== 'number') { - start = 0 - } - - if (start + search.length > this.length) { - return false - } else { - return this.indexOf(search, start) !== -1 - } - } - }) -} - -/** - * gflib.ts as a module - * If you want to make this into a proper module, uncomment this: - */ - -// export { -// GFGrammar, -// GFAbstract, -// GFConcrete, -// Fun, -// Type, -// Apply, -// Coerce, -// PArg, -// Const, -// CncFun, -// SymCat, -// SymKS, -// SymKP, -// SymLit, -// Alt, -// } diff --git a/src/runtime/typescript/js/gflib.js b/src/runtime/typescript/js/gflib.js deleted file mode 100644 index 7c6352705..000000000 --- a/src/runtime/typescript/js/gflib.js +++ /dev/null @@ -1,1164 +0,0 @@ -"use strict"; -var GFGrammar = (function () { - function GFGrammar(abstract, concretes) { - this.abstract = abstract; - this.concretes = concretes; - } - GFGrammar.prototype.translate = function (input, fromLang, toLang) { - var outputs = {}; - var fromConcs = this.concretes; - if (fromLang) { - fromConcs = {}; - fromConcs[fromLang] = this.concretes[fromLang]; - } - var toConcs = this.concretes; - if (toLang) { - toConcs = {}; - toConcs[toLang] = this.concretes[toLang]; - } - for (var c1 in fromConcs) { - var concrete = this.concretes[c1]; - var trees = concrete.parseString(input, this.abstract.startcat); - if (trees.length > 0) { - outputs[c1] = []; - for (var i in trees) { - outputs[c1][i] = {}; - for (var c2 in toConcs) { - outputs[c1][i][c2] = this.concretes[c2].linearize(trees[i]); - } - } - } - } - return outputs; - }; - return GFGrammar; -}()); -var Fun = (function () { - function Fun(name) { - var args = []; - for (var _i = 1; _i < arguments.length; _i++) { - args[_i - 1] = arguments[_i]; - } - this.name = name; - this.args = []; - for (var i = 1; i < args.length; i++) { - this.args[i - 1] = args[i]; - } - } - Fun.prototype.print = function () { - return this.show(0); - }; - Fun.prototype.show = function (prec) { - if (this.isMeta()) { - if (isUndefined(this.type)) { - return '?'; - } - else { - var s = '?:' + this.type; - if (prec > 0) { - s = '(' + s + ')'; - } - return s; - } - } - else { - var s = this.name; - var cs = this.args; - for (var i in cs) { - s += ' ' + (isUndefined(cs[i]) ? 'undefined' : cs[i].show(1)); - } - if (prec > 0 && cs.length > 0) { - s = '(' + s + ')'; - } - return s; - } - }; - Fun.prototype.getArg = function (i) { - return this.args[i]; - }; - Fun.prototype.setArg = function (i, c) { - this.args[i] = c; - }; - Fun.prototype.isMeta = function () { - return this.name == '?'; - }; - Fun.prototype.isComplete = function () { - if (this.isMeta()) { - return false; - } - else { - for (var i in this.args) { - if (!this.args[i].isComplete()) { - return false; - } - } - return true; - } - }; - Fun.prototype.isLiteral = function () { - return (/^[\"\-\d]/).test(this.name); - }; - Fun.prototype.isString = function () { - return (/^\".*\"$/).test(this.name); - }; - Fun.prototype.isInt = function () { - return (/^\-?\d+$/).test(this.name); - }; - Fun.prototype.isFloat = function () { - return (/^\-?\d*(\.\d*)?$/).test(this.name) && this.name != '.' && this.name != '-.'; - }; - Fun.prototype.isEqual = function (obj) { - if (this.name != obj.name) - return false; - for (var i in this.args) { - if (!this.args[i].isEqual(obj.args[i])) - return false; - } - return true; - }; - return Fun; -}()); -var GFAbstract = (function () { - function GFAbstract(startcat, types) { - this.startcat = startcat; - this.types = types; - } - GFAbstract.prototype.addType = function (fun, args, cat) { - this.types[fun] = new Type(args, cat); - }; - GFAbstract.prototype.getArgs = function (fun) { - return this.types[fun].args; - }; - GFAbstract.prototype.getCat = function (fun) { - return this.types[fun].cat; - }; - GFAbstract.prototype.annotate = function (tree, type) { - var typ = this.types[tree.name]; - if (tree.isMeta()) { - tree.type = type; - } - else if (!isUndefined(typ)) { - for (var i in tree.args) { - this.annotate(tree.args[i], typ.args[i]); - } - } - return tree; - }; - GFAbstract.prototype.handleLiterals = function (tree, type) { - if (tree.name != '?') { - if (type == 'String' || type == 'Int' || type == 'Float') { - tree.name = type + '_Literal_' + tree.name; - } - else { - var typ = this.types[tree.name]; - for (var i in tree.args) { - this.handleLiterals(tree.args[i], typ.args[i]); - } - } - } - return tree; - }; - GFAbstract.prototype.copyTree = function (x) { - var t = new Fun(x.name); - if (!isUndefined(x.type)) { - t.type = x.type; - } - var cs = x.args; - if (!isUndefined(cs)) { - for (var i = 0; i < cs.length; i++) { - t.setArg(i, this.copyTree(cs[i])); - } - } - return t; - }; - GFAbstract.prototype.parseTree = function (str, type) { - var pt = this.parseTree_(str.match(/[\w\u00C0-\u00FF\'\.\"]+|\(|\)|\?|\:/g) || [], 0); - return pt ? this.annotate(pt, type) : null; - }; - GFAbstract.prototype.parseTree_ = function (tokens, prec) { - if (tokens.length == 0 || tokens[0] == ')') { - return null; - } - var t = tokens.shift(); - if (!t) - return null; - if (t == '(') { - var tree = this.parseTree_(tokens, 0); - tokens.shift(); - return tree; - } - else if (t == '?') { - return new Fun('?'); - } - else { - var tree = new Fun(t); - if (prec == 0) { - var c = void 0; - var i = void 0; - for (i = 0; (c = this.parseTree_(tokens, 1)) !== null; i++) { - tree.setArg(i, c); - } - } - return tree; - } - }; - return GFAbstract; -}()); -var Type = (function () { - function Type(args, cat) { - this.args = args; - this.cat = cat; - } - return Type; -}()); -var GFConcrete = (function () { - function GFConcrete(flags, productions, functions, sequences, startCats, totalFIds) { - this.flags = flags; - this.functions = functions; - this.startCats = startCats; - this.totalFIds = totalFIds; - this.pproductions = productions; - this.lproductions = {}; - var _loop_1 = function (fid0) { - var fid = parseInt(fid0); - var _loop_2 = function (i) { - var rule = productions[fid][i]; - if (rule.id == 'Apply') { - rule = rule; - var fun_1 = this_1.functions[rule.fun]; - var lproductions_1 = this_1.lproductions; - rule.fun = fun_1; - var register_1 = function (args, key, i) { - if (i < args.length) { - var c = 0; - var arg = args[i].fid; - for (var k in productions[arg]) { - var rule_1 = productions[arg][k]; - if (rule_1.id == 'Coerce') { - rule_1 = rule_1; - register_1(args, key + '_' + rule_1.arg, i + 1); - c++; - } - } - if (c == 0) { - register_1(args, key + '_' + arg, i + 1); - } - } - else { - var set = lproductions_1[key]; - if (set == null) { - set = []; - lproductions_1[key] = set; - } - set.push({ fun: fun_1, fid: fid }); - } - }; - register_1(rule.args, rule.fun.name, 0); - } - }; - for (var i in productions[fid]) { - _loop_2(i); - } - }; - var this_1 = this; - for (var fid0 in productions) { - _loop_1(fid0); - } - for (var _i = 0, functions_1 = functions; _i < functions_1.length; _i++) { - var fun = functions_1[_i]; - for (var j in fun.lins) { - fun.lins[j] = sequences[fun.lins[j]]; - } - } - } - GFConcrete.prototype.linearizeSyms = function (tree, tag) { - var res = []; - if (tree.isString()) { - var sym = new SymKS(tree.name); - sym.tag = tag; - res.push({ fid: -1, table: [[sym]] }); - } - else if (tree.isInt()) { - var sym = new SymKS(tree.name); - sym.tag = tag; - res.push({ fid: -2, table: [[sym]] }); - } - else if (tree.isFloat()) { - var sym = new SymKS(tree.name); - sym.tag = tag; - res.push({ fid: -3, table: [[sym]] }); - } - else if (tree.isMeta()) { - var cat = this.startCats[tree.type]; - var sym = new SymKS(tree.name); - sym.tag = tag; - for (var fid = cat.s; fid <= cat.e; fid++) { - res.push({ fid: fid, table: [[sym]] }); - } - } - else { - var cs_1 = []; - for (var i in tree.args) { - cs_1.push(this.linearizeSyms(tree.args[i], tag + '-' + i)[0]); - } - var key = tree.name; - for (var i in cs_1) { - if (isUndefined(cs_1[i])) { - console.warn(tree.args[i].name + " is undefined"); - return [{ - fid: -5, - table: [[new SymKS("[" + tree.name + "]").tagWith(tag)]] - }]; - } - else if (cs_1[i].fid === -5) { - for (var k in this.lproductions) { - if (k.includes(tree.name)) { - key = k; - break; - } - } - break; - } - else { - key = key + '_' + cs_1[i].fid; - } - } - for (var i in this.lproductions[key]) { - var rule = this.lproductions[key][i]; - var row = { - fid: rule.fid, - table: [] - }; - var _loop_3 = function (j) { - var lin = rule.fun.lins[j]; - var toks = []; - row.table[j] = toks; - lin.forEach(function (sym0) { - switch (sym0.id) { - case 'Arg': - case 'Lit': { - var sym = sym0; - var ts = cs_1[sym.i].table[sym.label]; - for (var l in ts) { - toks.push(ts[l]); - } - break; - } - case 'KS': - case 'KP': { - var sym = sym0; - toks.push(sym.tagWith(tag)); - break; - } - } - }); - }; - for (var j in rule.fun.lins) { - _loop_3(j); - } - res.push(row); - } - } - return res; - }; - GFConcrete.prototype.syms2toks = function (syms) { - var ts = []; - var _loop_4 = function (i) { - var sym0 = syms[i]; - switch (sym0.id) { - case 'KS': { - var sym = sym0; - for (var j in sym.tokens) { - ts.push(new TaggedString(sym.tokens[j], sym.tag)); - } - break; - } - case 'KP': { - var sym_1 = sym0; - var addedAlt_1 = false; - if (i < syms.length - 1) { - var nextSym = syms[i + 1]; - if (nextSym.id == 'KS') { - var nextToken_1 = nextSym.tokens[0]; - sym_1.alts.forEach(function (alt) { - if (alt.prefixes.some(function (p) { return nextToken_1.startsWith(p); })) { - alt.tokens.forEach(function (symks) { - symks.tokens.forEach(function (t) { - ts.push(new TaggedString(t, sym_1.tag)); - }); - }); - addedAlt_1 = true; - return; - } - }); - } - } - if (addedAlt_1) - break; - sym_1.tokens.forEach(function (symks) { - symks.tokens.forEach(function (t) { - ts.push(new TaggedString(t, sym_1.tag)); - }); - }); - break; - } - } - }; - for (var i = 0; i < syms.length; i++) { - _loop_4(i); - } - return ts; - }; - GFConcrete.prototype.linearizeAll = function (tree) { - var _this = this; - return this.linearizeSyms(tree, '0').map(function (r) { - return _this.unlex(_this.syms2toks(r.table[0])); - }); - }; - GFConcrete.prototype.linearize = function (tree) { - var res = this.linearizeSyms(tree, '0'); - if (res.length > 0) - return this.unlex(this.syms2toks(res[0].table[0])); - else - return ''; - }; - GFConcrete.prototype.tagAndLinearize = function (tree) { - var res = this.linearizeSyms(tree, '0'); - if (res.length > 0) - return this.syms2toks(res[0].table[0]); - else - return []; - }; - GFConcrete.prototype.unlex = function (ts) { - if (ts.length == 0) { - return ''; - } - var noSpaceAfter = /^[\(\-\[]/; - var noSpaceBefore = /^[\.\,\?\!\)\:\;\-\]]/; - var s = ''; - for (var i = 0; i < ts.length; i++) { - var t = ts[i].s; - var after = i < ts.length - 1 ? ts[i + 1].s : null; - s += t; - if (after != null - && !t.match(noSpaceAfter) - && !after.match(noSpaceBefore)) { - s += ' '; - } - } - return s; - }; - GFConcrete.prototype.tokenize = function (string) { - var inToken = false; - var start = 0; - var end; - var tokens = []; - var i; - for (i = 0; i < string.length; i++) { - if (string.charAt(i) == ' ' - || string.charAt(i) == '\f' - || string.charAt(i) == '\n' - || string.charAt(i) == '\r' - || string.charAt(i) == '\t' - || string.charAt(i) == '\v' - || string.charAt(i) == String.fromCharCode(160)) { - if (inToken) { - end = i - 1; - inToken = false; - tokens.push(string.substr(start, end - start + 1)); - } - } - else { - if (!inToken) { - start = i; - inToken = true; - } - } - } - if (inToken) { - end = i - 1; - inToken = false; - tokens.push(string.substr(start, end - start + 1)); - } - return tokens; - }; - GFConcrete.prototype.parseString = function (string, cat) { - var tokens = this.tokenize(string); - var ps = new ParseState(this, cat); - for (var i in tokens) { - if (!ps.next(tokens[i])) - return []; - } - return ps.extractTrees(); - }; - GFConcrete.prototype.complete = function (input, cat) { - if (input == null) - input = ''; - var tokens = input.trim().split(' '); - for (var i = tokens.length - 1; i >= 0; i--) { - if (tokens[i] == '') { - tokens.splice(i, 1); - } - } - var current = tokens.pop(); - if (current == null) - current = ''; - var ps = new ParseState(this, cat); - var ps2 = new ParseState(this, cat); - for (var i = 0; i < tokens.length; i++) { - if (!ps.next(tokens[i])) { - return { 'consumed': [], 'suggestions': [] }; - } - ps2.next(tokens[i]); - } - if (ps2.next(current)) { - ps.next(current); - tokens.push(current); - current = ''; - } - var acc = ps.complete(current); - var suggs = []; - if (acc.value) { - acc.value.forEach(function (a) { - a.seq.forEach(function (s) { - switch (s.id) { - case 'KS': { - s.tokens.forEach(function (t) { - suggs.push(t); - }); - break; - } - case 'KP': { - s.tokens.forEach(function (symks) { - symks.tokens.forEach(function (t) { - suggs.push(t); - }); - }); - break; - } - } - }); - }); - } - return { 'consumed': tokens, 'suggestions': suggs }; - }; - return GFConcrete; -}()); -var TaggedString = (function () { - function TaggedString(s, tag) { - this.s = s; - this.tag = tag; - } - return TaggedString; -}()); -var Apply = (function () { - function Apply(fun, args) { - this.id = 'Apply'; - this.fun = fun; - this.args = args; - } - Apply.prototype.show = function (cat) { - var recStr = []; - recStr.push(cat, ' -> ', this.fun.name, ' [', this.args, ']'); - return recStr.join(''); - }; - Apply.prototype.isEqual = function (obj) { - if (this.id != obj.id || this.fun != obj.fun || this.args.length != obj.args.length) - return false; - for (var i in this.args) { - if (this.args[i] != obj.args[i]) - return false; - } - return true; - }; - return Apply; -}()); -var Coerce = (function () { - function Coerce(arg) { - this.id = 'Coerce'; - this.arg = arg; - } - Coerce.prototype.show = function (cat) { - var recStr = []; - recStr.push(cat, ' -> _ [', this.arg, ']'); - return recStr.join(''); - }; - return Coerce; -}()); -var PArg = (function () { - function PArg() { - var hypos = []; - for (var _i = 0; _i < arguments.length; _i++) { - hypos[_i] = arguments[_i]; - } - this.fid = hypos[hypos.length - 1]; - if (hypos.length > 1) - this.hypos = hypos.slice(0, hypos.length - 1); - else - this.hypos = []; - } - return PArg; -}()); -var Const = (function () { - function Const(lit, toks) { - this.id = 'Const'; - this.lit = lit; - this.toks = toks; - } - Const.prototype.show = function (cat) { - var recStr = []; - recStr.push(cat, ' -> ', this.lit.print()); - return recStr.join(''); - }; - Const.prototype.isEqual = function (obj) { - if (this.id != obj.id || this.lit.isEqual(obj.lit) || this.toks.length != obj.toks.length) - return false; - for (var i in this.toks) { - if (this.toks[i] != obj.toks[i]) - return false; - } - return true; - }; - return Const; -}()); -var CncFun = (function () { - function CncFun(name, lins) { - this.name = name; - this.lins = lins; - } - return CncFun; -}()); -var SymCat = (function () { - function SymCat(i, label) { - this.id = 'Arg'; - this.i = i; - this.label = label; - } - SymCat.prototype.show = function () { - var argStr = []; - argStr.push(this.i, this.label); - return argStr.join('.'); - }; - return SymCat; -}()); -var SymKS = (function () { - function SymKS() { - var tokens = []; - for (var _i = 0; _i < arguments.length; _i++) { - tokens[_i] = arguments[_i]; - } - this.id = 'KS'; - this.tokens = tokens; - } - SymKS.prototype.show = function () { - var terminalStr = []; - terminalStr.push('"', this.tokens, '"'); - return terminalStr.join(''); - }; - SymKS.prototype.tagWith = function (tag) { - var s = new SymKS(); - s.tokens = this.tokens.slice(); - s.tag = tag; - return s; - }; - return SymKS; -}()); -var SymKP = (function () { - function SymKP(tokens, alts) { - this.id = 'KP'; - this.tokens = tokens; - this.alts = alts; - } - SymKP.prototype.show = function () { - var terminalStr = []; - terminalStr.push('"', this.tokens, '"'); - return terminalStr.join(''); - }; - SymKP.prototype.tagWith = function (tag) { - var s = new SymKP(this.tokens.slice(), this.alts.slice()); - s.tag = tag; - return s; - }; - return SymKP; -}()); -var Alt = (function () { - function Alt(tokens, prefixes) { - this.tokens = tokens; - this.prefixes = prefixes; - } - return Alt; -}()); -var SymLit = (function () { - function SymLit(i, label) { - this.id = 'Lit'; - this.i = i; - this.label = label; - } - SymLit.prototype.getId = function () { - return this.id; - }; - SymLit.prototype.show = function () { - var argStr = []; - argStr.push(this.i, this.label); - return argStr.join('.'); - }; - return SymLit; -}()); -var Trie = (function () { - function Trie() { - this.value = null; - this.items = {}; - } - Trie.prototype.insertChain = function (keys, obj) { - var node = this; - keys.forEach(function (key) { - var nnode = node.items[key]; - if (nnode == null) { - nnode = new Trie(); - node.items[key] = nnode; - } - node = nnode; - }); - node.value = obj; - }; - Trie.prototype.insertChain1 = function (keys, obj) { - var node = this; - keys.forEach(function (key) { - var nnode = node.items[key]; - if (nnode == null) { - nnode = new Trie(); - node.items[key] = nnode; - } - node = nnode; - }); - if (node.value == null) - node.value = [obj]; - else - node.value.push(obj); - }; - Trie.prototype.lookup = function (key) { - return this.items[key]; - }; - Trie.prototype.isEmpty = function () { - if (this.value != null) - return false; - for (var _ in this.items) { - return false; - } - return true; - }; - return Trie; -}()); -var ParseState = (function () { - function ParseState(concrete, startCat) { - this.concrete = concrete; - this.startCat = startCat; - this.items = new Trie(); - this.chart = new Chart(concrete); - var items = []; - var fids = concrete.startCats[startCat]; - if (fids != null) { - var fid = void 0; - for (fid = fids.s; fid <= fids.e; fid++) { - var exProds = this.chart.expandForest(fid); - for (var j in exProds) { - var rule = exProds[j]; - var fun = rule.fun; - for (var lbl in fun.lins) { - items.push(new ActiveItem(0, 0, rule.fun, fun.lins[lbl], rule.args, fid, parseInt(lbl))); - } - } - } - } - this.items.insertChain([], items); - } - ParseState.prototype.next = function (token) { - var acc = this.items.lookup(token); - if (acc == null) { - acc = new Trie(); - } - this.process(this.items.value, function (fid) { - switch (fid) { - case -1: - return new Const(new Fun('"' + token + '"'), [token]); - case -2: { - var x = parseInt(token, 10); - if (token == '0' || (x != 0 && !isNaN(x))) - return new Const(new Fun(token), [token]); - else - return null; - } - case -3: { - var x = parseFloat(token); - if (token == '0' || token == '0.0' || (x != 0 && !isNaN(x))) - return new Const(new Fun(token), [token]); - else - return null; - } - } - return null; - }, function (tokens, item) { - if (tokens[0] == token) { - var tokens1 = []; - for (var i = 1; i < tokens.length; i++) { - tokens1[i - 1] = tokens[i]; - } - acc.insertChain1(tokens1, item); - } - }); - this.items = acc; - this.chart.shift(); - return !this.items.isEmpty(); - }; - ParseState.prototype.complete = function (currentToken) { - var acc = this.items.lookup(currentToken); - if (acc == null) - acc = new Trie(); - this.process(this.items.value, function (_fid) { - return null; - }, function (tokens, item) { - if (currentToken == '' || tokens[0].indexOf(currentToken) == 0) { - var tokens1 = []; - for (var i = 1; i < tokens.length; i++) { - tokens1[i - 1] = tokens[i]; - } - acc.insertChain1(tokens1, item); - } - }); - return acc; - }; - ParseState.prototype.extractTrees = function () { - this.process(this.items.value, function (_fid) { - return null; - }, function (_tokens, _item) { - }); - var totalFIds = this.concrete.totalFIds; - var forest = this.chart.forest; - function go(fid) { - if (fid < totalFIds) { - return [new Fun('?')]; - } - else { - var trees_1 = []; - var rules = forest[fid]; - for (var j in rules) { - var rule = rules[j]; - if (rule.id == 'Const') { - trees_1.push(rule.lit); - } - else { - rule = rule; - var arg_ix = []; - var arg_ts = []; - for (var k in rule.args) { - arg_ix[k] = 0; - arg_ts[k] = go(rule.args[k].fid); - } - while (true) { - var t = new Fun(rule.fun.name); - for (var k = 0; k < arg_ts.length; k++) { - t.setArg(k, arg_ts[k][arg_ix[k]]); - } - trees_1.push(t); - var i = 0; - while (i < arg_ts.length) { - arg_ix[i]++; - if (arg_ix[i] < arg_ts[i].length) - break; - arg_ix[i] = 0; - i++; - } - if (i >= arg_ts.length) - break; - } - } - } - return trees_1; - } - } - var trees = []; - var fids = this.concrete.startCats[this.startCat]; - if (fids != null) { - var _loop_5 = function (fid0) { - var labels = {}; - var rules = this_2.chart.expandForest(fid0); - rules.forEach(function (rule) { - for (var lbl in rule.fun.lins) { - labels[lbl] = true; - } - }); - for (var lbl0 in labels) { - var lbl = parseInt(lbl0); - var fid = this_2.chart.lookupPC(fid0, lbl, 0); - var arg_ts = go(fid); - for (var i in arg_ts) { - var isMember = false; - for (var j in trees) { - if (arg_ts[i].isEqual(trees[j])) { - isMember = true; - break; - } - } - if (!isMember) - trees.push(arg_ts[i]); - } - } - }; - var this_2 = this; - for (var fid0 = fids.s; fid0 <= fids.e; fid0++) { - _loop_5(fid0); - } - } - return trees; - }; - ParseState.prototype.process = function (agenda, literalCallback, tokenCallback) { - if (agenda != null) { - var _loop_6 = function () { - var item = agenda.pop(); - var lin = item.seq; - if (item.dot < lin.length) { - var sym0 = lin[item.dot]; - switch (sym0.id) { - case 'Arg': { - var sym = sym0; - var fid = item.args[sym.i].fid; - var label = sym.label; - var items = this_3.chart.lookupAC(fid, label); - if (items == null) { - var rules = this_3.chart.expandForest(fid); - for (var j in rules) { - var rule = rules[j]; - agenda.push(new ActiveItem(this_3.chart.offset, 0, rule.fun, rule.fun.lins[label], rule.args, fid, label)); - } - this_3.chart.insertAC(fid, label, [item]); - } - else { - var isMember = false; - for (var j in items) { - if (items[j].isEqual(item)) { - isMember = true; - break; - } - } - if (!isMember) { - items.push(item); - var fid2 = this_3.chart.lookupPC(fid, label, this_3.chart.offset); - if (fid2 != null) { - agenda.push(item.shiftOverArg(sym.i, fid2)); - } - } - } - break; - } - case 'KS': { - var sym = sym0; - tokenCallback(sym.tokens, item.shiftOverTokn()); - break; - } - case 'KP': { - var sym = sym0; - var pitem_1 = item.shiftOverTokn(); - sym.tokens.forEach(function (symks) { - tokenCallback(symks.tokens, pitem_1); - }); - sym.alts.forEach(function (alt) { - alt.tokens.forEach(function (symks) { - tokenCallback(symks.tokens, pitem_1); - }); - }); - break; - } - case 'Lit': { - var sym = sym0; - var fid = item.args[sym.i].fid; - var rules = this_3.chart.forest[fid]; - if (rules != null) { - tokenCallback(rules[0].toks, item.shiftOverTokn()); - } - else { - var rule = literalCallback(fid); - if (rule != null) { - fid = this_3.chart.nextId++; - this_3.chart.forest[fid] = [rule]; - tokenCallback(rule.toks, item.shiftOverArg(sym.i, fid)); - } - } - break; - } - } - } - else { - var fid_1 = this_3.chart.lookupPC(item.fid, item.lbl, item.offset); - if (fid_1 == null) { - fid_1 = this_3.chart.nextId++; - var items = this_3.chart.lookupACo(item.offset, item.fid, item.lbl); - if (items != null) { - items.forEach(function (pitem) { - var i = pitem.seq[pitem.dot].i; - agenda.push(pitem.shiftOverArg(i, fid_1)); - }); - } - this_3.chart.insertPC(item.fid, item.lbl, item.offset, fid_1); - this_3.chart.forest[fid_1] = [new Apply(item.fun, item.args)]; - } - else { - var labels = this_3.chart.labelsAC(fid_1); - if (labels != null) { - for (var lbl in labels) { - agenda.push(new ActiveItem(this_3.chart.offset, 0, item.fun, item.fun.lins[lbl], item.args, fid_1, parseInt(lbl))); - } - } - var rules = this_3.chart.forest[fid_1]; - var rule_2 = new Apply(item.fun, item.args); - var isMember_1 = false; - rules.forEach(function (rule1) { - if (rule1.isEqual(rule_2)) - isMember_1 = true; - }); - if (!isMember_1) - rules.push(rule_2); - } - } - }; - var this_3 = this; - while (agenda.length > 0) { - _loop_6(); - } - } - }; - return ParseState; -}()); -var Chart = (function () { - function Chart(concrete) { - this.active = {}; - this.actives = []; - this.passive = {}; - this.forest = {}; - this.nextId = concrete.totalFIds; - this.offset = 0; - for (var fid in concrete.pproductions) { - this.forest[fid] = concrete.pproductions[fid]; - } - } - Chart.prototype.lookupAC = function (fid, label) { - var tmp = this.active[fid]; - if (tmp == null) - return null; - return tmp[label]; - }; - Chart.prototype.lookupACo = function (offset, fid, label) { - var tmp; - if (offset == this.offset) - tmp = this.active[fid]; - else - tmp = this.actives[offset][fid]; - if (tmp == null) - return null; - return tmp[label]; - }; - Chart.prototype.labelsAC = function (fid) { - return this.active[fid]; - }; - Chart.prototype.insertAC = function (fid, label, items) { - var tmp = this.active[fid]; - if (tmp == null) { - tmp = {}; - this.active[fid] = tmp; - } - tmp[label] = items; - }; - Chart.prototype.lookupPC = function (fid, label, offset) { - var key = fid + '.' + label + '-' + offset; - return this.passive[key]; - }; - Chart.prototype.insertPC = function (fid1, label, offset, fid2) { - var key = fid1 + '.' + label + '-' + offset; - this.passive[key] = fid2; - }; - Chart.prototype.shift = function () { - this.actives.push(this.active); - this.active = {}; - this.passive = {}; - this.offset++; - }; - Chart.prototype.expandForest = function (fid) { - var rules = []; - var forest = this.forest; - var go = function (rules0) { - for (var i in rules0) { - var rule = rules0[i]; - switch (rule.id) { - case 'Apply': - rules.push(rule); - break; - case 'Coerce': - go(forest[rule.arg]); - break; - } - } - }; - go(this.forest[fid]); - return rules; - }; - return Chart; -}()); -var ActiveItem = (function () { - function ActiveItem(offset, dot, fun, seq, args, fid, lbl) { - this.offset = offset; - this.dot = dot; - this.fun = fun; - this.seq = seq; - this.args = args; - this.fid = fid; - this.lbl = lbl; - } - ActiveItem.prototype.isEqual = function (obj) { - return (this.offset == obj.offset && - this.dot == obj.dot && - this.fun == obj.fun && - this.seq == obj.seq && - this.args == obj.args && - this.fid == obj.fid && - this.lbl == obj.lbl); - }; - ActiveItem.prototype.shiftOverArg = function (i, fid) { - var nargs = []; - for (var k in this.args) { - nargs[k] = this.args[k]; - } - nargs[i] = new PArg(fid); - return new ActiveItem(this.offset, this.dot + 1, this.fun, this.seq, nargs, this.fid, this.lbl); - }; - ActiveItem.prototype.shiftOverTokn = function () { - return new ActiveItem(this.offset, this.dot + 1, this.fun, this.seq, this.args, this.fid, this.lbl); - }; - return ActiveItem; -}()); -function isUndefined(a) { - return typeof a == 'undefined'; -} -if (!String.prototype.startsWith) { - Object.defineProperty(String.prototype, 'startsWith', { - value: function (search, pos) { - pos = !pos || pos < 0 ? 0 : +pos; - return this.substring(pos, pos + search.length) === search; - } - }); -} -if (!String.prototype.includes) { - Object.defineProperty(String.prototype, 'includes', { - value: function (search, start) { - 'use strict'; - if (typeof start !== 'number') { - start = 0; - } - if (start + search.length > this.length) { - return false; - } - else { - return this.indexOf(search, start) !== -1; - } - } - }); -} -//# sourceMappingURL=gflib.js.map \ No newline at end of file diff --git a/src/runtime/typescript/js/gflib.js.map b/src/runtime/typescript/js/gflib.js.map deleted file mode 100644 index fbc04aca3..000000000 --- a/src/runtime/typescript/js/gflib.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"gflib.js","sourceRoot":"","sources":["../gflib.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/runtime/typescript/tsconfig.json b/src/runtime/typescript/tsconfig.json deleted file mode 100644 index 2b2a77099..000000000 --- a/src/runtime/typescript/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "compilerOptions": { - "module": "none", - "target": "es3", - "strict": true, - "noImplicitAny": true, - "removeComments": true, - "outDir": "js", - "sourceMap": true - }, - "compileOnSave": true -} From 81362ed7b724ee5161b494b29020b9068b2c10c2 Mon Sep 17 00:00:00 2001 From: Thomas Hallgren Date: Mon, 5 Aug 2019 15:25:29 +0200 Subject: [PATCH 08/12] Minibar can now display grammar documentation. The documentation is taken from a file called Grammar.pgf_info, located next to the Grammar.pgf file on the server. The first line of the documentation is displayed below the menu bar in the minibar. The rest of the documentation is displayed when you press the "More info" button (or the "i" button). The documentation can contain HTML markup. Blank lines are treated as paragraph breaks. --- src/www/minibar/about.html | 21 ++++++++++++++++----- src/www/minibar/minibar.css | 1 + src/www/minibar/minibar.js | 35 +++++++++++++++++++++++++++++++++-- 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/src/www/minibar/about.html b/src/www/minibar/about.html index 7c127fe5f..87df72e00 100644 --- a/src/www/minibar/about.html +++ b/src/www/minibar/about.html @@ -10,8 +10,10 @@ +

About Minibar

- +
+
Minibar is an alternative implementation of the GF web app Fridge Poetry. @@ -233,14 +235,23 @@ Some implementation details: category names.
  • [Added 2013-04-02] Minibar now remembers from one visit to the next the selected set of target languages for each grammar. +
  • [Added 2019-08-05] Minibar can now display grammar documentation. + The documentation is taken from a file called + Grammar.pgf_info, located + next to the Grammar.pgf file on the server. + The first line of the documentation is displayed below the menu bar in + the minibar. The rest of the documentation is displayed when you press + the More info button (or the i button). The documentation + can contain HTML markup. Blank lines are treated as paragraph breaks. - +
  • +

    -Last modified: Tue Apr 2 15:49:32 CEST 2013 +Last modified: Mon Aug 5 15:22:46 CEST 2019
    -TH - +Thomas Hallgren
    +
    diff --git a/src/www/minibar/minibar.css b/src/www/minibar/minibar.css index 2e4d646ea..5d77b4508 100644 --- a/src/www/minibar/minibar.css +++ b/src/www/minibar/minibar.css @@ -10,6 +10,7 @@ h1:first-child, h2:first-child { margin-top: 0; margin-bottom: 1ex; } th, td { vertical-align: baseline; text-align: left; } div.menubar { font-family: sans-serif; font-size: small; } +div.infobar { margin: 5px; } div#surface { min-height: 3ex; diff --git a/src/www/minibar/minibar.js b/src/www/minibar/minibar.js index c299cb77c..6822e7926 100644 --- a/src/www/minibar/minibar.js +++ b/src/www/minibar/minibar.js @@ -53,13 +53,14 @@ function Minibar(server,opts) { /* --- Creating user interface elements --------------------------------- */ this.menubar=div_class("menubar"); + this.infobar=div_class("infobar"); this.extra=div_id("extra"); this.minibar=element(this.options.target); this.minibar.innerHTML=""; with(this) { appendChildren(menubar,[input.menus,translations.menus,input.buttons]) - appendChildren(minibar,[menubar,input.main,translations.main,extra]); + appendChildren(minibar,[menubar,infobar,input.main,translations.main,extra]); if(options.help_url) menubar.appendChild(button("Help",bind(open_help,this))); append_extra_buttons(extra,options); @@ -205,6 +206,30 @@ Minibar.prototype.change_grammar=function(grammar_info) { t.grammar=grammar_info; t.input.change_grammar(grammar_info) t.translations.change_grammar(grammar_info) + t.get_pgf_info() +} + +Minibar.prototype.get_pgf_info=function() { + var t=this; + var info_url=t.server.current_grammar_url+"_info"; + clear(t.infobar) + t.pgf_info=null; + ajax_http_get(info_url,bind(t.show_pgf_info,t),function(){}) +} + +Minibar.prototype.show_pgf_info=function(info) { + var t=this; + var cnt=0; + console.log(info) + info=info.split("\n"); + for(var i=0;i1) + t.infobar.appendChild(button("More info",bind(t.show_grammarinfo,t))) } Minibar.prototype.show_grammarinfo=function() { @@ -241,7 +266,10 @@ Minibar.prototype.show_grammarinfo=function() { var cats=wrap("div",text(g.categories.join(", "))) var funs=wrap("div",text(g.functions.join(", "))) - var btn=button("More info",more) + var btn=button("Show more details",more) + + var info=empty("div") + if(t.pgf_info) info.innerHTML=t.pgf_info clear(t.translations.main) var hdr=[text(g.name)] @@ -249,8 +277,11 @@ Minibar.prototype.show_grammarinfo=function() { hdr.push(text(" ")) hdr.push(wrap("small",text("("+g.lastmodified+")"))) } + appendChildren(this.translations.main, [wrap("h3",hdr), + info, + text("The categories and functions in the grammar are listed below."), btn, wrap("h4",text("Start category")), text(g.startcat || ""), wrap("h4",text("Categories")), cats, From 85f12a5544ba8ca6481780cd16775a3506fd56e1 Mon Sep 17 00:00:00 2001 From: "John J. Camilleri" Date: Wed, 7 Aug 2019 12:52:17 +0200 Subject: [PATCH 09/12] Remove wrong Haddock comment in PGF2 Clearly just a copy-paste error --- src/runtime/haskell-bind/PGF2.hsc | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/runtime/haskell-bind/PGF2.hsc b/src/runtime/haskell-bind/PGF2.hsc index fd77dbbf7..a41c915f1 100644 --- a/src/runtime/haskell-bind/PGF2.hsc +++ b/src/runtime/haskell-bind/PGF2.hsc @@ -168,8 +168,6 @@ languages p = concr <- fmap (\ptr -> Concr ptr (touchPGF p)) $ peek (castPtr value) writeIORef ref $! Map.insert name concr langs --- | The abstract language name is the name of the top-level --- abstract module concreteName :: Concr -> ConcName concreteName c = unsafePerformIO (peekUtf8CString =<< pgf_concrete_name (concr c)) From 941b4ddf1f8a5c1fcf90dc2620e78e53db700715 Mon Sep 17 00:00:00 2001 From: Thomas Hallgren Date: Wed, 7 Aug 2019 14:07:47 +0200 Subject: [PATCH 10/12] GF home page: fix some links smoother operation over https --- index.html | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/index.html b/index.html index decea87d6..b053de68b 100644 --- a/index.html +++ b/index.html @@ -29,9 +29,9 @@ @@ -152,9 +152,9 @@ least one, it may help you to get a first idea of what GF is.

    Applications & Availability

    GF can be used for building - translation systems, - multilingual web gadgets, - natural-language interfaces, + translation systems, + multilingual web gadgets, + natural-language interfaces, dialogue systems, and natural language resources.

    @@ -210,7 +210,7 @@ least one, it may help you to get a first idea of what GF is.

    We run the IRC channel #gf on the Freenode network, where you are welcome to look for help with small questions or just start a general discussion. You can open a web chat - or browse the channel logs. + or browse the channel logs.

    If you have a larger question which the community may benefit from, we recommend you ask it on the mailing list. @@ -224,7 +224,7 @@ least one, it may help you to get a first idea of what GF is.

    2018-12-03
    - Sixth GF Summer School in Stellenbosch (South Africa), 3–14 December 2018 + Sixth GF Summer School in Stellenbosch (South Africa), 3–14 December 2018
    2018-12-02
    @@ -248,7 +248,7 @@ least one, it may help you to get a first idea of what GF is. GF is moving to GitHub.
    2017-03-13
    - GF Summer School in Riga (Latvia), 14-25 August 2017 + GF Summer School in Riga (Latvia), 14-25 August 2017
    @@ -268,7 +268,7 @@ least one, it may help you to get a first idea of what GF is.

    • - GF-Alfa: + GF-Alfa: natural language interface to formal proofs
    • @@ -293,11 +293,11 @@ least one, it may help you to get a first idea of what GF is. Functional Morphology
    • - MOLTO: + MOLTO: multilingual online translation
    • - REMU: + REMU: reliable multilingual digital communication
    From 12f2520b3c68ba68d42a52931663a0f5e31a5bca Mon Sep 17 00:00:00 2001 From: Thomas Hallgren Date: Wed, 7 Aug 2019 19:02:27 +0200 Subject: [PATCH 11/12] Download page: add binary package for Raspbian 10 --- download/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/download/index.md b/download/index.md index 78df9d38e..e1d3322c1 100644 --- a/download/index.md +++ b/download/index.md @@ -13,13 +13,13 @@ These binary packages include both the GF core (compiler and runtime) as well as | Platform | Download | Features | How to install | |:----------------|:---------------------------------------------------|:---------------|:-----------------------------------| | macOS | [gf-3.10.pkg](gf-3.10.pkg) | GF, S, C, J, P | Double-click on the package icon | +| Raspbian 10 (buster) | [gf\_3.10-2\_armhf.deb](gf_3.10-2_armhf.deb) | GF,S,C,J,P | `sudo dpkg -i gf_3.10-2_armhf.deb` | | Ubuntu (32-bit) | [gf\_3.10-2\_i386.deb](gf_3.10-2_i386.deb) | GF, S, C, J, P | `sudo dpkg -i gf_3.10-2_i386.deb` | | Ubuntu (64-bit) | [gf\_3.10-2\_amd64.deb](gf_3.10-2_amd64.deb) | GF, S, C, J, P | `sudo dpkg -i gf_3.10-2_amd64.deb` | | Windows | [gf-3.10-bin-windows.zip](gf-3.10-bin-windows.zip) | GF, S | `unzip gf-3.10-bin-windows.zip` | **Features** From b77626b802b2152508ba62e1d36accf85ae30a95 Mon Sep 17 00:00:00 2001 From: Thomas Hallgren Date: Wed, 7 Aug 2019 20:15:28 +0200 Subject: [PATCH 12/12] debian/rules: fix two build problems --- debian/rules | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/rules b/debian/rules index 428801e94..36e6ce706 100755 --- a/debian/rules +++ b/debian/rules @@ -26,8 +26,8 @@ override_dh_auto_build: cd src/runtime/python && EXTRA_INCLUDE_DIRS=$(CURDIR)/src/runtime/c EXTRA_LIB_DIRS=$(CURDIR)/src/runtime/c/.libs python setup.py build cd src/runtime/java && make CFLAGS="-I$(CURDIR)/src/runtime/c -L$(CURDIR)/src/runtime/c/.libs" INSTALL_PATH=/usr/lib echo $(SET_LDL) - $(SET_LDL) cabal build # builds gf, fails to build example grammars - PATH=$(CURDIR)/dist/build/gf:$$PATH && make -C ../gf-rgl build + -$(SET_LDL) cabal build # builds gf, fails to build example grammars + export $(SET_LDL); PATH=$(CURDIR)/dist/build/gf:$$PATH && make -C ../gf-rgl build GF_LIB_PATH=$(CURDIR)/../gf-rgl/dist $(SET_LDL) cabal build # have RGL now, ok to build example grammars make html