diff --git a/doc/gf-history.html b/doc/gf-history.html index d50f42075..f2b02d731 100644 --- a/doc/gf-history.html +++ b/doc/gf-history.html @@ -14,6 +14,17 @@ Changes in functionality since May 17, 2005, release of GF Version 2.2

+5/10 (AR) Printing missing linearization rules: +pm -printer=missing. Command g = grep, +which works in a way similar to Unix grep. + +

+ +5/10 (PL) Printing graphs with function and category dependencies: +pg -printer=functiongraph, pg -printer=typegraph. + +

+ 20/9 (AR) Added optimization by common subexpression elimination. It works on GFC modules and creates oper definitions for subterms that occur more than once in lin definitions. These diff --git a/examples/gfcc/ImperEng.gf b/examples/gfcc/ImperEng.gf index 45049b4bc..6a2a10e7c 100644 --- a/examples/gfcc/ImperEng.gf +++ b/examples/gfcc/ImperEng.gf @@ -1,3 +1,4 @@ +-- # -path=.:prelude --# -path=.:../../lib/prelude -- Toy English phrasing of C programs. Intended use is with diff --git a/examples/stoneage/StoneageEng.gf b/examples/stoneage/StoneageEng.gf index a3942d58e..8adcfe8bc 100644 --- a/examples/stoneage/StoneageEng.gf +++ b/examples/stoneage/StoneageEng.gf @@ -1,4 +1,5 @@ ---# -path=.:../../lib/resource/abstract:../../lib/resource/english:../../lib/prelude +--# -path=.:resource/english:resource/abstract:prelude +-- # -path=.:../../lib/resource/abstract:../../lib/resource/english:../../lib/prelude concrete StoneageEng of Stoneage = open SyntaxEng, ResourceEng, ParadigmsEng, SwadeshLexEng, StoneageResEng in { diff --git a/examples/stoneage/StoneageSwe.gf b/examples/stoneage/StoneageSwe.gf index 190de7c56..3109db12b 100644 --- a/examples/stoneage/StoneageSwe.gf +++ b/examples/stoneage/StoneageSwe.gf @@ -1,3 +1,4 @@ +-- # -path=.:resource/abstract:prelude:resource/swedish:resource/scandinavian --# -path=.:../../lib/resource/abstract:../../lib/prelude:../../lib/resource/swedish:../../lib/resource/scandinavian concrete StoneageSwe of Stoneage = open SyntaxSwe, ResourceSwe, ParadigmsSwe, VerbsSwe, SwadeshLexSwe, StoneageResSwe in { @@ -30,7 +31,7 @@ lin Know = PresVasV2 know_V ; Smell s o = PresCl (SPredV2 s (dirV2 känna_V) (DefOneNP (AdvCN (UseN (mk2N "lukt" "lukter")) - (PrepNP possess_Prep o)))) ; + (AdvPP (PrepNP possess_Prep o))))) ; Fear = PresVasV2 fear_V ; Kill = PresVasV2 kill_V ; Fight s o = PresCl (AdvCl (SPredV s fight_V) (AdvPP (PrepNP with_Prep o))) ; diff --git a/lib/resource/english/LangEng.gf b/lib/resource/english/LangEng.gf index 5c12ef028..9fcb86d92 100644 --- a/lib/resource/english/LangEng.gf +++ b/lib/resource/english/LangEng.gf @@ -1,5 +1,7 @@ --# -path=.:../abstract:../../prelude +-- # -path=.:resource/english:resource/abstract:prelude + concrete LangEng of Lang = RulesEng, ClauseEng, diff --git a/src/GF/Compile/Compile.hs b/src/GF/Compile/Compile.hs index 08b2ff572..0b14cedc1 100644 --- a/src/GF/Compile/Compile.hs +++ b/src/GF/Compile/Compile.hs @@ -5,9 +5,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/09/20 09:32:56 $ +-- > CVS $Date: 2005/10/05 20:02:19 $ -- > CVS $Author: aarne $ --- > CVS $Revision: 1.44 $ +-- > CVS $Revision: 1.45 $ -- -- The top-level compilation chain from source file to gfc\/gfr. ----------------------------------------------------------------------------- @@ -106,7 +106,7 @@ compileModule opts1 st0 file = do ps0 <- ioeIO $ pathListOpts opts fpath let ps1 = if (useFileOpt && not useLineOpt) - then (map (prefixPathName fpath) ps0) + then (ps0 ++ map (prefixPathName fpath) ps0) else ps0 ps <- ioeIO $ extendPathEnv gfLibraryPath gfGrammarPathVar ps1 let ioeIOIf = if oElem beVerbose opts then ioeIO else (const (return ())) diff --git a/src/GF/Shell.hs b/src/GF/Shell.hs index 8ae01017c..6e3b241c0 100644 --- a/src/GF/Shell.hs +++ b/src/GF/Shell.hs @@ -5,9 +5,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/07/01 08:16:32 $ +-- > CVS $Date: 2005/10/05 20:02:19 $ -- > CVS $Author: aarne $ --- > CVS $Revision: 1.42 $ +-- > CVS $Revision: 1.43 $ -- -- GF shell command interpreter. ----------------------------------------------------------------------------- @@ -51,7 +51,7 @@ import GF.Grammar.PrGrammar import Control.Monad (foldM,liftM) import System (system) import System.Random (newStdGen) ---- -import Data.List (nub) +import Data.List (nub,isPrefixOf) import GF.Data.Zipper ---- import GF.Data.Operations @@ -269,6 +269,8 @@ execC co@(comm, opts0) sa@((st,(h,_)),a) = checkOptions st co >> case comm of CSystemCommand s -> justOutput opts (system s >> return ()) sa CPutString -> changeArg (opSS2CommandArg (optStringCommand opts gro)) sa ----- CShowTerm -> changeArg (opTS2CommandArg (optPrintTerm opts gro) . s2t) sa + CGrep ms -> changeArg (AString . unlines . filter (grep ms) . lines . prCommandArg) sa + CSetFlag -> changeState (addGlobalOptions opts0) sa ---- deprec! CSetLocalFlag lang -> changeState (addLocalOptions lang opts0) sa @@ -327,6 +329,11 @@ execC co@(comm, opts0) sa@((st,(h,_)),a) = checkOptions st co >> case comm of then (putStrLn ("Warning: discontinuous category" +++ prt_ c)) else (return ()) + grep ms s = (if oElem beVerbose opts then not else id) $ grepv ms s --- -v + grepv ms s = case s of + _:cs -> isPrefixOf ms s || grepv ms cs + _ -> isPrefixOf ms s + -- commands either change the state or process the argument, but not both -- some commands just do output diff --git a/src/GF/Shell/HelpFile.hs b/src/GF/Shell/HelpFile.hs index 9d32ce0db..187e18740 100644 --- a/src/GF/Shell/HelpFile.hs +++ b/src/GF/Shell/HelpFile.hs @@ -5,9 +5,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/09/20 09:32:56 $ +-- > CVS $Date: 2005/10/05 20:02:19 $ -- > CVS $Author: aarne $ --- > CVS $Revision: 1.13 $ +-- > CVS $Revision: 1.14 $ -- -- Help on shell commands. Generated from HelpFile by 'make help'. -- PLEASE DON'T EDIT THIS FILE. @@ -115,7 +115,6 @@ txtHelpFile = "\n options:" ++ "\n -utf8 apply UTF8 encoding to the tokens in the grammar" ++ "\n -utf8id apply UTF8 encoding to the identifiers in the grammar" ++ - "\n -graph print module dependency graph in 'dot' format" ++ "\n examples:" ++ "\n pm | wf Letter.gfcm -- print the grammar into the file Letter.gfcm" ++ "\n pm -printer=graph | wf D.dot -- then do 'dot -Tps D.dot > D.ps'" ++ @@ -203,6 +202,14 @@ txtHelpFile = "\n examples:" ++ "\n tt -lexer=codelit \"2*(x + 3)\" -- a favourite lexer for program code" ++ "\n" ++ + "\ng, grep: g String1 String2" ++ + "\n Grep the String1 in the String2. String2 is read line by line," ++ + "\n and only those lines that contain String1 are returned." ++ + "\n flags:" ++ + "\n -v return those lines that do not contain String1." ++ + "\n examples:" ++ + "\n pg -printer=cf | grep \"mother\" -- show cf rules with word mother" ++ + "\n" ++ "\ncc, compute_concrete: cc Term" ++ "\n Compute a term by concrete syntax definitions. Uses the topmost" ++ "\n resource module (the last in listing by command po) to resolve " ++ @@ -505,13 +512,16 @@ txtHelpFile = "\n -optimize=all first try parametrize then do values with the rest" ++ "\n -optimize=none no optimization" ++ "\n" ++ - "\n-parser, parsing strategy. The default is chart. If -cfg or -mcfg are selected, only bottomup and topdown are recognized." ++ + "\n-parser, parsing strategy. The default is chart. If -cfg or -mcfg are" ++ + "\n selected, only bottomup and topdown are recognized." ++ "\n -parser=chart bottom-up chart parsing" ++ "\n -parser=bottomup a more up to date bottom-up strategy" ++ "\n -parser=topdown top-down strategy" ++ "\n -parser=old an old bottom-up chart parser" ++ "\n" ++ - "\n-printer, format in which the grammar is printed. The default is gfc." ++ + "\n-printer, format in which the grammar is printed. The default is" ++ + "\n gfc. Those marked with M are (only) available for pm, the rest" ++ + "\n for pg." ++ "\n -printer=gfc GFC grammar" ++ "\n -printer=gf GF grammar" ++ "\n -printer=old old GF grammar" ++ @@ -535,6 +545,15 @@ txtHelpFile = "\n -printer=fa_graphviz a finite automaton with labelled edges" ++ "\n -printer=regular a regular grammar in a simple BNF" ++ "\n -printer=unpar a gfc grammar with parameters eliminated" ++ + "\n -printer=functiongraph abstract syntax functions in 'dot' format" ++ + "\n -printer=typegraph abstract syntax categories in 'dot' format" ++ + "\n -printer=gfcm M gfcm file (default for pm)" ++ + "\n -printer=header M gfcm file with header (for GF embedded in Java)" ++ + "\n -printer=graph M module dependency graph in 'dot' (graphviz) format" ++ + "\n -printer=missing M the missing linearizations of each concrete" ++ + "\n -printer=gfc-prolog M gfc in prolog format (also pg)" ++ + "\n -printer=mcfg-prolog M mcfg in prolog format (also pg)" ++ + "\n -printer=cfg-prolog M cfg in prolog format (also pg)" ++ "\n" ++ "\n-startcat, like -cat, but used in grammars (to avoid clash with keyword cat)" ++ "\n" ++ diff --git a/src/GF/Shell/PShell.hs b/src/GF/Shell/PShell.hs index b555317aa..d01366728 100644 --- a/src/GF/Shell/PShell.hs +++ b/src/GF/Shell/PShell.hs @@ -5,9 +5,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/06/20 16:14:20 $ +-- > CVS $Date: 2005/10/05 20:02:20 $ -- > CVS $Author: aarne $ --- > CVS $Revision: 1.25 $ +-- > CVS $Revision: 1.26 $ -- -- parsing GF shell commands. AR 11\/11\/2001 ----------------------------------------------------------------------------- @@ -133,6 +133,7 @@ pCommand ws = case ws of "st" : s -> aTerm CShowTerm s "!" : s -> aUnit (CSystemCommand (unwords s)) "sc" : s -> aUnit (CSystemCommand (unwords s)) + "g" : f : s -> aString (CGrep (unquote f)) s "sf" : l : [] -> aUnit (CSetLocalFlag (language l)) "sf" : [] -> aUnit CSetFlag diff --git a/src/GF/Shell/ShellCommands.hs b/src/GF/Shell/ShellCommands.hs index 9d6718faf..c2d2b367b 100644 --- a/src/GF/Shell/ShellCommands.hs +++ b/src/GF/Shell/ShellCommands.hs @@ -5,9 +5,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/07/01 08:16:32 $ +-- > CVS $Date: 2005/10/05 20:02:20 $ -- > CVS $Author: aarne $ --- > CVS $Revision: 1.39 $ +-- > CVS $Revision: 1.40 $ -- -- The datatype of shell commands and the list of their options. ----------------------------------------------------------------------------- @@ -64,6 +64,7 @@ data Command = | CPutString | CShowTerm | CSystemCommand String + | CGrep String | CSetFlag | CSetLocalFlag Language @@ -193,6 +194,7 @@ optionsOfCommand co = case co of CShowTerm -> flags "printer" CShowTreeGraph -> opts "c f g o" CSystemCommand _ -> none + CGrep _ -> opts "v" CPrintGrammar -> both "utf8" "printer lang" CPrintMultiGrammar -> both "utf8 utf8id" "printer" diff --git a/src/GF/UseGrammar/Custom.hs b/src/GF/UseGrammar/Custom.hs index f5ed30009..8db581d18 100644 --- a/src/GF/UseGrammar/Custom.hs +++ b/src/GF/UseGrammar/Custom.hs @@ -5,9 +5,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/10/05 11:56:42 $ --- > CVS $Author: peb $ --- > CVS $Revision: 1.76 $ +-- > CVS $Date: 2005/10/05 20:02:20 $ +-- > CVS $Author: aarne $ +-- > CVS $Revision: 1.77 $ -- -- A database for customizable GF shell commands. -- @@ -63,6 +63,7 @@ import GF.Data.Zipper import GF.UseGrammar.Statistics import GF.UseGrammar.Morphology +import GF.UseGrammar.Information import GF.API.GrammarToHaskell -----import GrammarToCanon (showCanon, showCanonOpt) -----import qualified GrammarToGFC as GFC @@ -307,6 +308,7 @@ customMultiGrammarPrinter = ,(strCI "header", const (MC.prCanonMGr . unoptimizeCanon)) ,(strCI "cfgm", prCanonAsCFGM) ,(strCI "graph", visualizeCanonGrammar) + ,(strCI "missing", const missingLinCanonGrammar) -- to prolog format: ,(strCI "gfc-prolog", CnvProlog.prtSMulti) diff --git a/src/GF/UseGrammar/Information.hs b/src/GF/UseGrammar/Information.hs index 446173aa2..094eb698c 100644 --- a/src/GF/UseGrammar/Information.hs +++ b/src/GF/UseGrammar/Information.hs @@ -5,16 +5,19 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/05/30 18:39:45 $ +-- > CVS $Date: 2005/10/05 20:02:20 $ -- > CVS $Author: aarne $ --- > CVS $Revision: 1.6 $ +-- > CVS $Revision: 1.7 $ -- -- information on module, category, function, operation, parameter,... -- AR 16\/9\/2003. -- uses source grammar ----------------------------------------------------------------------------- -module GF.UseGrammar.Information (showInformation) where +module GF.UseGrammar.Information ( + showInformation, + missingLinCanonGrammar + ) where import GF.Grammar.Grammar import GF.Infra.Ident @@ -25,6 +28,7 @@ import GF.CF.PPrCF import GF.Compile.ShellState import GF.Grammar.PrGrammar import GF.Grammar.Lookup +import GF.Grammar.Macros (zIdent) import qualified GF.Canon.GFC as GFC import qualified GF.Canon.AbsGFC as AbsGFC @@ -141,3 +145,11 @@ ownConstants = map fst . filter isOwn . tree2list where AnyInd _ _ -> False _ -> True +missingLinCanonGrammar :: GFC.CanonGrammar -> String +missingLinCanonGrammar cgr = + unlines $ concat [prt_ c : missing js | (c,js) <- concretes] where + missing js = map ((" " ++) . prt_) $ filter (not . flip isInBinTree js) abstract + abstract = err (const []) (map fst . tree2list . jments) $ lookupModMod cgr absId + absId = maybe (zIdent "") id $ greatestAbstract cgr + concretes = [(cnc,jments mo) | + cnc <- allConcretes cgr absId, Ok mo <- [lookupModMod cgr cnc]] diff --git a/src/HelpFile b/src/HelpFile index 25ba3659d..fb7d3cefd 100644 --- a/src/HelpFile +++ b/src/HelpFile @@ -86,7 +86,6 @@ pm, print_multigrammar: pm options: -utf8 apply UTF8 encoding to the tokens in the grammar -utf8id apply UTF8 encoding to the identifiers in the grammar - -graph print module dependency graph in 'dot' format examples: pm | wf Letter.gfcm -- print the grammar into the file Letter.gfcm pm -printer=graph | wf D.dot -- then do 'dot -Tps D.dot > D.ps' @@ -174,6 +173,14 @@ tt, test_tokenizer: tt String examples: tt -lexer=codelit "2*(x + 3)" -- a favourite lexer for program code +g, grep: g String1 String2 + Grep the String1 in the String2. String2 is read line by line, + and only those lines that contain String1 are returned. + flags: + -v return those lines that do not contain String1. + examples: + pg -printer=cf | grep "mother" -- show cf rules with word mother + cc, compute_concrete: cc Term Compute a term by concrete syntax definitions. Uses the topmost resource module (the last in listing by command po) to resolve @@ -476,13 +483,16 @@ q, quit: q -optimize=all first try parametrize then do values with the rest -optimize=none no optimization --parser, parsing strategy. The default is chart. If -cfg or -mcfg are selected, only bottomup and topdown are recognized. +-parser, parsing strategy. The default is chart. If -cfg or -mcfg are + selected, only bottomup and topdown are recognized. -parser=chart bottom-up chart parsing -parser=bottomup a more up to date bottom-up strategy -parser=topdown top-down strategy -parser=old an old bottom-up chart parser --printer, format in which the grammar is printed. The default is gfc. +-printer, format in which the grammar is printed. The default is + gfc. Those marked with M are (only) available for pm, the rest + for pg. -printer=gfc GFC grammar -printer=gf GF grammar -printer=old old GF grammar @@ -506,6 +516,15 @@ q, quit: q -printer=fa_graphviz a finite automaton with labelled edges -printer=regular a regular grammar in a simple BNF -printer=unpar a gfc grammar with parameters eliminated + -printer=functiongraph abstract syntax functions in 'dot' format + -printer=typegraph abstract syntax categories in 'dot' format + -printer=gfcm M gfcm file (default for pm) + -printer=header M gfcm file with header (for GF embedded in Java) + -printer=graph M module dependency graph in 'dot' (graphviz) format + -printer=missing M the missing linearizations of each concrete + -printer=gfc-prolog M gfc in prolog format (also pg) + -printer=mcfg-prolog M mcfg in prolog format (also pg) + -printer=cfg-prolog M cfg in prolog format (also pg) -startcat, like -cat, but used in grammars (to avoid clash with keyword cat)