summaryrefslogtreecommitdiff
path: root/src-3.0/GF
diff options
context:
space:
mode:
authoraarne <aarne@cs.chalmers.se>2008-06-25 16:54:35 +0000
committeraarne <aarne@cs.chalmers.se>2008-06-25 16:54:35 +0000
commite9e80fc389365e24d4300d7d5390c7d833a96c50 (patch)
treef0b58473adaa670bd8fc52ada419d8cad470ee03 /src-3.0/GF
parentb96b36f43de3e2f8b58d5f539daa6f6d47f25870 (diff)
changed names of resource-1.3; added a note on homepage on release
Diffstat (limited to 'src-3.0/GF')
-rw-r--r--src-3.0/GF/Command/Abstract.hs67
-rw-r--r--src-3.0/GF/Command/Commands.hs603
-rw-r--r--src-3.0/GF/Command/Importing.hs37
-rw-r--r--src-3.0/GF/Command/Interpreter.hs121
-rw-r--r--src-3.0/GF/Command/Parse.hs48
-rw-r--r--src-3.0/GF/Compile.hs226
-rw-r--r--src-3.0/GF/Compile/BackOpt.hs105
-rw-r--r--src-3.0/GF/Compile/CheckGrammar.hs1105
-rw-r--r--src-3.0/GF/Compile/Compute.hs429
-rw-r--r--src-3.0/GF/Compile/Export.hs61
-rw-r--r--src-3.0/GF/Compile/Extend.hs138
-rw-r--r--src-3.0/GF/Compile/GFCCtoHaskell.hs213
-rw-r--r--src-3.0/GF/Compile/GFCCtoJS.hs117
-rw-r--r--src-3.0/GF/Compile/GenerateFCFG.hs526
-rw-r--r--src-3.0/GF/Compile/GeneratePMCFG.hs356
-rw-r--r--src-3.0/GF/Compile/GetGrammar.hs55
-rw-r--r--src-3.0/GF/Compile/GrammarToGFCC.hs561
-rw-r--r--src-3.0/GF/Compile/ModDeps.hs153
-rw-r--r--src-3.0/GF/Compile/Optimize.hs235
-rw-r--r--src-3.0/GF/Compile/OptimizeGF.hs277
-rw-r--r--src-3.0/GF/Compile/OptimizeGFCC.hs124
-rw-r--r--src-3.0/GF/Compile/ReadFiles.hs195
-rw-r--r--src-3.0/GF/Compile/Rebuild.hs104
-rw-r--r--src-3.0/GF/Compile/Refresh.hs133
-rw-r--r--src-3.0/GF/Compile/RemoveLiT.hs64
-rw-r--r--src-3.0/GF/Compile/Rename.hs338
-rw-r--r--src-3.0/GF/Compile/TC.hs292
-rw-r--r--src-3.0/GF/Compile/TypeCheck.hs118
-rw-r--r--src-3.0/GF/Compile/Update.hs135
-rw-r--r--src-3.0/GF/Data/Assoc.hs143
-rw-r--r--src-3.0/GF/Data/BacktrackM.hs93
-rw-r--r--src-3.0/GF/Data/ErrM.hs38
-rw-r--r--src-3.0/GF/Data/MultiMap.hs47
-rw-r--r--src-3.0/GF/Data/Operations.hs676
-rw-r--r--src-3.0/GF/Data/SortedList.hs127
-rw-r--r--src-3.0/GF/Data/Str.hs134
-rw-r--r--src-3.0/GF/Data/Utilities.hs190
-rw-r--r--src-3.0/GF/Data/XML.hs53
-rw-r--r--src-3.0/GF/Data/Zipper.hs257
-rw-r--r--src-3.0/GF/Devel/README-testgf349
-rw-r--r--src-3.0/GF/Devel/gf-code.txt66
-rw-r--r--src-3.0/GF/Devel/gf3.txt84
-rw-r--r--src-3.0/GF/Grammar/API.hs75
-rw-r--r--src-3.0/GF/Grammar/Abstract.hs38
-rw-r--r--src-3.0/GF/Grammar/AppPredefined.hs158
-rw-r--r--src-3.0/GF/Grammar/Grammar.hs264
-rw-r--r--src-3.0/GF/Grammar/Lockfield.hs51
-rw-r--r--src-3.0/GF/Grammar/LookAbs.hs53
-rw-r--r--src-3.0/GF/Grammar/Lookup.hs269
-rw-r--r--src-3.0/GF/Grammar/MMacros.hs339
-rw-r--r--src-3.0/GF/Grammar/Macros.hs733
-rw-r--r--src-3.0/GF/Grammar/PatternMatch.hs155
-rw-r--r--src-3.0/GF/Grammar/PrGrammar.hs279
-rw-r--r--src-3.0/GF/Grammar/Predef.hs177
-rw-r--r--src-3.0/GF/Grammar/ReservedWords.hs44
-rw-r--r--src-3.0/GF/Grammar/Unify.hs96
-rw-r--r--src-3.0/GF/Grammar/Values.hs91
-rw-r--r--src-3.0/GF/Infra/CheckM.hs89
-rw-r--r--src-3.0/GF/Infra/CompactPrint.hs22
-rw-r--r--src-3.0/GF/Infra/GetOpt.hs381
-rw-r--r--src-3.0/GF/Infra/Ident.hs152
-rw-r--r--src-3.0/GF/Infra/Modules.hs429
-rw-r--r--src-3.0/GF/Infra/Option.hs549
-rw-r--r--src-3.0/GF/Infra/PrintClass.hs51
-rw-r--r--src-3.0/GF/Infra/UseIO.hs277
-rw-r--r--src-3.0/GF/JavaScript/AbsJS.hs60
-rw-r--r--src-3.0/GF/JavaScript/JS.cf55
-rw-r--r--src-3.0/GF/JavaScript/LexJS.x132
-rw-r--r--src-3.0/GF/JavaScript/Makefile14
-rw-r--r--src-3.0/GF/JavaScript/ParJS.y225
-rw-r--r--src-3.0/GF/JavaScript/PrintJS.hs169
-rw-r--r--src-3.0/GF/Source/AbsGF.hs307
-rw-r--r--src-3.0/GF/Source/ErrM.hs26
-rw-r--r--src-3.0/GF/Source/GF.cf371
-rw-r--r--src-3.0/GF/Source/GrammarToSource.hs257
-rw-r--r--src-3.0/GF/Source/LexGF.hs350
-rw-r--r--src-3.0/GF/Source/LexGF.x144
-rw-r--r--src-3.0/GF/Source/ParGF.hs7843
-rw-r--r--src-3.0/GF/Source/ParGF.y642
-rw-r--r--src-3.0/GF/Source/PrintGF.hs534
-rw-r--r--src-3.0/GF/Source/SharedString.hs20
-rw-r--r--src-3.0/GF/Source/SourceToGrammar.hs765
-rw-r--r--src-3.0/GF/Speech/CFG.hs344
-rw-r--r--src-3.0/GF/Speech/CFGToFA.hs244
-rw-r--r--src-3.0/GF/Speech/FiniteState.hs329
-rw-r--r--src-3.0/GF/Speech/GSL.hs94
-rw-r--r--src-3.0/GF/Speech/Graph.hs178
-rw-r--r--src-3.0/GF/Speech/Graphviz.hs116
-rw-r--r--src-3.0/GF/Speech/JSGF.hs111
-rw-r--r--src-3.0/GF/Speech/PGFToCFG.hs84
-rw-r--r--src-3.0/GF/Speech/PrRegExp.hs27
-rw-r--r--src-3.0/GF/Speech/RegExp.hs143
-rw-r--r--src-3.0/GF/Speech/Relation.hs130
-rw-r--r--src-3.0/GF/Speech/SISR.hs75
-rw-r--r--src-3.0/GF/Speech/SLF.hs178
-rw-r--r--src-3.0/GF/Speech/SRG.hs175
-rw-r--r--src-3.0/GF/Speech/SRGS_XML.hs104
-rw-r--r--src-3.0/GF/Speech/VoiceXML.hs247
-rw-r--r--src-3.0/GF/System/NoReadline.hs33
-rw-r--r--src-3.0/GF/System/NoSignal.hs29
-rw-r--r--src-3.0/GF/System/Readline.hs27
-rw-r--r--src-3.0/GF/System/Signal.hs27
-rw-r--r--src-3.0/GF/System/UseReadline.hs36
-rw-r--r--src-3.0/GF/System/UseSignal.hs72
-rw-r--r--src-3.0/GF/Text/Lexing.hs115
-rw-r--r--src-3.0/GF/Text/Transliterations.hs97
-rw-r--r--src-3.0/GF/Text/UTF8.hs48
107 files changed, 0 insertions, 28642 deletions
diff --git a/src-3.0/GF/Command/Abstract.hs b/src-3.0/GF/Command/Abstract.hs
deleted file mode 100644
index 29111b432..000000000
--- a/src-3.0/GF/Command/Abstract.hs
+++ /dev/null
@@ -1,67 +0,0 @@
-module GF.Command.Abstract where
-
-import PGF.Data
-
-type Ident = String
-
-type CommandLine = [Pipe]
-
-type Pipe = [Command]
-
-data Command
- = Command Ident [Option] Argument
- deriving (Eq,Ord,Show)
-
-data Option
- = OOpt Ident
- | OFlag Ident Value
- deriving (Eq,Ord,Show)
-
-data Value
- = VId Ident
- | VInt Integer
- | VStr String
- deriving (Eq,Ord,Show)
-
-data Argument
- = ATree Tree
- | ANoArg
- | AMacro Ident
- deriving (Eq,Ord,Show)
-
-valIdOpts :: String -> String -> [Option] -> String
-valIdOpts flag def opts = case valOpts flag (VId def) opts of
- VId v -> v
- _ -> def
-
-valIntOpts :: String -> Integer -> [Option] -> Int
-valIntOpts flag def opts = fromInteger $ case valOpts flag (VInt def) opts of
- VInt v -> v
- _ -> def
-
-valStrOpts :: String -> String -> [Option] -> String
-valStrOpts flag def opts = case valOpts flag (VStr def) opts of
- VStr v -> v
- _ -> def
-
-valOpts :: String -> Value -> [Option] -> Value
-valOpts flag def opts = case lookup flag flags of
- Just v -> v
- _ -> def
- where
- flags = [(f,v) | OFlag f v <- opts]
-
-isOpt :: String -> [Option] -> Bool
-isOpt o opts = elem o [x | OOpt x <- opts]
-
-isFlag :: String -> [Option] -> Bool
-isFlag o opts = elem o [x | OFlag x _ <- opts]
-
-prOpt :: Option -> String
-prOpt o = case o of
- OOpt i -> i
- OFlag f x -> f ++ "=" ++ show x
-
-mkOpt :: String -> Option
-mkOpt = OOpt
-
diff --git a/src-3.0/GF/Command/Commands.hs b/src-3.0/GF/Command/Commands.hs
deleted file mode 100644
index 96e7c57f4..000000000
--- a/src-3.0/GF/Command/Commands.hs
+++ /dev/null
@@ -1,603 +0,0 @@
-module GF.Command.Commands (
- allCommands,
- lookCommand,
- exec,
- isOpt,
- options,
- flags,
- CommandInfo,
- CommandOutput
- ) where
-
-import PGF
-import PGF.CId
-import PGF.ShowLinearize
-import PGF.Macros
-import PGF.Data ----
-import PGF.Morphology
-import PGF.Quiz
-import PGF.VisualizeTree
-import GF.Compile.Export
-import GF.Infra.Option (noOptions)
-import GF.Infra.UseIO
-import GF.Data.ErrM ----
-import PGF.Expr (readTree)
-import GF.Command.Abstract
-import GF.Text.Lexing
-import GF.Text.Transliterations
-
-import GF.Data.Operations
-
-import Data.Maybe
-import qualified Data.Map as Map
-import System.Cmd
-
-import Debug.Trace
-
-type CommandOutput = ([Tree],String) ---- errors, etc
-
-data CommandInfo = CommandInfo {
- exec :: [Option] -> [Tree] -> IO CommandOutput,
- synopsis :: String,
- syntax :: String,
- explanation :: String,
- longname :: String,
- options :: [(String,String)],
- flags :: [(String,String)],
- examples :: [String]
- }
-
-emptyCommandInfo :: CommandInfo
-emptyCommandInfo = CommandInfo {
- exec = \_ ts -> return (ts,[]), ----
- synopsis = "",
- syntax = "",
- explanation = "",
- longname = "",
- options = [],
- flags = [],
- examples = []
- }
-
-lookCommand :: String -> Map.Map String CommandInfo -> Maybe CommandInfo
-lookCommand = Map.lookup
-
-commandHelpAll :: PGF -> [Option] -> String
-commandHelpAll pgf opts = unlines
- [commandHelp (isOpt "full" opts) (co,info)
- | (co,info) <- Map.assocs (allCommands pgf)]
-
-commandHelp :: Bool -> (String,CommandInfo) -> String
-commandHelp full (co,info) = unlines $ [
- co ++ ", " ++ longname info,
- synopsis info] ++ if full then [
- "",
- "syntax:" ++++ " " ++ syntax info,
- "",
- explanation info,
- "options:" ++++ unlines [" -" ++ o ++ "\t" ++ e | (o,e) <- options info],
- "flags:" ++++ unlines [" -" ++ o ++ "\t" ++ e | (o,e) <- flags info],
- "examples:" ++++ unlines [" " ++ s | s <- examples info]
- ] else []
-
--- this list must no more be kept sorted by the command name
-allCommands :: PGF -> Map.Map String CommandInfo
-allCommands pgf = Map.fromList [
- ("cc", emptyCommandInfo {
- longname = "compute_concrete",
- syntax = "cc (-all | -table | -unqual)? TERM",
- synopsis = "computes concrete syntax term using a source grammar",
- explanation = unlines [
- "Compute TERM by concrete syntax definitions. Uses the topmost",
- "module (the last one imported) to resolve constant names.",
- "N.B.1 You need the flag -retain when importing the grammar, if you want",
- "the definitions to be retained after compilation.",
- "N.B.2 The resulting term is not a tree in the sense of abstract syntax",
- "and hence not a valid input to a Tree-expecting command.",
- "This command must be a line of its own, and thus cannot be a part",
- "of a pipe."
- ],
- options = [
- ("all","pick all strings (forms and variants) from records and tables"),
- ("table","show all strings labelled by parameters"),
- ("unqual","hide qualifying module names")
- ]
- }),
- ("dc", emptyCommandInfo {
- longname = "define_command",
- syntax = "dc IDENT COMMANDLINE",
- synopsis = "define a command macro",
- explanation = unlines [
- "Defines IDENT as macro for COMMANDLINE, until IDENT gets redefined.",
- "A call of the command has the form %IDENT. The command may take an",
- "argument, which in COMMANDLINE is marked as ?0. Both strings and",
- "trees can be arguments. Currently at most one argument is possible.",
- "This command must be a line of its own, and thus cannot be a part",
- "of a pipe."
- ]
- }),
- ("dt", emptyCommandInfo {
- longname = "define_tree",
- syntax = "dt IDENT (TREE | STRING | \"<\" COMMANDLINE)",
- synopsis = "define a tree or string macro",
- explanation = unlines [
- "Defines IDENT as macro for TREE or STRING, until IDENT gets redefined.",
- "The defining value can also come from a command, preceded by \"<\".",
- "If the command gives many values, the first one is selected.",
- "A use of the macro has the form %IDENT. Currently this use cannot be",
- "a subtree of another tree. This command must be a line of its own",
- "and thus cannot be a part of a pipe."
- ],
- examples = [
- ("dt ex \"hello world\" -- define ex as string"),
- ("dt ex UseN man_N -- define ex as string"),
- ("dt ex < p -cat=NP \"the man in the car\" -- define ex as parse result"),
- ("l -lang=LangSwe %ex | ps -to_utf8 -- linearize the tree ex")
- ]
- }),
- ("e", emptyCommandInfo {
- longname = "empty",
- synopsis = "empty the environment"
- }),
- ("gr", emptyCommandInfo {
- longname = "generate_random",
- synopsis = "generate random trees in the current abstract syntax",
- syntax = "gr [-cat=CAT] [-number=INT]",
- examples = [
- "gr -- one tree in the startcat of the current grammar",
- "gr -cat=NP -number=16 -- 16 trees in the category NP"
- ],
- explanation = unlines [
- "Generates a list of random trees, by default one tree."
----- "If a tree argument is given, the command completes the Tree with values to",
----- "the metavariables in the tree."
- ],
- flags = [
- ("cat","generation category"),
- ("lang","excludes functions that have no linearization in this language"),
- ("number","number of trees generated")
- ],
- exec = \opts _ -> do
- let pgfr = optRestricted opts
- ts <- generateRandom pgfr (optCat opts)
- return $ fromTrees $ take (optNum opts) ts
- }),
- ("gt", emptyCommandInfo {
- longname = "generate_trees",
- synopsis = "generates a list of trees, by default exhaustive",
- explanation = unlines [
- "Generates all trees of a given category, with increasing depth.",
- "By default, the depth is 4, but this can be changed by a flag."
- ---- "If a Tree argument is given, the command completes the Tree with values",
- ---- "to the metavariables in the tree."
- ],
- flags = [
- ("cat","the generation category"),
- ("depth","the maximum generation depth"),
- ("lang","excludes functions that have no linearization in this language"),
- ("number","the number of trees generated")
- ],
- exec = \opts _ -> do
- let pgfr = optRestricted opts
- let dp = return $ valIntOpts "depth" 4 opts
- let ts = generateAllDepth pgfr (optCat opts) dp
- return $ fromTrees $ take (optNumInf opts) ts
- }),
- ("h", emptyCommandInfo {
- longname = "help",
- syntax = "h (-full)? COMMAND?",
- synopsis = "get description of a command, or a the full list of commands",
- explanation = unlines [
- "Displays information concerning the COMMAND.",
- "Without argument, shows the synopsis of all commands."
- ],
- options = [
- ("full","give full information of the commands")
- ],
- exec = \opts ts -> return ([], case ts of
- [t] -> let co = showTree t in
- case lookCommand co (allCommands pgf) of ---- new map ??!!
- Just info -> commandHelp True (co,info)
- _ -> "command not found"
- _ -> commandHelpAll pgf opts)
- }),
- ("i", emptyCommandInfo {
- longname = "import",
- synopsis = "import a grammar from source code or compiled .pgf file",
- explanation = unlines [
- "Reads a grammar from File and compiles it into a GF runtime grammar.",
- "If a grammar with the same concrete name is already in the state",
- "it is overwritten - but only if compilation succeeds.",
- "The grammar parser depends on the file name suffix:",
- " .gf normal GF source",
- " .gfo compiled GF source",
- " .pgf precompiled grammar in Portable Grammar Format"
- ],
- options = [
- -- ["prob", "retain", "gfo", "src", "no-cpu", "cpu", "quiet", "verbose"]
- ("retain","retain operations (used for cc command)"),
- ("src", "force compilation from source"),
- ("v", "be verbose - show intermediate status information")
- ]
- }),
- ("l", emptyCommandInfo {
- longname = "linearize",
- synopsis = "convert an abstract syntax expression to string",
- explanation = unlines [
- "Shows the linearization of a Tree by the grammars in scope.",
- "The -lang flag can be used to restrict this to fewer languages.",
- "A sequence of string operations (see command ps) can be given",
- "as options, and works then like a pipe to the ps command, except",
- "that it only affect the strings, not e.g. the table labels.",
- "These can be given separately to each language with the unlexer flag",
- "whose results are prepended to the other lexer flags. The value of the",
- "unlexer flag is a space-separated list of comma-separated string operation",
- "sequences; see example."
- ],
- examples = [
- "l -langs=LangSwe,LangNor no_Utt -- linearize tree to LangSwe and LangNor",
- "gr -lang=LangHin -cat=Cl | l -table -to_devanagari -to_utf8 -- hindi table",
- "l -unlexer=\"LangSwe=to_utf8 LangHin=to_devanagari,to_utf8\" -- different lexers"
- ],
- exec = \opts -> return . fromStrings . map (optLin opts),
- options = [
- ("all","show all forms and variants"),
- ("record","show source-code-like record"),
- ("table","show all forms labelled by parameters"),
- ("term", "show PGF term"),
- ("treebank","show the tree and tag linearizations with language names")
- ] ++ stringOpOptions,
- flags = [
- ("lang","the languages of linearization (comma-separated, no spaces)"),
- ("unlexer","set unlexers separately to each language (space-separated)")
- ]
- }),
- ("ma", emptyCommandInfo {
- longname = "morpho_analyse",
- synopsis = "print the morphological analyses of all words in the string",
- explanation = unlines [
- "Prints all the analyses of space-separated words in the input string,",
- "using the morphological analyser of the actual grammar (see command pf)"
- ],
- exec = \opts ->
- return . fromString . unlines .
- map prMorphoAnalysis . concatMap (morphos opts) .
- concatMap words . toStrings
- }),
-
- ("mq", emptyCommandInfo {
- longname = "morpho_quiz",
- synopsis = "start a morphology quiz",
- exec = \opts _ -> do
- let lang = optLang opts
- let cat = optCat opts
- morphologyQuiz pgf lang cat
- return void,
- flags = [
- ("lang","language of the quiz"),
- ("cat","category of the quiz"),
- ("number","maximum number of questions")
- ]
- }),
-
- ("p", emptyCommandInfo {
- longname = "parse",
- synopsis = "parse a string to abstract syntax expression",
- explanation = unlines [
- "Shows all trees returned by parsing a string in the grammars in scope.",
- "The -lang flag can be used to restrict this to fewer languages.",
- "The default start category can be overridden by the -cat flag.",
- "See also the ps command for lexing and character encoding."
- ],
- exec = \opts -> return . fromTrees . concatMap (par opts) . toStrings,
- flags = [
- ("cat","target category of parsing"),
- ("lang","the languages of parsing (comma-separated, no spaces)")
- ]
- }),
- ("pg", emptyCommandInfo { -----
- longname = "print_grammar",
- synopsis = "print the actual grammar with the given printer",
- explanation = unlines [
- "Prints the actual grammar, with all involved languages.",
- "In some printers, this can be restricted to a subset of languages",
- "with the -lang=X,Y flag (comma-separated, no spaces).",
- "The -printer=P flag sets the format in which the grammar is printed.",
- "N.B.1 Since grammars are compiled when imported, this command",
- "generally shows a grammar that looks rather different from the source.",
- "N.B.2 This command is slightly obsolete: to produce different formats",
- "the batch compiler gfc is recommended, and has many more options."
- ],
- exec = \opts _ -> return $ fromString $ prGrammar opts,
- flags = [
- --"cat",
- ("lang", "select languages for the some options (default all languages)"),
- ("printer","select the printing format (see gfc --help)")
- ],
- options = [
- ("cats", "show just the names of abstract syntax categories"),
- ("fullform", "print the fullform lexicon"),
- ("missing","show just the names of functions that have no linearization")
- ]
- }),
- ("ph", emptyCommandInfo {
- longname = "print_history",
- synopsis = "print command history",
- explanation = unlines [
- "Prints the commands issued during the GF session.",
- "The result is readable by the eh command.",
- "The result can be used as a script when starting GF."
- ],
- examples = [
- "ph | wf -file=foo.gfs -- save the history into a file"
- ]
- }),
- ("ps", emptyCommandInfo {
- longname = "put_string",
- syntax = "ps OPT? STRING",
- synopsis = "return a string, possibly processed with a function",
- explanation = unlines [
- "Returns a string obtained from its argument string by applying",
- "string processing functions in the order given in the command line",
- "option list. Thus 'ps -f -g s' returns g (f s). Typical string processors",
- "are lexers and unlexers, but also character encoding conversions are possible.",
- "The unlexers preserve the division of their input to lines.",
- "To see transliteration tables, use command ut."
- ],
- examples = [
- "l (EAdd 3 4) | ps -code -- linearize code-like output",
- "ps -lexer=code | p -cat=Exp -- parse code-like input",
- "gr -cat=QCl | l | ps -bind -to_utf8 -- linearization output from LangFin",
- "ps -from_utf8 \"jag ?r h?r\" | p -- parser in LangSwe in UTF8 terminal",
- "ps -to_devanagari -to_utf8 \"A-p\" -- show Devanagari in UTF8 terminal"
- ],
- exec = \opts -> return . fromString . stringOps (map prOpt opts) . toString,
- options = stringOpOptions
- }),
- ("q", emptyCommandInfo {
- longname = "quit",
- synopsis = "exit GF interpreter"
- }),
- ("rf", emptyCommandInfo {
- longname = "read_file",
- synopsis = "read string or tree input from a file",
- explanation = unlines [
- "Reads input from file. The filename must be in double quotes.",
- "The input is interpreted as a string by default, and can hence be",
- "piped e.g. to the parse command. The option -tree interprets the",
- "input as a tree, which can be given e.g. to the linearize command.",
- "The option -lines will result in a list of strings or trees, one by line."
- ],
- options = [
- ("lines","return the list of lines, instead of the singleton of all contents"),
- ("tree","convert strings into trees")
- ],
- exec = \opts arg -> do
- let file = valIdOpts "file" "_gftmp" opts
- s <- readFile file
- return $ case opts of
- _ | isOpt "lines" opts && isOpt "tree" opts ->
- fromTrees [t | l <- lines s, Just t <- [readTree l]]
- _ | isOpt "tree" opts ->
- fromTrees [t | Just t <- [readTree s]]
- _ | isOpt "lines" opts -> fromStrings $ lines s
- _ -> fromString s,
- flags = [("file","the input file name")]
- }),
- ("tq", emptyCommandInfo {
- longname = "translation_quiz",
- synopsis = "start a translation quiz",
- exec = \opts _ -> do
- let from = valIdOpts "from" (optLang opts) opts
- let to = valIdOpts "to" (optLang opts) opts
- let cat = optCat opts
- translationQuiz pgf from to cat
- return void,
- flags = [
- ("from","translate from this language"),
- ("to","translate to this language"),
- ("cat","translate in this category"),
- ("number","the maximum number of questions")
- ]
- }),
- ("sp", emptyCommandInfo {
- longname = "system_pipe",
- synopsis = "send argument to a system command",
- syntax = "sp -command=\"SYSTEMCOMMAND\" STRING",
- exec = \opts arg -> do
- let tmpi = "_tmpi" ---
- let tmpo = "_tmpo"
- writeFile tmpi $ toString arg
- let syst = optComm opts ++ " " ++ tmpi
- system $ syst ++ " <" ++ tmpi ++ " >" ++ tmpo
- s <- readFile tmpo
- return $ fromString s,
- flags = [
- ("command","the system command applied to the argument")
- ],
- examples = [
- "ps -command=\"wc\" \"foo\"",
- "gt | l | sp -command=\"grep \\\"who\\\"\" | sp -command=\"wc\""
- ]
- }),
- ("ut", emptyCommandInfo {
- longname = "unicode_table",
- synopsis = "show a transliteration table for a unicode character set",
- exec = \opts arg -> do
- let t = concatMap prOpt (take 1 opts)
- let out = maybe "no such transliteration" characterTable $ transliteration t
- return $ fromString out,
- options = [
- ("devanagari","Devanagari"),
- ("thai", "Thai")
- ]
- }),
- ("vt", emptyCommandInfo {
- longname = "visualize_tree",
- synopsis = "show a set of trees graphically",
- explanation = unlines [
- "Prints a set of trees in the .dot format (the graphviz format).",
- "The graph can be saved in a file by the wf command as usual.",
- "If the -view flag is defined, the graph is saved in a temporary file",
- "which is processed by graphviz and displayed by the program indicated",
- "by the flag. The target format is postscript, unless overridden by the",
- "flag -format."
- ],
- exec = \opts ts -> do
- let funs = not (isOpt "nofun" opts)
- let cats = not (isOpt "nocat" opts)
- let grph = visualizeTrees pgf (funs,cats) ts -- True=digraph
- if isFlag "view" opts || isFlag "format" opts then do
- let file s = "_grph." ++ s
- let view = optViewGraph opts ++ " "
- let format = optViewFormat opts
- writeFile (file "dot") grph
- system $ "dot -T" ++ format ++ " " ++ file "dot" ++ " > " ++ file format ++
- " ; " ++ view ++ file format
- return void
- else return $ fromString grph,
- examples = [
- "p \"hello\" | vt -- parse a string and show trees as graph script",
- "p \"hello\" | vt -view=\"open\" -- parse a string and display trees on a Mac"
- ],
- options = [
- ("nofun","don't show functions but only categories"),
- ("nocat","don't show categories but only functions")
- ],
- flags = [
- ("format","format of the visualization file (default \"ps\")"),
- ("view","program to open the resulting file (default \"gv\")")
- ]
- }),
- ("wf", emptyCommandInfo {
- longname = "write_file",
- synopsis = "send string or tree to a file",
- exec = \opts arg -> do
- let file = valIdOpts "file" "_gftmp" opts
- if isOpt "append" opts
- then appendFile file (toString arg)
- else writeFile file (toString arg)
- return void,
- options = [
- ("append","append to file, instead of overwriting it")
- ],
- flags = [("file","the output filename")]
- })
- ]
- where
- lin opts t = unlines [linearize pgf lang t | lang <- optLangs opts]
- par opts s = concat [parse pgf lang (optCat opts) s | lang <- optLangs opts]
-
- void = ([],[])
-
- optLin opts t = case opts of
- _ | isOpt "treebank" opts -> treebank opts t
- _ -> unlines [linear opts lang t | lang <- optLangs opts]
-
- linear opts lang = let unl = unlex opts lang in case opts of
- _ | isOpt "all" opts -> allLinearize unl pgf (mkCId lang)
- _ | isOpt "table" opts -> tableLinearize unl pgf (mkCId lang)
- _ | isOpt "term" opts -> termLinearize pgf (mkCId lang)
- _ | isOpt "record" opts -> recordLinearize pgf (mkCId lang)
- _ -> unl . linearize pgf lang
-
- treebank opts t = unlines $
- (abstractName pgf ++ ": " ++ showTree t) :
- [lang ++ ": " ++ linear opts lang t | lang <- optLangs opts]
-
- unlex opts lang = stringOps (getUnlex opts lang ++ map prOpt opts)
-
- getUnlex opts lang = case words (valStrOpts "unlexer" "" opts) of
- lexs -> case lookup lang
- [(la,tail le) | lex <- lexs, let (la,le) = span (/='=') lex, not (null le)] of
- Just le -> chunks ',' le
- _ -> []
-
--- Proposed logic of coding in unlexing:
--- - If lang has no coding flag, or -to_utf8 is not in opts, just opts are used.
--- - If lang has flag coding=utf8, -to_utf8 is ignored.
--- - If lang has coding=other, and -to_utf8 is in opts, from_other is applied first.
--- THIS DOES NOT WORK UNFORTUNATELY - can't use the grammar flag properly
- unlexx opts lang = {- trace (unwords optsC) $ -} stringOps optsC where
- optsC = case lookFlag pgf lang "coding" of
- Just "utf8" -> filter (/="to_utf8") $ map prOpt opts
- Just other | isOpt "to_utf8" opts ->
- let cod = ("from_" ++ other)
- in cod : filter (/=cod) (map prOpt opts)
- _ -> map prOpt opts
-
- optRestricted opts = restrictPGF (hasLin pgf (mkCId (optLang opts))) pgf
-
- optLangs opts = case valIdOpts "lang" "" opts of
- "" -> languages pgf
- lang -> chunks ',' lang
- optLang opts = head $ optLangs opts ++ ["#NOLANG"]
- optCat opts = valIdOpts "cat" (lookStartCat pgf) opts
- optComm opts = valStrOpts "command" "" opts
- optViewFormat opts = valStrOpts "format" "ps" opts
- optViewGraph opts = valStrOpts "view" "gv" opts
- optNum opts = valIntOpts "number" 1 opts
- optNumInf opts = valIntOpts "number" 1000000000 opts ---- 10^9
-
- fromTrees ts = (ts,unlines (map showTree ts))
- fromStrings ss = (map (Lit . LStr) ss, unlines ss)
- fromString s = ([Lit (LStr s)], s)
- toStrings ts = [s | Lit (LStr s) <- ts]
- toString ts = unwords [s | Lit (LStr s) <- ts]
-
- prGrammar opts = case opts of
- _ | isOpt "cats" opts -> unwords $ categories pgf
- _ | isOpt "fullform" opts -> concatMap
- (prFullFormLexicon . buildMorpho pgf . mkCId) $ optLangs opts
- _ | isOpt "missing" opts ->
- unlines $ [unwords (la:":": map prCId cs) |
- la <- optLangs opts, let cs = missingLins pgf (mkCId la)]
- _ -> case valIdOpts "printer" "pgf" opts of
- v -> concatMap snd $ exportPGF noOptions (read v) pgf
-
- morphos opts s =
- [lookupMorpho (buildMorpho pgf (mkCId la)) s | la <- optLangs opts]
-
- -- ps -f -g s returns g (f s)
- stringOps opts s = foldr app s (reverse opts) where
- app f = maybe id id (stringOp f)
-
-stringOpOptions = [
- ("bind","bind tokens separated by Prelude.BIND, i.e. &+"),
- ("chars","lexer that makes every non-space character a token"),
- ("from_cp1251","decode from cp1251 (Cyrillic used in Bulgarian resource)"),
- ("from_devanagari","from unicode to GF Devanagari transliteration"),
- ("from_thai","from unicode to GF Thai transliteration"),
- ("from_utf8","decode from utf8"),
- ("lextext","text-like lexer"),
- ("lexcode","code-like lexer"),
- ("lexmixed","mixture of text and code (code between $...$)"),
- ("to_cp1251","encode to cp1251 (Cyrillic used in Bulgarian resource)"),
- ("to_devanagari","from GF Devanagari transliteration to unicode"),
- ("to_html","wrap in a html file with linebreaks"),
- ("to_thai","from GF Thai transliteration to unicode"),
- ("to_utf8","encode to utf8"),
- ("unlextext","text-like unlexer"),
- ("unlexcode","code-like unlexer"),
- ("unlexmixed","mixture of text and code (code between $...$)"),
- ("unchars","unlexer that puts no spaces between tokens"),
- ("unwords","unlexer that puts a single space between tokens (default)"),
- ("words","lexer that assumes tokens separated by spaces (default)")
- ]
-
-translationQuiz :: PGF -> Language -> Language -> Category -> IO ()
-translationQuiz pgf ig og cat = do
- tts <- translationList pgf ig og cat infinity
- mkQuiz "Welcome to GF Translation Quiz." tts
-
-morphologyQuiz :: PGF -> Language -> Category -> IO ()
-morphologyQuiz pgf ig cat = do
- tts <- morphologyList pgf ig cat infinity
- mkQuiz "Welcome to GF Morphology Quiz." tts
-
--- | the maximal number of precompiled quiz problems
-infinity :: Int
-infinity = 256
-
-lookFlag :: PGF -> String -> String -> Maybe String
-lookFlag pgf lang flag = lookConcrFlag pgf (mkCId lang) (mkCId flag)
diff --git a/src-3.0/GF/Command/Importing.hs b/src-3.0/GF/Command/Importing.hs
deleted file mode 100644
index c3ad9d746..000000000
--- a/src-3.0/GF/Command/Importing.hs
+++ /dev/null
@@ -1,37 +0,0 @@
-module GF.Command.Importing (importGrammar, importSource) where
-
-import PGF
-import PGF.Data
-
-import GF.Compile
-import GF.Grammar.Grammar (SourceGrammar) -- for cc command
-import GF.Infra.UseIO
-import GF.Infra.Option
-import GF.Data.ErrM
-
-import Data.List (nubBy)
-import System.FilePath
-
--- import a grammar in an environment where it extends an existing grammar
-importGrammar :: PGF -> Options -> [FilePath] -> IO PGF
-importGrammar pgf0 _ [] = return pgf0
-importGrammar pgf0 opts files =
- case takeExtensions (last files) of
- s | elem s [".gf",".gfo"] -> do
- res <- appIOE $ compileToPGF opts files
- case res of
- Ok pgf2 -> do return $ unionPGF pgf0 pgf2
- Bad msg -> do putStrLn msg
- return pgf0
- ".pgf" -> do
- pgf2 <- mapM readPGF files >>= return . foldl1 unionPGF
- return $ unionPGF pgf0 pgf2
-
-importSource :: SourceGrammar -> Options -> [FilePath] -> IO SourceGrammar
-importSource src0 opts files = do
- src <- appIOE $ batchCompile opts files
- case src of
- Ok gr -> return gr
- Bad msg -> do
- putStrLn msg
- return src0
diff --git a/src-3.0/GF/Command/Interpreter.hs b/src-3.0/GF/Command/Interpreter.hs
deleted file mode 100644
index e1a06a205..000000000
--- a/src-3.0/GF/Command/Interpreter.hs
+++ /dev/null
@@ -1,121 +0,0 @@
-module GF.Command.Interpreter (
- CommandEnv (..),
- mkCommandEnv,
- emptyCommandEnv,
- interpretCommandLine,
- interpretPipe,
- getCommandOp
- ) where
-
-import GF.Command.Commands
-import GF.Command.Abstract
-import GF.Command.Parse
-import PGF
-import PGF.Data
-import PGF.Macros
-import GF.System.Signal
-import GF.Infra.UseIO
-
-import GF.Data.ErrM ----
-
-import qualified Data.Map as Map
-
-data CommandEnv = CommandEnv {
- multigrammar :: PGF,
- commands :: Map.Map String CommandInfo,
- commandmacros :: Map.Map String CommandLine,
- expmacros :: Map.Map String Tree
- }
-
-mkCommandEnv :: PGF -> CommandEnv
-mkCommandEnv pgf = CommandEnv pgf (allCommands pgf) Map.empty Map.empty
-
-emptyCommandEnv :: CommandEnv
-emptyCommandEnv = mkCommandEnv emptyPGF
-
-interpretCommandLine :: CommandEnv -> String -> IO ()
-interpretCommandLine env line =
- case readCommandLine line of
- Just [] -> return ()
- Just pipes -> do res <- runInterruptibly (mapM_ (interpretPipe env) pipes)
- case res of
- Left ex -> putStrLnFlush (show ex)
- Right x -> return x
- Nothing -> putStrLnFlush "command not parsed"
-
-interpretPipe env cs = do
- v@(_,s) <- intercs ([],"") cs
- putStrLnFlush s
- return v
- where
- intercs treess [] = return treess
- intercs (trees,_) (c:cs) = do
- treess2 <- interc trees c
- intercs treess2 cs
- interc es comm@(Command co _ arg) = case co of
- '%':f -> case Map.lookup f (commandmacros env) of
- Just css -> do
- mapM_ (interpretPipe env) (appLine (getCommandArg env arg es) css)
- return ([],[]) ---- return ?
- _ -> do
- putStrLn $ "command macro " ++ co ++ " not interpreted"
- return ([],[])
- _ -> interpret env es comm
- appLine es = map (map (appCommand es))
-
--- macro definition applications: replace ?i by (exps !! i)
-appCommand :: [Tree] -> Command -> Command
-appCommand xs c@(Command i os arg) = case arg of
- ATree e -> Command i os (ATree (app e))
- _ -> c
- where
- app e = case e of
- Meta i -> xs !! i
- Fun f as -> Fun f (map app as)
- Abs x b -> Abs x (app b)
-
--- return the trees to be sent in pipe, and the output possibly printed
-interpret :: CommandEnv -> [Tree] -> Command -> IO CommandOutput
-interpret env trees0 comm = case lookCommand co comms of
- Just info -> do
- checkOpts info
- tss@(_,s) <- exec info opts trees
- optTrace s
- return tss
- _ -> do
- putStrLn $ "command " ++ co ++ " not interpreted"
- return ([],[])
- where
- optTrace = if isOpt "tr" opts then putStrLn else const (return ())
- (co,opts,trees) = getCommand env comm trees0
- comms = commands env
- checkOpts info =
- case
- [o | OOpt o <- opts, notElem o ("tr" : map fst (options info))] ++
- [o | OFlag o _ <- opts, notElem o (map fst (flags info))]
- of
- [] -> return ()
- [o] -> putStrLn $ "option not interpreted: " ++ o
- os -> putStrLn $ "options not interpreted: " ++ unwords os
-
--- analyse command parse tree to a uniform datastructure, normalizing comm name
---- the env is needed for macro lookup
-getCommand :: CommandEnv -> Command -> [Tree] -> (String,[Option],[Tree])
-getCommand env co@(Command c opts arg) ts =
- (getCommandOp c,opts,getCommandArg env arg ts)
-
-getCommandArg :: CommandEnv -> Argument -> [Tree] -> [Tree]
-getCommandArg env a ts = case a of
- AMacro m -> case Map.lookup m (expmacros env) of
- Just t -> [t]
- _ -> []
- ATree t -> [t] -- ignore piped
- ANoArg -> ts -- use piped
-
--- abbreviation convention from gf commands
-getCommandOp s = case break (=='_') s of
- (a:_,_:b:_) -> [a,b] -- axx_byy --> ab
- _ -> case s of
- [a,b] -> s -- ab --> ab
- a:_ -> [a] -- axx --> a
-
diff --git a/src-3.0/GF/Command/Parse.hs b/src-3.0/GF/Command/Parse.hs
deleted file mode 100644
index eaf4cba84..000000000
--- a/src-3.0/GF/Command/Parse.hs
+++ /dev/null
@@ -1,48 +0,0 @@
-module GF.Command.Parse(readCommandLine, pCommand) where
-
-import PGF.Expr
-import PGF.Data(Tree)
-import GF.Command.Abstract
-
-import Data.Char
-import Control.Monad
-import qualified Text.ParserCombinators.ReadP as RP
-
-readCommandLine :: String -> Maybe CommandLine
-readCommandLine s = case [x | (x,cs) <- RP.readP_to_S pCommandLine s, all isSpace cs] of
- [x] -> Just x
- _ -> Nothing
-
-test s = RP.readP_to_S pCommandLine s
-
-pCommandLine = RP.sepBy (RP.skipSpaces >> pPipe) (RP.skipSpaces >> RP.char ';')
-
-pPipe = RP.sepBy1 (RP.skipSpaces >> pCommand) (RP.skipSpaces >> RP.char '|')
-
-pCommand = do
- cmd <- pIdent RP.<++ (RP.char '%' >> pIdent >>= return . ('%':))
- RP.skipSpaces
- opts <- RP.sepBy pOption RP.skipSpaces
- arg <- pArgument
- return (Command cmd opts arg)
-
-pOption = do
- RP.char '-'
- flg <- pIdent
- RP.option (OOpt flg) (fmap (OFlag flg) (RP.char '=' >> pValue))
-
-pValue = do
- fmap (VInt . read) (RP.munch1 isDigit)
- RP.<++
- fmap VStr pStr
- RP.<++
- fmap VId pFilename
-
-pFilename = liftM2 (:) (RP.satisfy isFileFirst) (RP.munch (not . isSpace)) where
- isFileFirst c = not (isSpace c) && not (isDigit c)
-
-pArgument =
- RP.option ANoArg
- (fmap ATree (pTree False)
- RP.<++
- (RP.munch isSpace >> RP.char '%' >> fmap AMacro pIdent))
diff --git a/src-3.0/GF/Compile.hs b/src-3.0/GF/Compile.hs
deleted file mode 100644
index eb491cc78..000000000
--- a/src-3.0/GF/Compile.hs
+++ /dev/null
@@ -1,226 +0,0 @@
-module GF.Compile (batchCompile, link, compileToPGF, compileSourceGrammar) where
-
--- the main compiler passes
-import GF.Compile.GetGrammar
-import GF.Compile.Extend
-import GF.Compile.Rebuild
-import GF.Compile.Rename
-import GF.Compile.CheckGrammar
-import GF.Compile.Optimize
-import GF.Compile.OptimizeGF
-import GF.Compile.OptimizeGFCC
-import GF.Compile.GrammarToGFCC
-import GF.Compile.ReadFiles
-import GF.Compile.Update
-import GF.Compile.Refresh
-
-import GF.Grammar.Grammar
-import GF.Grammar.Lookup
-import GF.Grammar.PrGrammar
-
-import GF.Infra.Ident
-import GF.Infra.Option
-import GF.Infra.Modules
-import GF.Infra.UseIO
-
-import GF.Source.GrammarToSource
-import qualified GF.Source.AbsGF as A
-import qualified GF.Source.PrintGF as P
-
-import GF.Data.Operations
-
-import Control.Monad
-import System.Directory
-import System.FilePath
-import System.Time
-import qualified Data.Map as Map
-import qualified Data.Set as Set
-
-import PGF.Check
-import PGF.Data
-
-
--- | Compiles a number of source files and builds a 'PGF' structure for them.
-compileToPGF :: Options -> [FilePath] -> IOE PGF
-compileToPGF opts fs =
- do gr <- batchCompile opts fs
- let name = justModuleName (last fs)
- link opts name gr
-
-link :: Options -> String -> SourceGrammar -> IOE PGF
-link opts cnc gr =
- do gc1 <- putPointE Normal opts "linking ... " $
- let (abs,gc0) = mkCanon2gfcc opts cnc gr
- in case checkPGF gc0 of
- Ok (gc,b) -> do
- ioeIO $ putStrLn $ if b then "OK" else "Corrupted PGF"
- return gc
- Bad s -> fail s
- return $ buildParser opts $ optimize opts gc1
-
-optimize :: Options -> PGF -> PGF
-optimize opts = cse . suf
- where os = moduleFlag optOptimizations opts
- cse = if OptCSE `Set.member` os then cseOptimize else id
- suf = if OptStem `Set.member` os then suffixOptimize else id
-
-buildParser :: Options -> PGF -> PGF
-buildParser opts =
- if moduleFlag optBuildParser opts then addParsers else id
-
-batchCompile :: Options -> [FilePath] -> IOE SourceGrammar
-batchCompile opts files = do
- (_,gr,_) <- foldM (compileModule opts) emptyCompileEnv files
- return gr
-
--- to compile a set of modules, e.g. an old GF or a .cf file
-compileSourceGrammar :: Options -> SourceGrammar -> IOE SourceGrammar
-compileSourceGrammar opts gr@(MGrammar ms) = do
- (_,gr',_) <- foldM compOne (0,emptySourceGrammar,Map.empty) ms
- return gr'
- where
- compOne env mo = do
- (k,mo') <- compileSourceModule opts env mo
- extendCompileEnvInt env k Nothing mo' --- file for the same of modif time...
-
--- to output an intermediate stage
-intermOut :: Options -> Dump -> String -> IOE ()
-intermOut opts d s = if dump opts d then
- ioeIO (putStrLn ("\n\n--#" +++ show d) >> putStrLn s)
- else return ()
-
-
--- | the environment
-type CompileEnv = (Int,SourceGrammar,ModEnv)
-
--- | compile with one module as starting point
--- command-line options override options (marked by --#) in the file
--- As for path: if it is read from file, the file path is prepended to each name.
--- If from command line, it is used as it is.
-
-compileModule :: Options -- ^ Options from program command line and shell command.
- -> CompileEnv -> FilePath -> IOE CompileEnv
-compileModule opts1 env file = do
- opts0 <- getOptionsFromFile file
- let opts = addOptions opts0 opts1
- let fdir = dropFileName file
- let ps0 = moduleFlag optLibraryPath opts
- ps2 <- ioeIO $ extendPathEnv $ fdir : ps0
- let ps = ps2 ++ map (fdir </>) ps0
- ioeIO $ putIfVerb opts $ "module search path:" +++ show ps ----
- let (_,sgr,rfs) = env
- files <- getAllFiles opts ps rfs file
- ioeIO $ putIfVerb opts $ "files to read:" +++ show files ----
- let names = map justModuleName files
- ioeIO $ putIfVerb opts $ "modules to include:" +++ show names ----
- foldM (compileOne opts) (0,sgr,rfs) files
-
-compileOne :: Options -> CompileEnv -> FullPath -> IOE CompileEnv
-compileOne opts env@(_,srcgr,_) file = do
-
- let putpOpt v m act
- | verbAtLeast opts Verbose = putPointE Normal opts v act
- | verbAtLeast opts Normal = ioeIO (putStrFlush m) >> act
- | otherwise = putPointE Verbose opts v act
-
- let gf = takeExtensions file
- let path = dropFileName file
- let name = dropExtension file
- let mos = modules srcgr
-
- case gf of
-
- -- for compiled gf, read the file and update environment
- -- also undo common subexp optimization, to enable normal computations
- ".gfo" -> do
- sm0 <- putPointE Normal opts ("+ reading" +++ file) $ getSourceModule opts file
- let sm1 = unsubexpModule sm0
- sm <- {- putPointE Normal opts "creating indirections" $ -} ioeErr $ extendModule mos sm1
-
- extendCompileEnv env file sm
-
- -- for gf source, do full compilation and generate code
- _ -> do
-
- let gfo = gfoFile (dropExtension file)
- b1 <- ioeIO $ doesFileExist file
- if not b1
- then compileOne opts env $ gfo
- else do
-
- sm0 <- putpOpt ("- parsing" +++ file) ("- compiling" +++ file ++ "... ") $
- getSourceModule opts file
- (k',sm) <- compileSourceModule opts env sm0
- let sm1 = if isConcr sm then shareModule sm else sm -- cannot expand Str
- cm <- putPointE Verbose opts " generating code... " $ generateModuleCode opts gfo sm1
- -- sm is optimized before generation, but not in the env
- extendCompileEnvInt env k' (Just gfo) sm1
- where
- isConcr (_,mi) = case mi of
- ModMod m -> isModCnc m && mstatus m /= MSIncomplete
- _ -> False
-
-
-compileSourceModule :: Options -> CompileEnv ->
- SourceModule -> IOE (Int,SourceModule)
-compileSourceModule opts env@(k,gr,_) mo@(i,mi) = do
-
- let putp = putPointE Normal opts
- putpp = putPointE Verbose opts
- mos = modules gr
-
- mo1 <- ioeErr $ rebuildModule mos mo
- intermOut opts DumpRebuild (prModule mo1)
-
- mo1b <- ioeErr $ extendModule mos mo1
- intermOut opts DumpExtend (prModule mo1b)
-
- case mo1b of
- (_,ModMod n) | not (isCompleteModule n) -> do
- return (k,mo1b) -- refresh would fail, since not renamed
- _ -> do
- mo2:_ <- putpp " renaming " $ ioeErr $ renameModule mos mo1b
- intermOut opts DumpRename (prModule mo2)
-
- (mo3:_,warnings) <- putpp " type checking" $ ioeErr $ showCheckModule mos mo2
- if null warnings then return () else putp warnings $ return ()
- intermOut opts DumpTypeCheck (prModule mo3)
-
- (k',mo3r:_) <- putpp " refreshing " $ ioeErr $ refreshModule (k,mos) mo3
- intermOut opts DumpRefresh (prModule mo3r)
-
- let eenv = () --- emptyEEnv
- (mo4,eenv') <-
- ---- if oElem "check_only" opts
- putpp " optimizing " $ ioeErr $ optimizeModule opts (mos,eenv) mo3r
- return (k',mo4)
- where
- ---- prDebug mo = ioeIO $ putStrLn $ prGrammar $ MGrammar [mo] ---- debug
- prDebug mo = ioeIO $ print $ length $ lines $ prGrammar $ MGrammar [mo]
-
-generateModuleCode :: Options -> FilePath -> SourceModule -> IOE SourceModule
-generateModuleCode opts file minfo = do
- let minfo1 = subexpModule minfo
- out = prGrammar (MGrammar [minfo1])
- putPointE Normal opts (" wrote file" +++ file) $ ioeIO $ writeFile file $ out
- return minfo1
-
--- auxiliaries
-
-reverseModules (MGrammar ms) = MGrammar $ reverse ms
-
-emptyCompileEnv :: CompileEnv
-emptyCompileEnv = (0,emptyMGrammar,Map.empty)
-
-extendCompileEnvInt (_,MGrammar ss,menv) k mfile sm = do
- let (mod,imps) = importsOfModule (trModule sm)
- menv2 <- case mfile of
- Just file -> do
- t <- ioeIO $ getModificationTime file
- return $ Map.insert mod (t,imps) menv
- _ -> return menv
- return (k,MGrammar (sm:ss),menv2) --- reverse later
-
-extendCompileEnv e@(k,_,_) file sm = extendCompileEnvInt e k (Just file) sm
-
-
diff --git a/src-3.0/GF/Compile/BackOpt.hs b/src-3.0/GF/Compile/BackOpt.hs
deleted file mode 100644
index 8667023c0..000000000
--- a/src-3.0/GF/Compile/BackOpt.hs
+++ /dev/null
@@ -1,105 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : BackOpt
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/04/21 16:21:33 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.6 $
---
--- Optimizations on GF source code: sharing, parametrization, value sets.
---
--- optimization: sharing branches in tables. AR 25\/4\/2003.
--- following advice of Josef Svenningsson
------------------------------------------------------------------------------
-
-module GF.Compile.BackOpt (shareModule, OptSpec) where
-
-import GF.Grammar.Grammar
-import GF.Infra.Ident
-import GF.Infra.Option
-import qualified GF.Grammar.Macros as C
-import GF.Grammar.PrGrammar (prt)
-import GF.Data.Operations
-import Data.List
-import qualified GF.Infra.Modules as M
-import qualified Data.ByteString.Char8 as BS
-
-import Data.Set (Set)
-import qualified Data.Set as Set
-
-type OptSpec = Set Optimization
-
-shareModule :: OptSpec -> (Ident, SourceModInfo) -> (Ident, SourceModInfo)
-shareModule opt (i,m) = case m of
- M.ModMod mo ->
- (i,M.ModMod (M.replaceJudgements mo (mapTree (shareInfo opt) (M.jments mo))))
- _ -> (i,m)
-
-shareInfo opt (c, CncCat ty (Yes t) m) = (c,CncCat ty (Yes (shareOptim opt c t)) m)
-shareInfo opt (c, CncFun kxs (Yes t) m) = (c,CncFun kxs (Yes (shareOptim opt c t)) m)
-shareInfo opt (c, ResOper ty (Yes t)) = (c,ResOper ty (Yes (shareOptim opt c t)))
-shareInfo _ i = i
-
--- the function putting together optimizations
-shareOptim :: OptSpec -> Ident -> Term -> Term
-shareOptim opt c = (if OptValues `Set.member` opt then values else id)
- . (if OptParametrize `Set.member` opt then factor c 0 else id)
-
--- do even more: factor parametric branches
-
-factor :: Ident -> Int -> Term -> Term
-factor c i t = case t of
- T _ [_] -> t
- T _ [] -> t
- T (TComp ty) cs ->
- T (TTyped ty) $ factors i [(p, factor c (i+1) v) | (p, v) <- cs]
- _ -> C.composSafeOp (factor c i) t
- where
-
- factors i psvs = -- we know psvs has at least 2 elements
- let p = qqIdent c i
- vs' = map (mkFun p) psvs
- in if allEqs vs'
- then mkCase p vs'
- else psvs
-
- mkFun p (patt, val) = replace (C.patt2term patt) (Vr p) val
-
- allEqs (v:vs) = all (==v) vs
-
- mkCase p (v:_) = [(PV p, v)]
-
---- we hope this will be fresh and don't check... in GFC would be safe
-
-qqIdent c i = identC (BS.pack ("q_" ++ prt c ++ "__" ++ show i))
-
-
--- we need to replace subterms
-
-replace :: Term -> Term -> Term -> Term
-replace old new trm = case trm of
-
- -- these are the important cases, since they can correspond to patterns
- QC _ _ | trm == old -> new
- App t ts | trm == old -> new
- App t ts -> App (repl t) (repl ts)
- R _ | isRec && trm == old -> new
- _ -> C.composSafeOp repl trm
- where
- repl = replace old new
- isRec = case trm of
- R _ -> True
- _ -> False
-
--- It is very important that this is performed only after case
--- expansion since otherwise the order and number of values can
--- be incorrect. Guaranteed by the TComp flag.
-
-values :: Term -> Term
-values t = case t of
- T ty [(ps,t)] -> T ty [(ps,values t)] -- don't destroy parametrization
- T (TComp ty) cs -> V ty [values t | (_, t) <- cs]
- _ -> C.composSafeOp values t
diff --git a/src-3.0/GF/Compile/CheckGrammar.hs b/src-3.0/GF/Compile/CheckGrammar.hs
deleted file mode 100644
index 0a8361d36..000000000
--- a/src-3.0/GF/Compile/CheckGrammar.hs
+++ /dev/null
@@ -1,1105 +0,0 @@
-{-# LANGUAGE PatternGuards #-}
-----------------------------------------------------------------------
--- |
--- Module : CheckGrammar
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/11/11 23:24:33 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.31 $
---
--- AR 4\/12\/1999 -- 1\/4\/2000 -- 8\/9\/2001 -- 15\/5\/2002 -- 27\/11\/2002 -- 18\/6\/2003
---
--- type checking also does the following modifications:
---
--- - types of operations and local constants are inferred and put in place
---
--- - both these types and linearization types are computed
---
--- - tables are type-annotated
------------------------------------------------------------------------------
-
-module GF.Compile.CheckGrammar (
- showCheckModule, justCheckLTerm, allOperDependencies, topoSortOpers) where
-
-import GF.Infra.Ident
-import GF.Infra.Modules
-
-import GF.Compile.TypeCheck
-
-import GF.Compile.Refresh
-import GF.Grammar.Grammar
-import GF.Grammar.PrGrammar
-import GF.Grammar.Lookup
-import GF.Grammar.LookAbs
-import GF.Grammar.Predef
-import GF.Grammar.Macros
-import GF.Grammar.ReservedWords
-import GF.Grammar.PatternMatch
-import GF.Grammar.AppPredefined
-import GF.Grammar.Lockfield (isLockLabel)
-
-import GF.Data.Operations
-import GF.Infra.CheckM
-
-import Data.List
-import qualified Data.Set as Set
-import qualified Data.Map as Map
-import Control.Monad
-import Debug.Trace ---
-
-
-showCheckModule :: [SourceModule] -> SourceModule -> Err ([SourceModule],String)
-showCheckModule mos m = do
- (st,(_,msg)) <- checkStart $ checkModule mos m
- return (st, unlines $ reverse msg)
-
-mapsCheckTree ::
- (Ord a) => ((a,b) -> Check (a,c)) -> BinTree a b -> Check (BinTree a c)
-mapsCheckTree f = checkErr . mapsErrTree (\t -> checkStart (f t) >>= return . fst)
-
-
--- | checking is performed in the dependency order of modules
-checkModule :: [SourceModule] -> SourceModule -> Check [SourceModule]
-checkModule ms (name,mod) = checkIn ("checking module" +++ prt name) $ case mod of
-
- ModMod mo -> do
- let js = jments mo
- checkRestrictedInheritance ms (name, mo)
- js' <- case mtype mo of
- MTAbstract -> mapsCheckTree (checkAbsInfo gr name mo) js
-
- MTTransfer a b -> mapsCheckTree (checkAbsInfo gr name mo) js
-
- MTResource -> mapsCheckTree (checkResInfo gr name mo) js
-
- MTConcrete a -> do
- checkErr $ topoSortOpers $ allOperDependencies name js
- ModMod abs <- checkErr $ lookupModule gr a
- js1 <- checkCompleteGrammar abs mo
- mapsCheckTree (checkCncInfo gr name mo (a,abs)) js1
-
- MTInterface -> mapsCheckTree (checkResInfo gr name mo) js
-
- MTInstance a -> do
- ModMod abs <- checkErr $ lookupModule gr a
- -- checkCompleteInstance abs mo -- this is done in Rebuild
- mapsCheckTree (checkResInfo gr name mo) js
-
- return $ (name, ModMod (replaceJudgements mo js')) : ms
-
- _ -> return $ (name,mod) : ms
- where
- gr = MGrammar $ (name,mod):ms
-
--- check if restricted inheritance modules are still coherent
--- i.e. that the defs of remaining names don't depend on omitted names
----checkRestrictedInheritance :: [SourceModule] -> SourceModule -> Check ()
-checkRestrictedInheritance mos (name,mo) = do
- let irs = [ii | ii@(_,mi) <- extend mo, mi /= MIAll] -- names with restr. inh.
- let mrs = [((i,m),mi) | (i,ModMod m) <- mos, Just mi <- [lookup i irs]]
- -- the restr. modules themself, with restr. infos
- mapM_ checkRem mrs
- where
- checkRem ((i,m),mi) = do
- let (incl,excl) = partition (isInherited mi) (map fst (tree2list (jments m)))
- let incld c = Set.member c (Set.fromList incl)
- let illegal c = Set.member c (Set.fromList excl)
- let illegals = [(f,is) |
- (f,cs) <- allDeps, incld f, let is = filter illegal cs, not (null is)]
- case illegals of
- [] -> return ()
- cs -> fail $ "In inherited module" +++ prt i ++
- ", dependence of excluded constants:" ++++
- unlines [" " ++ prt f +++ "on" +++ unwords (map prt is) |
- (f,is) <- cs]
- allDeps = ---- transClosure $ Map.fromList $
- concatMap (allDependencies (const True))
- [jments m | (_,ModMod m) <- mos]
- transClosure ds = ds ---- TODO: check in deeper modules
-
--- | check if a term is typable
-justCheckLTerm :: SourceGrammar -> Term -> Err Term
-justCheckLTerm src t = do
- ((t',_),_) <- checkStart (inferLType src t)
- return t'
-
-checkAbsInfo ::
- SourceGrammar -> Ident -> Module Ident Info -> (Ident,Info) -> Check (Ident,Info)
-checkAbsInfo st m mo (c,info) = do
----- checkReservedId c
- case info of
- AbsCat (Yes cont) _ -> mkCheck "category" $
- checkContext st cont ---- also cstrs
- AbsFun (Yes typ0) md -> do
- typ <- compAbsTyp [] typ0 -- to calculate let definitions
- mkCheck "type of function" $ checkTyp st typ
- md' <- case md of
- Yes d -> do
- let d' = elimTables d
- mkCheckWarn "definition of function" $ checkEquation st (m,c) d'
- return $ Yes d'
- _ -> return md
- return $ (c,AbsFun (Yes typ) md')
- _ -> return (c,info)
- where
- mkCheck cat ss = case ss of
- [] -> return (c,info)
- ["[]"] -> return (c,info) ----
- _ -> checkErr $ Bad (unlines ss ++++ "in" +++ cat +++ prt c +++ pos c)
- ---- temporary solution when tc of defs is incomplete
- mkCheckWarn cat ss = case ss of
- [] -> return (c,info)
- ["[]"] -> return (c,info) ----
- _ -> do
- checkWarn (unlines ss ++++ "in" +++ cat +++ prt c +++ pos c)
- return (c,info)
-
- pos c = showPosition mo c
-
- compAbsTyp g t = case t of
- Vr x -> maybe (fail ("no value given to variable" +++ prt x)) return $ lookup x g
- Let (x,(_,a)) b -> do
- a' <- compAbsTyp g a
- compAbsTyp ((x, a'):g) b
- Prod x a b -> do
- a' <- compAbsTyp g a
- b' <- compAbsTyp ((x,Vr x):g) b
- return $ Prod x a' b'
- Abs _ _ -> return t
- _ -> composOp (compAbsTyp g) t
-
- elimTables e = case e of
- S t a -> elimSel (elimTables t) (elimTables a)
- T _ cs -> Eqs [(elimPatt p, elimTables t) | (p,t) <- cs]
- _ -> composSafeOp elimTables e
- elimPatt p = case p of
- PR lps -> map snd lps
- _ -> [p]
- elimSel t a = case a of
- R fs -> mkApp t (map (snd . snd) fs)
- _ -> mkApp t [a]
-
-checkCompleteGrammar :: SourceAbs -> SourceCnc -> Check (BinTree Ident Info)
-checkCompleteGrammar abs cnc = do
- let js = jments cnc
- let fs = tree2list $ jments abs
- foldM checkOne js fs
- where
- checkOne js i@(c,info) = case info of
- AbsFun (Yes _) _ -> case lookupIdent c js of
- Ok _ -> return js
- _ -> do
- checkWarn $ "WARNING: no linearization of" +++ prt c
- return js
- AbsCat (Yes _) _ -> case lookupIdent c js of
- Ok (AnyInd _ _) -> return js
- Ok (CncCat (Yes _) _ _) -> return js
- Ok (CncCat _ mt mp) -> do
- checkWarn $
- "Warning: no linearization type for" +++ prt c ++
- ", inserting default {s : Str}"
- return $ updateTree (c,CncCat (Yes defLinType) mt mp) js
- _ -> do
- checkWarn $
- "Warning: no linearization type for" +++ prt c ++
- ", inserting default {s : Str}"
- return $ updateTree (c,CncCat (Yes defLinType) nope nope) js
- _ -> return js
-
--- | General Principle: only Yes-values are checked.
--- A May-value has always been checked in its origin module.
-checkResInfo ::
- SourceGrammar -> Ident -> Module Ident Info -> (Ident,Info) -> Check (Ident,Info)
-checkResInfo gr mo mm (c,info) = do
- checkReservedId c
- case info of
- ResOper pty pde -> chIn "operation" $ do
- (pty', pde') <- case (pty,pde) of
- (Yes ty, Yes de) -> do
- ty' <- check ty typeType >>= comp . fst
- (de',_) <- check de ty'
- return (Yes ty', Yes de')
- (_, Yes de) -> do
- (de',ty') <- infer de
- return (Yes ty', Yes de')
- (_,Nope) -> do
- checkWarn "No definition given to oper"
- return (pty,pde)
- _ -> return (pty, pde) --- other cases are uninteresting
- return (c, ResOper pty' pde')
-
- ResOverload os tysts -> chIn "overloading" $ do
- tysts' <- mapM (uncurry $ flip check) tysts -- return explicit ones
- tysts0 <- checkErr $ lookupOverload gr mo c -- check against inherited ones too
- tysts1 <- mapM (uncurry $ flip check)
- [(mkFunType args val,tr) | (args,(val,tr)) <- tysts0]
- let tysts2 = [(y,x) | (x,y) <- tysts1]
- --- this can only be a partial guarantee, since matching
- --- with value type is only possible if expected type is given
- checkUniq $
- sort [t : map snd xs | (x,_) <- tysts2, Ok (xs,t) <- [typeFormCnc x]]
- return (c,ResOverload os [(y,x) | (x,y) <- tysts'])
-
- ResParam (Yes (pcs,_)) -> chIn "parameter type" $ do
----- mapM ((mapM (computeLType gr . snd)) . snd) pcs
- mapM_ ((mapM_ (checkIfParType gr . snd)) . snd) pcs
- ts <- checkErr $ lookupParamValues gr mo c
- return (c,ResParam (Yes (pcs, Just ts)))
-
- _ -> return (c,info)
- where
- infer = inferLType gr
- check = checkLType gr
- chIn cat = checkIn ("Happened in" +++ cat +++ prt c +++ pos c +++ ":")
- comp = computeLType gr
- pos c = showPosition mm c
-
- checkUniq xss = case xss of
- x:y:xs
- | x == y -> raise $ "ambiguous for type" +++
- prtType gr (mkFunType (tail x) (head x))
- | otherwise -> checkUniq $ y:xs
- _ -> return ()
-
-
-checkCncInfo :: SourceGrammar -> Ident -> Module Ident Info ->
- (Ident,SourceAbs) ->
- (Ident,Info) -> Check (Ident,Info)
-checkCncInfo gr m mo (a,abs) (c,info) = do
- checkReservedId c
- case info of
-
- CncFun _ (Yes trm) mpr -> chIn "linearization of" $ do
- typ <- checkErr $ lookupFunType gr a c
- cat0 <- checkErr $ valCat typ
- (cont,val) <- linTypeOfType gr m typ -- creates arg vars
- (trm',_) <- check trm (mkFunType (map snd cont) val) -- erases arg vars
- checkPrintname gr mpr
- cat <- return $ snd cat0
- return (c, CncFun (Just (cat,(cont,val))) (Yes trm') mpr)
- -- cat for cf, typ for pe
-
- CncCat (Yes typ) mdef mpr -> chIn "linearization type of" $ do
- checkErr $ lookupCatContext gr a c
- typ' <- checkIfLinType gr typ
- mdef' <- case mdef of
- Yes def -> do
- (def',_) <- checkLType gr def (mkFunType [typeStr] typ)
- return $ Yes def'
- _ -> return mdef
- checkPrintname gr mpr
- return (c,CncCat (Yes typ') mdef' mpr)
-
- _ -> checkResInfo gr m mo (c,info)
-
- where
- env = gr
- infer = inferLType gr
- comp = computeLType gr
- check = checkLType gr
- chIn cat = checkIn ("Happened in" +++ cat +++ prt c +++ pos c +++ ":")
- pos c = showPosition mo c
-
-checkIfParType :: SourceGrammar -> Type -> Check ()
-checkIfParType st typ = checkCond ("Not parameter type" +++ prt typ) (isParType typ)
- where
- isParType ty = True ----
-{- case ty of
- Cn typ -> case lookupConcrete st typ of
- Ok (CncParType _ _ _) -> True
- Ok (CncOper _ ty' _) -> isParType ty'
- _ -> False
- Q p t -> case lookupInPackage st (p,t) of
- Ok (CncParType _ _ _) -> True
- _ -> False
- RecType r -> all (isParType . snd) r
- _ -> False
--}
-
-checkIfStrType :: SourceGrammar -> Type -> Check ()
-checkIfStrType st typ = case typ of
- Table arg val -> do
- checkIfParType st arg
- checkIfStrType st val
- _ | typ == typeStr -> return ()
- _ -> prtFail "not a string type" typ
-
-
-checkIfLinType :: SourceGrammar -> Type -> Check Type
-checkIfLinType st typ0 = do
- typ <- computeLType st typ0
-{- ---- should check that not fun type
- case typ of
- RecType r -> do
- let (lins,ihs) = partition (isLinLabel .fst) r
- --- checkErr $ checkUnique $ map fst r
- mapM_ checkInh ihs
- mapM_ checkLin lins
- _ -> prtFail "a linearization type cannot be" typ
--}
- return typ
-
- where
- checkInh (label,typ) = checkIfParType st typ
- checkLin (label,typ) = return () ---- checkIfStrType st typ
-
-
-computeLType :: SourceGrammar -> Type -> Check Type
-computeLType gr t = do
- g0 <- checkGetContext
- let g = [(x, Vr x) | (x,_) <- g0]
- checkInContext g $ comp t
- where
- comp ty = case ty of
- _ | Just _ <- isTypeInts ty -> return ty ---- shouldn't be needed
- | isPredefConstant ty -> return ty ---- shouldn't be needed
-
- Q m ident -> checkIn ("module" +++ prt m) $ do
- ty' <- checkErr (lookupResDef gr m ident)
- if ty' == ty then return ty else comp ty' --- is this necessary to test?
-
- Vr ident -> checkLookup ident -- never needed to compute!
-
- App f a -> do
- f' <- comp f
- a' <- comp a
- case f' of
- Abs x b -> checkInContext [(x,a')] $ comp b
- _ -> return $ App f' a'
-
- Prod x a b -> do
- a' <- comp a
- b' <- checkInContext [(x,Vr x)] $ comp b
- return $ Prod x a' b'
-
- Abs x b -> do
- b' <- checkInContext [(x,Vr x)] $ comp b
- return $ Abs x b'
-
- ExtR r s -> do
- r' <- comp r
- s' <- comp s
- case (r',s') of
- (RecType rs, RecType ss) -> checkErr (plusRecType r' s') >>= comp
- _ -> return $ ExtR r' s'
-
- RecType fs -> do
- let fs' = sortRec fs
- liftM RecType $ mapPairsM comp fs'
-
- _ | ty == typeTok -> return typeStr
- _ | isPredefConstant ty -> return ty
-
- _ -> composOp comp ty
-
-checkPrintname :: SourceGrammar -> Perh Term -> Check ()
-checkPrintname st (Yes t) = checkLType st t typeStr >> return ()
-checkPrintname _ _ = return ()
-
--- | for grammars obtained otherwise than by parsing ---- update!!
-checkReservedId :: Ident -> Check ()
-checkReservedId x = let c = prt x in
- if isResWord c
- then checkWarn ("Warning: reserved word used as identifier:" +++ c)
- else return ()
-
--- to normalize records and record types
-labelIndex :: Type -> Label -> Int
-labelIndex ty lab = case ty of
- RecType ts -> maybe (error ("label index" +++ prt lab)) id $ lookup lab $ labs ts
- _ -> error $ "label index" +++ prt ty
- where
- labs ts = zip (map fst (sortRec ts)) [0..]
-
--- the underlying algorithms
-
-inferLType :: SourceGrammar -> Term -> Check (Term, Type)
-inferLType gr trm = case trm of
-
- Q m ident | isPredef m -> termWith trm $ checkErr (typPredefined ident)
-
- Q m ident -> checks [
- termWith trm $ checkErr (lookupResType gr m ident) >>= comp
- ,
- checkErr (lookupResDef gr m ident) >>= infer
- ,
- prtFail "cannot infer type of constant" trm
- ]
-
- QC m ident | isPredef m -> termWith trm $ checkErr (typPredefined ident)
-
- QC m ident -> checks [
- termWith trm $ checkErr (lookupResType gr m ident) >>= comp
- ,
- checkErr (lookupResDef gr m ident) >>= infer
- ,
- prtFail "cannot infer type of canonical constant" trm
- ]
-
- Val ty i -> termWith trm $ return ty
-
- Vr ident -> termWith trm $ checkLookup ident
-
- Typed e t -> do
- t' <- comp t
- check e t'
- return (e,t')
-
- App f a -> do
- over <- getOverload gr Nothing trm
- case over of
- Just trty -> return trty
- _ -> do
- (f',fty) <- infer f
- fty' <- comp fty
- case fty' of
- Prod z arg val -> do
- a' <- justCheck a arg
- ty <- if isWildIdent z
- then return val
- else substituteLType [(z,a')] val
- return (App f' a',ty)
- _ -> raise ("function type expected for"+++
- prt f +++"instead of" +++ prtType env fty)
-
- S f x -> do
- (f', fty) <- infer f
- case fty of
- Table arg val -> do
- x'<- justCheck x arg
- return (S f' x', val)
- _ -> prtFail "table lintype expected for the table in" trm
-
- P t i -> do
- (t',ty) <- infer t --- ??
- ty' <- comp ty
------ let tr2 = PI t' i (labelIndex ty' i)
- let tr2 = P t' i
- termWith tr2 $ checkErr $ case ty' of
- RecType ts -> maybeErr ("unknown label" +++ prt i +++ "in" +++ prt ty') $
- lookup i ts
- _ -> prtBad ("record type expected for" +++ prt t +++ "instead of") ty'
- PI t i _ -> infer $ P t i
-
- R r -> do
- let (ls,fs) = unzip r
- fsts <- mapM inferM fs
- let ts = [ty | (Just ty,_) <- fsts]
- checkCond ("cannot infer type of record"+++ prt trm) (length ts == length fsts)
- return $ (R (zip ls fsts), RecType (zip ls ts))
-
- T (TTyped arg) pts -> do
- (_,val) <- checks $ map (inferCase (Just arg)) pts
- check trm (Table arg val)
- T (TComp arg) pts -> do
- (_,val) <- checks $ map (inferCase (Just arg)) pts
- check trm (Table arg val)
- T ti pts -> do -- tries to guess: good in oper type inference
- let pts' = [pt | pt@(p,_) <- pts, isConstPatt p]
- case pts' of
- [] -> prtFail "cannot infer table type of" trm
----- PInt k : _ -> return $ Ints $ max [i | PInt i <- pts']
- _ -> do
- (arg,val) <- checks $ map (inferCase Nothing) pts'
- check trm (Table arg val)
- V arg pts -> do
- (_,val) <- checks $ map infer pts
- return (trm, Table arg val)
-
- K s -> do
- if elem ' ' s
- then do
- let ss = foldr C Empty (map K (words s))
- ----- removed irritating warning AR 24/5/2008
- ----- checkWarn ("WARNING: token \"" ++ s ++
- ----- "\" converted to token list" ++ prt ss)
- return (ss, typeStr)
- else return (trm, typeStr)
-
- EInt i -> return (trm, typeInt)
-
- EFloat i -> return (trm, typeFloat)
-
- Empty -> return (trm, typeStr)
-
- C s1 s2 ->
- check2 (flip justCheck typeStr) C s1 s2 typeStr
-
- Glue s1 s2 ->
- check2 (flip justCheck typeStr) Glue s1 s2 typeStr ---- typeTok
-
----- hack from Rename.identRenameTerm, to live with files with naming conflicts 18/6/2007
- Strs (Cn c : ts) | c == cConflict -> do
- trace ("WARNING: unresolved constant, could be any of" +++ unwords (map prt ts)) (infer $ head ts)
--- checkWarn ("WARNING: unresolved constant, could be any of" +++ unwords (map prt ts))
--- infer $ head ts
-
- Strs ts -> do
- ts' <- mapM (\t -> justCheck t typeStr) ts
- return (Strs ts', typeStrs)
-
- Alts (t,aa) -> do
- t' <- justCheck t typeStr
- aa' <- flip mapM aa (\ (c,v) -> do
- c' <- justCheck c typeStr
- v' <- justCheck v typeStrs
- return (c',v'))
- return (Alts (t',aa'), typeStr)
-
- RecType r -> do
- let (ls,ts) = unzip r
- ts' <- mapM (flip justCheck typeType) ts
- return (RecType (zip ls ts'), typeType)
-
- ExtR r s -> do
- (r',rT) <- infer r
- rT' <- comp rT
- (s',sT) <- infer s
- sT' <- comp sT
-
- let trm' = ExtR r' s'
- ---- trm' <- checkErr $ plusRecord r' s'
- case (rT', sT') of
- (RecType rs, RecType ss) -> do
- rt <- checkErr $ plusRecType rT' sT'
- check trm' rt ---- return (trm', rt)
- _ | rT' == typeType && sT' == typeType -> return (trm', typeType)
- _ -> prtFail "records or record types expected in" trm
-
- Sort _ ->
- termWith trm $ return typeType
-
- Prod x a b -> do
- a' <- justCheck a typeType
- b' <- checkInContext [(x,a')] $ justCheck b typeType
- return (Prod x a' b', typeType)
-
- Table p t -> do
- p' <- justCheck p typeType --- check p partype!
- t' <- justCheck t typeType
- return $ (Table p' t', typeType)
-
- FV vs -> do
- (_,ty) <- checks $ map infer vs
---- checkIfComplexVariantType trm ty
- check trm ty
-
- EPattType ty -> do
- ty' <- justCheck ty typeType
- return (ty',typeType)
- EPatt p -> do
- ty <- inferPatt p
- return (trm, EPattType ty)
-
- _ -> prtFail "cannot infer lintype of" trm
-
- where
- env = gr
- infer = inferLType env
- comp = computeLType env
-
- check = checkLType env
-
- isPredef m = elem m [cPredef,cPredefAbs]
-
- justCheck ty te = check ty te >>= return . fst
-
- -- for record fields, which may be typed
- inferM (mty, t) = do
- (t', ty') <- case mty of
- Just ty -> check ty t
- _ -> infer t
- return (Just ty',t')
-
- inferCase mty (patt,term) = do
- arg <- maybe (inferPatt patt) return mty
- cont <- pattContext env arg patt
- i <- checkUpdates cont
- (_,val) <- infer term
- checkResets i
- return (arg,val)
- isConstPatt p = case p of
- PC _ ps -> True --- all isConstPatt ps
- PP _ _ ps -> True --- all isConstPatt ps
- PR ps -> all (isConstPatt . snd) ps
- PT _ p -> isConstPatt p
- PString _ -> True
- PInt _ -> True
- PFloat _ -> True
- PChar -> True
- PChars _ -> True
- PSeq p q -> isConstPatt p && isConstPatt q
- PAlt p q -> isConstPatt p && isConstPatt q
- PRep p -> isConstPatt p
- PNeg p -> isConstPatt p
- PAs _ p -> isConstPatt p
- _ -> False
-
- inferPatt p = case p of
- PP q c ps | q /= cPredef -> checkErr $ lookupResType gr q c >>= valTypeCnc
- PAs _ p -> inferPatt p
- PNeg p -> inferPatt p
- PAlt p q -> checks [inferPatt p, inferPatt q]
- PSeq _ _ -> return $ typeStr
- PRep _ -> return $ typeStr
- PChar -> return $ typeStr
- PChars _ -> return $ typeStr
- _ -> infer (patt2term p) >>= return . snd
-
-
--- type inference: Nothing, type checking: Just t
--- the latter permits matching with value type
-getOverload :: SourceGrammar -> Maybe Type -> Term -> Check (Maybe (Term,Type))
-getOverload env@gr mt ot = case appForm ot of
- (f@(Q m c), ts) -> case lookupOverload gr m c of
- Ok typs -> do
- ttys <- mapM infer ts
- v <- matchOverload f typs ttys
- return $ Just v
- _ -> return Nothing
- _ -> return Nothing
- where
- infer = inferLType env
- matchOverload f typs ttys = do
- let (tts,tys) = unzip ttys
- let vfs = lookupOverloadInstance tys typs
- let matches = [vf | vf@((v,_),_) <- vfs, matchVal mt v]
-
- case ([vf | (vf,True) <- matches],[vf | (vf,False) <- matches]) of
- ([(val,fun)],_) -> return (mkApp fun tts, val)
- ([],[(val,fun)]) -> do
- checkWarn ("ignoring lock fields in resolving" +++ prt ot)
- return (mkApp fun tts, val)
- ([],[]) -> do
- raise $ "no overload instance of" +++ prt f +++
- "for" +++ unwords (map (prtType env) tys) +++ "among" ++++
- unlines [" " ++ unwords (map (prtType env) ty) | (ty,_) <- typs] ++
- maybe [] (("with value type" +++) . prtType env) mt
-
- (vfs1,vfs2) -> case (noProds vfs1,noProds vfs2) of
- ([(val,fun)],_) -> do
- return (mkApp fun tts, val)
- ([],[(val,fun)]) -> do
- checkWarn ("ignoring lock fields in resolving" +++ prt ot)
- return (mkApp fun tts, val)
-
------ unsafely exclude irritating warning AR 24/5/2008
------ checkWarn $ "WARNING: overloading of" +++ prt f +++
------ "resolved by excluding partial applications:" ++++
------ unlines [prtType env ty | (ty,_) <- vfs', not (noProd ty)]
-
-
- _ -> raise $ "ambiguous overloading of" +++ prt f +++
- "for" +++ unwords (map (prtType env) tys) ++++ "with alternatives" ++++
- unlines [prtType env ty | (ty,_) <- if (null vfs1) then vfs2 else vfs2]
-
- matchVal mt v = elem mt [Nothing,Just v,Just (unlocked v)]
-
- unlocked v = case v of
- RecType fs -> RecType $ filter (not . isLockLabel . fst) fs
- _ -> v
- ---- TODO: accept subtypes
- ---- TODO: use a trie
- lookupOverloadInstance tys typs =
- [((mkFunType rest val, t),isExact) |
- let lt = length tys,
- (ty,(val,t)) <- typs, length ty >= lt,
- let (pre,rest) = splitAt lt ty,
- let isExact = pre == tys,
- isExact || map unlocked pre == map unlocked tys
- ]
-
- noProds vfs = [(v,f) | (v,f) <- vfs, noProd v]
-
- noProd ty = case ty of
- Prod _ _ _ -> False
- _ -> True
-
-checkLType :: SourceGrammar -> Term -> Type -> Check (Term, Type)
-checkLType env trm typ0 = do
-
- typ <- comp typ0
-
- case trm of
-
- Abs x c -> do
- case typ of
- Prod z a b -> do
- checkUpdate (x,a)
- (c',b') <- if isWildIdent z
- then check c b
- else do
- b' <- checkIn "abs" $ substituteLType [(z,Vr x)] b
- check c b'
- checkReset
- return $ (Abs x c', Prod x a b')
- _ -> raise $ "product expected instead of" +++ prtType env typ
-
- App f a -> do
- over <- getOverload env (Just typ) trm
- case over of
- Just trty -> return trty
- _ -> do
- (trm',ty') <- infer trm
- termWith trm' $ checkEq typ ty' trm'
-
- Q _ _ -> do
- over <- getOverload env (Just typ) trm
- case over of
- Just trty -> return trty
- _ -> do
- (trm',ty') <- infer trm
- termWith trm' $ checkEq typ ty' trm'
-
- T _ [] ->
- prtFail "found empty table in type" typ
- T _ cs -> case typ of
- Table arg val -> do
- case allParamValues env arg of
- Ok vs -> do
- let ps0 = map fst cs
- ps <- checkErr $ testOvershadow ps0 vs
- if null ps
- then return ()
- else checkWarn $ "WARNING: patterns never reached:" +++
- concat (intersperse ", " (map prt ps))
-
- _ -> return () -- happens with variable types
- cs' <- mapM (checkCase arg val) cs
- return (T (TTyped arg) cs', typ)
- _ -> raise $ "table type expected for table instead of" +++ prtType env typ
-
- R r -> case typ of --- why needed? because inference may be too difficult
- RecType rr -> do
- let (ls,_) = unzip rr -- labels of expected type
- fsts <- mapM (checkM r) rr -- check that they are found in the record
- return $ (R fsts, typ) -- normalize record
-
- _ -> prtFail "record type expected in type checking instead of" typ
-
- ExtR r s -> case typ of
- _ | typ == typeType -> do
- trm' <- comp trm
- case trm' of
- RecType _ -> termWith trm $ return typeType
- ExtR (Vr _) (RecType _) -> termWith trm $ return typeType
- -- ext t = t ** ...
- _ -> prtFail "invalid record type extension" trm
- RecType rr -> do
- (r',ty,s') <- checks [
- do (r',ty) <- infer r
- return (r',ty,s)
- ,
- do (s',ty) <- infer s
- return (s',ty,r)
- ]
- case ty of
- RecType rr1 -> do
- let (rr0,rr2) = recParts rr rr1
- r2 <- justCheck r' rr0
- s2 <- justCheck s' rr2
- return $ (ExtR r2 s2, typ)
- _ -> raise ("record type expected in extension of" +++ prt r +++
- "but found" +++ prt ty)
-
- ExtR ty ex -> do
- r' <- justCheck r ty
- s' <- justCheck s ex
- return $ (ExtR r' s', typ) --- is this all?
-
- _ -> prtFail "record extension not meaningful for" typ
-
- FV vs -> do
- ttys <- mapM (flip check typ) vs
---- checkIfComplexVariantType trm typ
- return (FV (map fst ttys), typ) --- typ' ?
-
- S tab arg -> checks [ do
- (tab',ty) <- infer tab
- ty' <- comp ty
- case ty' of
- Table p t -> do
- (arg',val) <- check arg p
- checkEq typ t trm
- return (S tab' arg', t)
- _ -> raise $ "table type expected for applied table instead of" +++
- prtType env ty'
- , do
- (arg',ty) <- infer arg
- ty' <- comp ty
- (tab',_) <- check tab (Table ty' typ)
- return (S tab' arg', typ)
- ]
- Let (x,(mty,def)) body -> case mty of
- Just ty -> do
- (def',ty') <- check def ty
- checkUpdate (x,ty')
- body' <- justCheck body typ
- checkReset
- return (Let (x,(Just ty',def')) body', typ)
- _ -> do
- (def',ty) <- infer def -- tries to infer type of local constant
- check (Let (x,(Just ty,def')) body) typ
-
- _ -> do
- (trm',ty') <- infer trm
- termWith trm' $ checkEq typ ty' trm'
- where
- cnc = env
- infer = inferLType env
- comp = computeLType env
-
- check = checkLType env
-
- justCheck ty te = check ty te >>= return . fst
-
- checkEq = checkEqLType env
-
- recParts rr t = (RecType rr1,RecType rr2) where
- (rr1,rr2) = partition (flip elem (map fst t) . fst) rr
-
- checkM rms (l,ty) = case lookup l rms of
- Just (Just ty0,t) -> do
- checkEq ty ty0 t
- (t',ty') <- check t ty
- return (l,(Just ty',t'))
- Just (_,t) -> do
- (t',ty') <- check t ty
- return (l,(Just ty',t'))
- _ -> prtFail "cannot find value for label" l
-
- checkCase arg val (p,t) = do
- cont <- pattContext env arg p
- i <- checkUpdates cont
- t' <- justCheck t val
- checkResets i
- return (p,t')
-
-pattContext :: LTEnv -> Type -> Patt -> Check Context
-pattContext env typ p = case p of
- PV x | not (isWildIdent x) -> return [(x,typ)]
- PP q c ps | q /= cPredef -> do ---- why this /=? AR 6/1/2006
- t <- checkErr $ lookupResType cnc q c
- (cont,v) <- checkErr $ typeFormCnc t
- checkCond ("wrong number of arguments for constructor in" +++ prt p)
- (length cont == length ps)
- checkEqLType env typ v (patt2term p)
- mapM (uncurry (pattContext env)) (zip (map snd cont) ps) >>= return . concat
- PR r -> do
- typ' <- computeLType env typ
- case typ' of
- RecType t -> do
- let pts = [(ty,tr) | (l,tr) <- r, Just ty <- [lookup l t]]
- ----- checkWarn $ prt p ++++ show pts ----- debug
- mapM (uncurry (pattContext env)) pts >>= return . concat
- _ -> prtFail "record type expected for pattern instead of" typ'
- PT t p' -> do
- checkEqLType env typ t (patt2term p')
- pattContext env typ p'
-
- PAs x p -> do
- g <- pattContext env typ p
- return $ (x,typ):g
-
- PAlt p' q -> do
- g1 <- pattContext env typ p'
- g2 <- pattContext env typ q
- let pts = [pt | pt <- g1, notElem pt g2] ++ [pt | pt <- g2, notElem pt g1]
- checkCond
- ("incompatible bindings of" +++
- unwords (nub (map (prt . fst) pts))+++
- "in pattern alterantives" +++ prt p) (null pts)
- return g1 -- must be g1 == g2
- PSeq p q -> do
- g1 <- pattContext env typ p
- g2 <- pattContext env typ q
- return $ g1 ++ g2
- PRep p' -> noBind typeStr p'
- PNeg p' -> noBind typ p'
-
- _ -> return [] ---- check types!
- where
- cnc = env
- noBind typ p' = do
- co <- pattContext env typ p'
- if not (null co)
- then checkWarn ("no variable bound inside pattern" +++ prt p)
- >> return []
- else return []
-
--- auxiliaries
-
-type LTEnv = SourceGrammar
-
-termWith :: Term -> Check Type -> Check (Term, Type)
-termWith t ct = do
- ty <- ct
- return (t,ty)
-
--- | light-weight substitution for dep. types
-substituteLType :: Context -> Type -> Check Type
-substituteLType g t = case t of
- Vr x -> return $ maybe t id $ lookup x g
- _ -> composOp (substituteLType g) t
-
--- | compositional check\/infer of binary operations
-check2 :: (Term -> Check Term) -> (Term -> Term -> Term) ->
- Term -> Term -> Type -> Check (Term,Type)
-check2 chk con a b t = do
- a' <- chk a
- b' <- chk b
- return (con a' b', t)
-
-checkEqLType :: LTEnv -> Type -> Type -> Term -> Check Type
-checkEqLType env t u trm = do
- (b,t',u',s) <- checkIfEqLType env t u trm
- case b of
- True -> return t'
- False -> raise $ s +++ "type of" +++ prt trm +++
- ": expected:" +++ prtType env t ++++
- "inferred:" +++ prtType env u
-
-checkIfEqLType :: LTEnv -> Type -> Type -> Term -> Check (Bool,Type,Type,String)
-checkIfEqLType env t u trm = do
- t' <- comp t
- u' <- comp u
- case t' == u' || alpha [] t' u' of
- True -> return (True,t',u',[])
- -- forgive missing lock fields by only generating a warning.
- --- better: use a flag to forgive? (AR 31/1/2006)
- _ -> case missingLock [] t' u' of
- Ok lo -> do
- checkWarn $ "WARNING: missing lock field" +++ unwords (map prt lo)
- return (True,t',u',[])
- Bad s -> return (False,t',u',s)
-
- where
-
- -- t is a subtype of u
- --- quick hack version of TC.eqVal
- alpha g t u = case (t,u) of
-
- -- error (the empty type!) is subtype of any other type
- (_,u) | u == typeError -> True
-
- -- contravariance
- (Prod x a b, Prod y c d) -> alpha g c a && alpha ((x,y):g) b d
-
- -- record subtyping
- (RecType rs, RecType ts) -> all (\ (l,a) ->
- any (\ (k,b) -> alpha g a b && l == k) ts) rs
- (ExtR r s, ExtR r' s') -> alpha g r r' && alpha g s s'
- (ExtR r s, t) -> alpha g r t || alpha g s t
-
- -- the following say that Ints n is a subset of Int and of Ints m >= n
- (t,u) | Just m <- isTypeInts t, Just n <- isTypeInts t -> m >= n
- | Just _ <- isTypeInts t, u == typeInt -> True ---- check size!
- | t == typeInt, Just _ <- isTypeInts u -> True ---- why this ???? AR 11/12/2005
-
- ---- this should be made in Rename
- (Q m a, Q n b) | a == b -> elem m (allExtendsPlus env n)
- || elem n (allExtendsPlus env m)
- || m == n --- for Predef
- (QC m a, QC n b) | a == b -> elem m (allExtendsPlus env n)
- || elem n (allExtendsPlus env m)
- (QC m a, Q n b) | a == b -> elem m (allExtendsPlus env n)
- || elem n (allExtendsPlus env m)
- (Q m a, QC n b) | a == b -> elem m (allExtendsPlus env n)
- || elem n (allExtendsPlus env m)
-
- (Table a b, Table c d) -> alpha g a c && alpha g b d
- (Vr x, Vr y) -> x == y || elem (x,y) g || elem (y,x) g
- _ -> t == u
- --- the following should be one-way coercions only. AR 4/1/2001
- || elem t sTypes && elem u sTypes
- || (t == typeType && u == typePType)
- || (u == typeType && t == typePType)
-
- missingLock g t u = case (t,u) of
- (RecType rs, RecType ts) ->
- let
- ls = [l | (l,a) <- rs,
- not (any (\ (k,b) -> alpha g a b && l == k) ts)]
- (locks,others) = partition isLockLabel ls
- in case others of
- _:_ -> Bad $ "missing record fields" +++ unwords (map prt others)
- _ -> return locks
- -- contravariance
- (Prod x a b, Prod y c d) -> do
- ls1 <- missingLock g c a
- ls2 <- missingLock g b d
- return $ ls1 ++ ls2
-
- _ -> Bad ""
-
- sTypes = [typeStr, typeTok, typeString]
- comp = computeLType env
-
--- printing a type with a lock field lock_C as C
-prtType :: LTEnv -> Type -> String
-prtType env ty = case ty of
- RecType fs -> case filter isLockLabel $ map fst fs of
- [lock] -> (drop 5 $ prt lock) --- ++++ "Full form" +++ prt ty
- _ -> prtt ty
- Prod x a b -> prtType env a +++ "->" +++ prtType env b
- _ -> prtt ty
- where
- prtt t = prt t
- ---- use computeLType gr to check if really equal to the cat with lock
-
-
--- | linearization types and defaults
-linTypeOfType :: SourceGrammar -> Ident -> Type -> Check (Context,Type)
-linTypeOfType cnc m typ = do
- (cont,cat) <- checkErr $ typeSkeleton typ
- val <- lookLin cat
- args <- mapM mkLinArg (zip [0..] cont)
- return (args, val)
- where
- mkLinArg (i,(n,mc@(m,cat))) = do
- val <- lookLin mc
- let vars = mkRecType varLabel $ replicate n typeStr
- symb = argIdent n cat i
- rec <- if n==0 then return val else
- checkErr $ errIn ("extending" +++ prt vars +++ "with" +++ prt val) $
- plusRecType vars val
- return (symb,rec)
- lookLin (_,c) = checks [ --- rather: update with defLinType ?
- checkErr (lookupLincat cnc m c) >>= computeLType cnc
- ,return defLinType
- ]
-
--- | dependency check, detecting circularities and returning topo-sorted list
-
-allOperDependencies :: Ident -> BinTree Ident Info -> [(Ident,[Ident])]
-allOperDependencies m = allDependencies (==m)
-
-allDependencies :: (Ident -> Bool) -> BinTree Ident Info -> [(Ident,[Ident])]
-allDependencies ism b =
- [(f, nub (concatMap opty (pts i))) | (f,i) <- tree2list b]
- where
- opersIn t = case t of
- Q n c | ism n -> [c]
- QC n c | ism n -> [c]
- _ -> collectOp opersIn t
- opty (Yes ty) = opersIn ty
- opty _ = []
- pts i = case i of
- ResOper pty pt -> [pty,pt]
- ResParam (Yes (ps,_)) -> [Yes t | (_,cont) <- ps, (_,t) <- cont]
- CncCat pty _ _ -> [pty]
- CncFun _ pt _ -> [pt] ---- (Maybe (Ident,(Context,Type))
- AbsFun pty ptr -> [pty] --- ptr is def, which can be mutual
- AbsCat (Yes co) _ -> [Yes ty | (_,ty) <- co]
- _ -> []
-
-topoSortOpers :: [(Ident,[Ident])] -> Err [Ident]
-topoSortOpers st = do
- let eops = topoTest st
- either
- return
- (\ops -> Bad ("circular definitions:" +++ unwords (map prt (head ops))))
- eops
diff --git a/src-3.0/GF/Compile/Compute.hs b/src-3.0/GF/Compile/Compute.hs
deleted file mode 100644
index f35e7c6a9..000000000
--- a/src-3.0/GF/Compile/Compute.hs
+++ /dev/null
@@ -1,429 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : Compute
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/11/01 15:39:12 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.19 $
---
--- Computation of source terms. Used in compilation and in @cc@ command.
------------------------------------------------------------------------------
-
-module GF.Compile.Compute (computeConcrete, computeTerm,computeConcreteRec) where
-
-import GF.Data.Operations
-import GF.Grammar.Grammar
-import GF.Infra.Ident
-import GF.Infra.Option
-import GF.Data.Str
-import GF.Grammar.PrGrammar
-import GF.Infra.Modules
-import GF.Grammar.Predef
-import GF.Grammar.Macros
-import GF.Grammar.Lookup
-import GF.Compile.Refresh
-import GF.Grammar.PatternMatch
-import GF.Grammar.Lockfield (isLockLabel) ----
-
-import GF.Grammar.AppPredefined
-
-import Data.List (nub,intersperse)
-import Control.Monad (liftM2, liftM)
-
--- | computation of concrete syntax terms into normal form
--- used mainly for partial evaluation
-computeConcrete :: SourceGrammar -> Term -> Err Term
-computeConcrete g t = {- refreshTerm t >>= -} computeTerm g [] t
-computeConcreteRec g t = {- refreshTerm t >>= -} computeTermOpt True g [] t
-
-computeTerm :: SourceGrammar -> Substitution -> Term -> Err Term
-computeTerm = computeTermOpt False
-
--- rec=True is used if it cannot be assumed that looked-up constants
--- have already been computed (mainly with -optimize=noexpand in .gfr)
-
-computeTermOpt :: Bool -> SourceGrammar -> Substitution -> Term -> Err Term
-computeTermOpt rec gr = comput True where
-
- comput full g t = ---- errIn ("subterm" +++ prt t) $ --- for debugging
- case t of
-
- Q p c | p == cPredef -> return t
- | otherwise -> look p c
-
- -- if computed do nothing
- Computed t' -> return $ unComputed t'
-
- Vr x -> do
- t' <- maybe (prtBad ("no value given to variable") x) return $ lookup x g
- case t' of
- _ | t == t' -> return t
- _ -> comp g t'
-
- -- Abs x@(IA _) b -> do
- Abs x b | full -> do
- let (xs,b1) = termFormCnc t
- b' <- comp ([(x,Vr x) | x <- xs] ++ g) b1
- return $ mkAbs xs b'
- -- b' <- comp (ext x (Vr x) g) b
- -- return $ Abs x b'
- Abs _ _ -> return t -- hnf
-
- Let (x,(_,a)) b -> do
- a' <- comp g a
- comp (ext x a' g) b
-
- Prod x a b -> do
- a' <- comp g a
- b' <- comp (ext x (Vr x) g) b
- return $ Prod x a' b'
-
- -- beta-convert
- App f a -> case appForm t of
- (h,as) | length as > 1 -> do
- h' <- hnf g h
- as' <- mapM (comp g) as
- case h' of
- _ | not (null [() | FV _ <- as']) -> compApp g (mkApp h' as')
- c@(QC _ _) -> do
- return $ mkApp c as'
- Q mod f | mod == cPredef -> do
- (t',b) <- appPredefined (mkApp h' as')
- if b then return t' else comp g t'
-
- Abs _ _ -> do
- let (xs,b) = termFormCnc h'
- let g' = (zip xs as') ++ g
- let as2 = drop (length xs) as'
- let xs2 = drop (length as') xs
- b' <- comp g' (mkAbs xs2 b)
- if null as2 then return b' else comp g (mkApp b' as2)
-
- _ -> compApp g (mkApp h' as')
- _ -> compApp g t
-
- P t l | isLockLabel l -> return $ R []
- ---- a workaround 18/2/2005: take this away and find the reason
- ---- why earlier compilation destroys the lock field
-
-
- P t l -> do
- t' <- comp g t
- case t' of
- FV rs -> mapM (\c -> comp g (P c l)) rs >>= returnC . variants
- R r -> maybe (prtBad "no value for label" l) (comp g . snd) $
- lookup l $ reverse r
-
- ExtR a (R b) ->
- case comp g (P (R b) l) of
- Ok v -> return v
- _ -> comp g (P a l)
-
---- { - --- this is incorrect, since b can contain the proper value
- ExtR (R a) b -> -- NOT POSSIBLE both a and b records!
- case comp g (P (R a) l) of
- Ok v -> return v
- _ -> comp g (P b l)
---- - } ---
-
- S (T i cs) e -> prawitz g i (flip P l) cs e
- S (V i cs) e -> prawitzV g i (flip P l) cs e
-
- _ -> returnC $ P t' l
-
- PI t l i -> comp g $ P t l -----
-
- S t v -> do
- t' <- compTable g t
- v' <- comp g v
- t1 <- case t' of
----- V (RecType fs) _ -> uncurrySelect g fs t' v'
----- T (TComp (RecType fs)) _ -> uncurrySelect g fs t' v'
- _ -> return $ S t' v'
- compSelect g t1
-
- -- normalize away empty tokens
- K "" -> return Empty
-
- -- glue if you can
- Glue x0 y0 -> do
- x <- comp g x0
- y <- comp g y0
- case (x,y) of
- (FV ks,_) -> do
- kys <- mapM (comp g . flip Glue y) ks
- return $ variants kys
- (_,FV ks) -> do
- xks <- mapM (comp g . Glue x) ks
- return $ variants xks
-
- (S (T i cs) e, s) -> prawitz g i (flip Glue s) cs e
- (s, S (T i cs) e) -> prawitz g i (Glue s) cs e
- (S (V i cs) e, s) -> prawitzV g i (flip Glue s) cs e
- (s, S (V i cs) e) -> prawitzV g i (Glue s) cs e
- (_,Empty) -> return x
- (Empty,_) -> return y
- (K a, K b) -> return $ K (a ++ b)
- (_, Alts (d,vs)) -> do
----- (K a, Alts (d,vs)) -> do
- let glx = Glue x
- comp g $ Alts (glx d, [(glx v,c) | (v,c) <- vs])
- (Alts _, ka) -> checks [do
- y' <- strsFromTerm ka
----- (Alts _, K a) -> checks [do
- x' <- strsFromTerm x -- this may fail when compiling opers
- return $ variants [
- foldr1 C (map K (str2strings (glueStr v u))) | v <- x', u <- y']
----- foldr1 C (map K (str2strings (glueStr v (str a)))) | v <- x']
- ,return $ Glue x y
- ]
- (C u v,_) -> comp g $ C u (Glue v y)
-
- _ -> do
- mapM_ checkNoArgVars [x,y]
- r <- composOp (comp g) t
- returnC r
-
- Alts _ -> do
- r <- composOp (comp g) t
- returnC r
-
- -- remove empty
- C a b -> do
- a' <- comp g a
- b' <- comp g b
- case (a',b') of
- (Alts _, K a) -> checks [do
- as <- strsFromTerm a' -- this may fail when compiling opers
- return $ variants [
- foldr1 C (map K (str2strings (plusStr v (str a)))) | v <- as]
- ,
- return $ C a' b'
- ]
- (Empty,_) -> returnC b'
- (_,Empty) -> returnC a'
- _ -> returnC $ C a' b'
-
- -- reduce free variation as much as you can
- FV ts -> mapM (comp g) ts >>= returnC . variants
-
- -- merge record extensions if you can
- ExtR r s -> do
- r' <- comp g r
- s' <- comp g s
- case (r',s') of
- (R rs, R ss) -> plusRecord r' s'
- (RecType rs, RecType ss) -> plusRecType r' s'
- _ -> return $ ExtR r' s'
-
- T _ _ -> compTable g t
- V _ _ -> compTable g t
-
- -- otherwise go ahead
- _ -> composOp (comp g) t >>= returnC
-
- where
-
- compApp g (App f a) = do
- f' <- hnf g f
- a' <- comp g a
- case (f',a') of
- (Abs x b, FV as) ->
- mapM (\c -> comp (ext x c g) b) as >>= return . variants
- (_, FV as) -> mapM (\c -> comp g (App f' c)) as >>= return . variants
- (FV fs, _) -> mapM (\c -> comp g (App c a')) fs >>= return . variants
- (Abs x b,_) -> comp (ext x a' g) b
-
- (QC _ _,_) -> returnC $ App f' a'
-
- (S (T i cs) e,_) -> prawitz g i (flip App a') cs e
- (S (V i cs) e,_) -> prawitzV g i (flip App a') cs e
-
- _ -> do
- (t',b) <- appPredefined (App f' a')
- if b then return t' else comp g t'
-
- hnf = comput False
- comp = comput True
-
- look p c
- | rec = lookupResDef gr p c >>= comp []
- | otherwise = lookupResDef gr p c
-
- ext x a g = (x,a):g
-
- returnC = return --- . computed
-
- variants ts = case nub ts of
- [t] -> t
- ts -> FV ts
-
- isCan v = case v of
- Con _ -> True
- QC _ _ -> True
- App f a -> isCan f && isCan a
- R rs -> all (isCan . snd . snd) rs
- _ -> False
-
- compPatternMacro p = case p of
- PM m c -> case look m c of
- Ok (EPatt p') -> compPatternMacro p'
- _ -> prtBad "pattern expected as value of" p ---- should be in CheckGr
- PAs x p -> do
- p' <- compPatternMacro p
- return $ PAs x p'
- PAlt p q -> do
- p' <- compPatternMacro p
- q' <- compPatternMacro q
- return $ PAlt p' q'
- PSeq p q -> do
- p' <- compPatternMacro p
- q' <- compPatternMacro q
- return $ PSeq p' q'
- PRep p -> do
- p' <- compPatternMacro p
- return $ PRep p'
- PNeg p -> do
- p' <- compPatternMacro p
- return $ PNeg p'
- PR rs -> do
- rs' <- mapPairsM compPatternMacro rs
- return $ PR rs'
-
- _ -> return p
-
- compSelect g (S t' v') = case v' of
- FV vs -> mapM (\c -> comp g (S t' c)) vs >>= returnC . variants
- _ -> case t' of
- FV ccs -> mapM (\c -> comp g (S c v')) ccs >>= returnC . variants
-
- T _ [(PV IW,c)] -> comp g c --- an optimization
- T _ [(PT _ (PV IW),c)] -> comp g c
-
- T _ [(PV z,c)] -> comp (ext z v' g) c --- another optimization
- T _ [(PT _ (PV z),c)] -> comp (ext z v' g) c
-
- -- course-of-values table: look up by index, no pattern matching needed
- V ptyp ts -> do
- vs <- allParamValues gr ptyp
- case lookup v' (zip vs [0 .. length vs - 1]) of
- Just i -> comp g $ ts !! i
- _ -> return $ S t' v' -- if v' is not canonical
- T _ cc -> case matchPattern cc v' of
- Ok (c,g') -> comp (g' ++ g) c
- _ | isCan v' -> prtBad ("missing case" +++ prt v' +++ "in") t
- _ -> return $ S t' v' -- if v' is not canonical
-
- S (T i cs) e -> prawitz g i (flip S v') cs e
- S (V i cs) e -> prawitzV g i (flip S v') cs e
- _ -> returnC $ S t' v'
-
- -- case-expand tables
- -- if already expanded, don't expand again
- compTable g t = case t of
- T i@(TComp ty) cs -> do
- -- if there are no variables, don't even go inside
- cs' <- if (null g) then return cs else mapPairsM (comp g) cs
----- return $ V ty (map snd cs')
- return $ T i cs'
- V ty cs -> do
- ty' <- comp g ty
- -- if there are no variables, don't even go inside
- cs' <- if (null g) then return cs else mapM (comp g) cs
- return $ V ty' cs'
-
- T i cs -> do
- pty0 <- getTableType i
- ptyp <- comp g pty0
- case allParamValues gr ptyp of
- Ok vs -> do
-
- ps0 <- mapM (compPatternMacro . fst) cs
- cs' <- mapM (compBranchOpt g) (zip ps0 (map snd cs))
- sts <- mapM (matchPattern cs') vs
- ts <- mapM (\ (c,g') -> comp (g' ++ g) c) sts
- ps <- mapM term2patt vs
- let ps' = ps --- PT ptyp (head ps) : tail ps
----- return $ V ptyp ts -- to save space, just course of values
- return $ T (TComp ptyp) (zip ps' ts)
- _ -> do
- cs' <- mapM (compBranch g) cs
- return $ T i cs' -- happens with variable types
- _ -> comp g t
-
- compBranch g (p,v) = do
- let g' = contP p ++ g
- v' <- comp g' v
- return (p,v')
-
- compBranchOpt g c@(p,v) = case contP p of
- [] -> return c
- _ -> err (const (return c)) return $ compBranch g c
-
- contP p = case p of
- PV x -> [(x,Vr x)]
- PC _ ps -> concatMap contP ps
- PP _ _ ps -> concatMap contP ps
- PT _ p -> contP p
- PR rs -> concatMap (contP . snd) rs
-
- PAs x p -> (x,Vr x) : contP p
-
- PSeq p q -> concatMap contP [p,q]
- PAlt p q -> concatMap contP [p,q]
- PRep p -> contP p
- PNeg p -> contP p
-
- _ -> []
-
- prawitz g i f cs e = do
- cs' <- mapM (compBranch g) [(p, f v) | (p,v) <- cs]
- return $ S (T i cs') e
- prawitzV g i f cs e = do
- cs' <- mapM (comp g) [(f v) | v <- cs]
- return $ S (V i cs') e
-
-{- ----
- uncurrySelect g fs t v = do
- ts <- mapM (allParamValues gr . snd) fs
- vs <- mapM (comp g) [P v r | r <- map fst fs]
- return $ reorderSelect t fs ts vs
-
- reorderSelect t fs pss vs = case (t,fs,pss,vs) of
- (V _ ts, f:fs1, ps:pss1, v:vs1) ->
- S (V (snd f)
- [reorderSelect (V (RecType fs1) t) fs1 pss1 vs1 |
- t <- segments (length ts `div` length ps) ts]) v
- (T (TComp _) cs, f:fs1, ps:pss1, v:vs1) ->
- S (T (TComp (snd f))
- [(p,reorderSelect (T (TComp (RecType fs1)) c) fs1 pss1 vs1) |
- (ep,c) <- zip ps (segments (length cs `div` length ps) cs),
- let Ok p = term2patt ep]) v
- _ -> t
-
- segments i xs =
- let (x0,xs1) = splitAt i xs in x0 : takeWhile (not . null) (segments i xs1)
--}
-
-
--- | argument variables cannot be glued
-checkNoArgVars :: Term -> Err Term
-checkNoArgVars t = case t of
- Vr (IA _ _) -> Bad $ glueErrorMsg $ prt t
- Vr (IAV _ _ _) -> Bad $ glueErrorMsg $ prt t
- _ -> composOp checkNoArgVars t
-
-glueErrorMsg s =
- "Cannot glue (+) term with run-time variable" +++ s ++ "." ++++
- "Use Prelude.bind instead."
-
-getArgType t = case t of
- V ty _ -> return ty
- T (TComp ty) _ -> return ty
- _ -> prtBad "cannot get argument type of table" t
-
-
-
diff --git a/src-3.0/GF/Compile/Export.hs b/src-3.0/GF/Compile/Export.hs
deleted file mode 100644
index 9e9a99e99..000000000
--- a/src-3.0/GF/Compile/Export.hs
+++ /dev/null
@@ -1,61 +0,0 @@
-module GF.Compile.Export where
-
-import PGF.CId
-import PGF.Data (PGF(..))
-import PGF.Raw.Print (printTree)
-import PGF.Raw.Convert (fromPGF)
-import GF.Compile.GFCCtoHaskell
-import GF.Compile.GFCCtoJS
-import GF.Infra.Option
-import GF.Speech.CFG
-import GF.Speech.PGFToCFG
-import GF.Speech.SRGS_XML
-import GF.Speech.JSGF
-import GF.Speech.GSL
-import GF.Speech.VoiceXML
-import GF.Speech.SLF
-import GF.Speech.PrRegExp
-import GF.Text.UTF8
-
-import Data.Maybe
-import System.FilePath
-
--- top-level access to code generation
-
-exportPGF :: Options
- -> OutputFormat
- -> PGF
- -> [(FilePath,String)] -- ^ List of recommended file names and contents.
-exportPGF opts fmt pgf =
- case fmt of
- FmtPGF -> multi "pgf" printPGF
- FmtJavaScript -> multi "js" pgf2js
- FmtHaskell -> multi "hs" (grammar2haskell name)
- FmtHaskell_GADT -> multi "hs" (grammar2haskellGADT name)
- FmtBNF -> single "bnf" bnfPrinter
- FmtSRGS_XML -> single "grxml" (srgsXmlPrinter sisr)
- FmtJSGF -> single "jsgf" (jsgfPrinter sisr)
- FmtGSL -> single "gsl" gslPrinter
- FmtVoiceXML -> single "vxml" grammar2vxml
- FmtSLF -> single ".slf" slfPrinter
- FmtRegExp -> single ".rexp" regexpPrinter
- FmtFA -> single ".dot" slfGraphvizPrinter
- where
- name = fromMaybe (prCId (absname pgf)) (moduleFlag optName opts)
- sisr = flag optSISR opts
-
- multi :: String -> (PGF -> String) -> [(FilePath,String)]
- multi ext pr = [(name <.> ext, pr pgf)]
-
- single :: String -> (PGF -> CId -> String) -> [(FilePath,String)]
- single ext pr = [(prCId cnc <.> ext, pr pgf cnc) | cnc <- cncnames pgf]
-
--- | Get the name of the concrete syntax to generate output from.
--- FIXME: there should be an option to change this.
-outputConcr :: PGF -> CId
-outputConcr pgf = case cncnames pgf of
- [] -> error "No concrete syntax."
- cnc:_ -> cnc
-
-printPGF :: PGF -> String
-printPGF = encodeUTF8 . printTree . fromPGF
diff --git a/src-3.0/GF/Compile/Extend.hs b/src-3.0/GF/Compile/Extend.hs
deleted file mode 100644
index 8344a1696..000000000
--- a/src-3.0/GF/Compile/Extend.hs
+++ /dev/null
@@ -1,138 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : Extend
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/05/30 21:08:14 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.18 $
---
--- AR 14\/5\/2003 -- 11\/11
---
--- The top-level function 'extendModule'
--- extends a module symbol table by indirections to the module it extends
------------------------------------------------------------------------------
-
-module GF.Compile.Extend (extendModule, extendMod
- ) where
-
-import GF.Grammar.Grammar
-import GF.Infra.Ident
-import GF.Grammar.PrGrammar
-import GF.Infra.Modules
-import GF.Compile.Update
-import GF.Grammar.Macros
-import GF.Data.Operations
-
-import Control.Monad
-
-extendModule :: [SourceModule] -> SourceModule -> Err SourceModule
-extendModule ms (name,mod) = case mod of
-
- ---- Just to allow inheritance in incomplete concrete (which are not
- ---- compiled anyway), extensions are not built for them.
- ---- Should be replaced by real control. AR 4/2/2005
- ModMod m | mstatus m == MSIncomplete && isModCnc m -> return (name,mod)
-
- ModMod m -> do
- mod' <- foldM extOne m (extend m)
- return (name,ModMod mod')
- where
- extOne mo (n,cond) = do
- (m0,isCompl) <- do
- m <- lookupModMod (MGrammar ms) n
-
- -- test that the module types match, and find out if the old is complete
- testErr (sameMType (mtype m) (mtype mo))
- ("illegal extension type to module" +++ prt name)
- return (m, isCompleteModule m)
-
- -- build extension in a way depending on whether the old module is complete
- js1 <- extendMod isCompl (n, isInherited cond) name (jments m0) (jments mo)
-
- -- if incomplete, throw away extension information
- let es = extend mo
- let es' = if isCompl then es else (filter ((/=n) . fst) es)
- return $ mo {extend = es', jments = js1}
-
--- | When extending a complete module: new information is inserted,
--- and the process is interrupted if unification fails.
--- If the extended module is incomplete, its judgements are just copied.
-extendMod :: Bool -> (Ident,Ident -> Bool) -> Ident ->
- BinTree Ident Info -> BinTree Ident Info ->
- Err (BinTree Ident Info)
-extendMod isCompl (name,cond) base old new = foldM try new $ tree2list old where
- try t i@(c,_) | not (cond c) = return t
- try t i@(c,_) = errIn ("constant" +++ prt c) $
- tryInsert (extendAnyInfo isCompl name base) indirIf t i
- indirIf = if isCompl then indirInfo name else id
-
-indirInfo :: Ident -> Info -> Info
-indirInfo n info = AnyInd b n' where
- (b,n') = case info of
- ResValue _ -> (True,n)
- ResParam _ -> (True,n)
- AbsFun _ (Yes EData) -> (True,n)
- AnyInd b k -> (b,k)
- _ -> (False,n) ---- canonical in Abs
-
-perhIndir :: Ident -> Perh a -> Perh a
-perhIndir n p = case p of
- Yes _ -> May n
- _ -> p
-
-extendAnyInfo :: Bool -> Ident -> Ident -> Info -> Info -> Err Info
-extendAnyInfo isc n o i j =
- errIn ("building extension for" +++ prt n +++ "in" +++ prt o) $ case (i,j) of
- (AbsCat mc1 mf1, AbsCat mc2 mf2) ->
- liftM2 AbsCat (updn isc n mc1 mc2) (updn isc n mf1 mf2) --- add cstrs
- (AbsFun mt1 md1, AbsFun mt2 md2) ->
- liftM2 AbsFun (updn isc n mt1 mt2) (updn isc n md1 md2) --- add defs
- (ResParam mt1, ResParam mt2) ->
- liftM ResParam $ updn isc n mt1 mt2
- (ResValue mt1, ResValue mt2) ->
- liftM ResValue $ updn isc n mt1 mt2
- (_, ResOverload ms t) | elem n ms ->
- return $ ResOverload ms t
- (ResOper mt1 m1, ResOper mt2 m2) -> ---- extendResOper n mt1 m1 mt2 m2
- liftM2 ResOper (updn isc n mt1 mt2) (updn isc n m1 m2)
- (CncCat mc1 mf1 mp1, CncCat mc2 mf2 mp2) ->
- liftM3 CncCat (updn isc n mc1 mc2) (updn isc n mf1 mf2) (updn isc n mp1 mp2)
- (CncFun m mt1 md1, CncFun _ mt2 md2) ->
- liftM2 (CncFun m) (updn isc n mt1 mt2) (updn isc n md1 md2)
-
----- (AnyInd _ _, ResOper _ _) -> return j ----
-
- (AnyInd b1 m1, AnyInd b2 m2) -> do
- testErr (b1 == b2) "inconsistent indirection status"
----- commented out as work-around for a spurious problem in
----- TestResourceFre; should look at building of completion. 17/11/2004
- testErr (m1 == m2) $
- "different sources of indirection: " +++ show m1 +++ show m2
- return i
-
- _ -> Bad $ "cannot unify information in" ++++ show i ++++ "and" ++++ show j
-
---- where
-
-updn isc n = if isc then (updatePerhaps n) else (updatePerhapsHard n)
-updc isc n = if True then (updatePerhaps n) else (updatePerhapsHard n)
-
-
-
-{- ---- no more needed: this is done in Rebuild
--- opers declared in an interface and defined in an instance are a special case
-
-extendResOper n mt1 m1 mt2 m2 = case (m1,m2) of
- (Nope,_) -> return $ ResOper (strip mt1) m2
- _ -> liftM2 ResOper (updatePerhaps n mt1 mt2) (updatePerhaps n m1 m2)
- where
- strip (Yes t) = Yes $ strp t
- strip m = m
- strp t = case t of
- Q _ c -> Vr c
- QC _ c -> Vr c
- _ -> composSafeOp strp t
--}
diff --git a/src-3.0/GF/Compile/GFCCtoHaskell.hs b/src-3.0/GF/Compile/GFCCtoHaskell.hs
deleted file mode 100644
index 59db9c364..000000000
--- a/src-3.0/GF/Compile/GFCCtoHaskell.hs
+++ /dev/null
@@ -1,213 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : GFCCtoHaskell
--- Maintainer : Aarne Ranta
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/06/17 12:39:07 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.8 $
---
--- to write a GF abstract grammar into a Haskell module with translations from
--- data objects into GF trees. Example: GSyntax for Agda.
--- AR 11/11/1999 -- 7/12/2000 -- 18/5/2004
------------------------------------------------------------------------------
-
-module GF.Compile.GFCCtoHaskell (grammar2haskell, grammar2haskellGADT) where
-
-import PGF.CId
-import PGF.Data
-import PGF.Macros
-
-import GF.Data.Operations
-import GF.Text.UTF8
-
-import Data.List --(isPrefixOf, find, intersperse)
-import qualified Data.Map as Map
-
--- | the main function
-grammar2haskell :: String -- ^ Module name.
- -> PGF
- -> String
-grammar2haskell name gr = encodeUTF8 $ foldr (++++) [] $
- haskPreamble name ++ [datatypes gr', gfinstances gr']
- where gr' = hSkeleton gr
-
-grammar2haskellGADT :: String -> PGF -> String
-grammar2haskellGADT name gr = encodeUTF8 $ foldr (++++) [] $
- ["{-# OPTIONS_GHC -fglasgow-exts #-}"] ++
- haskPreamble name ++ [datatypesGADT gr', gfinstances gr']
- where gr' = hSkeleton gr
-
--- | by this you can prefix all identifiers with stg; the default is 'G'
-gId :: OIdent -> OIdent
-gId i = 'G':i
-
-haskPreamble name =
- [
- "module " ++ name ++ " where",
- "",
- "import PGF",
- "----------------------------------------------------",
- "-- automatic translation from GF to Haskell",
- "----------------------------------------------------",
- "",
- "class Gf a where",
- " gf :: a -> Tree",
- " fg :: Tree -> a",
- "",
- predefInst "GString" "String" "Lit (LStr s)",
- "",
- predefInst "GInt" "Integer" "Lit (LInt s)",
- "",
- predefInst "GFloat" "Double" "Lit (LFlt s)",
- "",
- "----------------------------------------------------",
- "-- below this line machine-generated",
- "----------------------------------------------------",
- ""
- ]
-
-predefInst gtyp typ patt =
- "newtype" +++ gtyp +++ "=" +++ gtyp +++ typ +++ " deriving Show" +++++
- "instance Gf" +++ gtyp +++ "where" ++++
- " gf (" ++ gtyp +++ "s) =" +++ patt ++++
- " fg t =" ++++
- " case t of" ++++
- " " +++ patt +++ " ->" +++ gtyp +++ "s" ++++
- " _ -> error (\"no" +++ gtyp +++ "\" ++ show t)"
-
-type OIdent = String
-
-type HSkeleton = [(OIdent, [(OIdent, [OIdent])])]
-
-datatypes, gfinstances :: (String,HSkeleton) -> String
-datatypes = (foldr (+++++) "") . (filter (/="")) . (map hDatatype) . snd
-gfinstances (m,g) = (foldr (+++++) "") $ (filter (/="")) $ (map (gfInstance m)) g
-
-hDatatype :: (OIdent, [(OIdent, [OIdent])]) -> String
-gfInstance :: String -> (OIdent, [(OIdent, [OIdent])]) -> String
-
-hDatatype ("Cn",_) = "" ---
-hDatatype (cat,[]) = ""
-hDatatype (cat,rules) | isListCat (cat,rules) =
- "newtype" +++ gId cat +++ "=" +++ gId cat +++ "[" ++ gId (elemCat cat) ++ "]"
- +++ "deriving Show"
-hDatatype (cat,rules) =
- "data" +++ gId cat +++ "=" ++
- (if length rules == 1 then "" else "\n ") +++
- foldr1 (\x y -> x ++ "\n |" +++ y)
- [gId f +++ foldr (+++) "" (map gId xx) | (f,xx) <- rules] ++++
- " deriving Show"
-
--- GADT version of data types
-datatypesGADT :: (String,HSkeleton) -> String
-datatypesGADT (_,skel) =
- unlines (concatMap hCatTypeGADT skel)
- +++++
- "data Tree :: * -> * where" ++++ unlines (concatMap (map (" "++) . hDatatypeGADT) skel)
-
-hCatTypeGADT :: (OIdent, [(OIdent, [OIdent])]) -> [String]
-hCatTypeGADT (cat,rules)
- = ["type"+++gId cat+++"="+++"Tree"+++gId cat++"_",
- "data"+++gId cat++"_"]
-
-hDatatypeGADT :: (OIdent, [(OIdent, [OIdent])]) -> [String]
-hDatatypeGADT (cat, rules)
- | isListCat (cat,rules) = [gId cat+++"::"+++"["++gId (elemCat cat)++"]" +++ "->" +++ t]
- | otherwise =
- [ gId f +++ "::" +++ concatMap (\a -> gId a +++ "-> ") args ++ t | (f,args) <- rules ]
- where t = "Tree" +++ gId cat ++ "_"
-
-gfInstance m crs = hInstance m crs ++++ fInstance m crs
-
-----hInstance m ("Cn",_) = "" --- seems to belong to an old applic. AR 18/5/2004
-hInstance m (cat,[]) = ""
-hInstance m (cat,rules)
- | isListCat (cat,rules) =
- "instance Gf" +++ gId cat +++ "where" ++++
- " gf (" ++ gId cat +++ "[" ++ concat (intersperse "," baseVars) ++ "])"
- +++ "=" +++ mkRHS ("Base"++ec) baseVars ++++
- " gf (" ++ gId cat +++ "(x:xs)) = "
- ++ mkRHS ("Cons"++ec) ["x",prParenth (gId cat+++"xs")]
--- no show for GADTs
--- ++++ " gf (" ++ gId cat +++ "xs) = error (\"Bad " ++ cat ++ " value: \" ++ show xs)"
- | otherwise =
- "instance Gf" +++ gId cat +++ "where\n" ++
- unlines [mkInst f xx | (f,xx) <- rules]
- where
- ec = elemCat cat
- baseVars = mkVars (baseSize (cat,rules))
- mkInst f xx = let xx' = mkVars (length xx) in " gf " ++
- (if length xx == 0 then gId f else prParenth (gId f +++ foldr1 (+++) xx')) +++
- "=" +++ mkRHS f xx'
- mkVars n = ["x" ++ show i | i <- [1..n]]
- mkRHS f vars = "Fun (mkCId \"" ++ f ++ "\")" +++
- "[" ++ prTList ", " ["gf" +++ x | x <- vars] ++ "]"
-
-
-----fInstance m ("Cn",_) = "" ---
-fInstance m (cat,[]) = ""
-fInstance m (cat,rules) =
- " fg t =" ++++
- " case t of" ++++
- unlines [mkInst f xx | (f,xx) <- rules] ++++
- " _ -> error (\"no" +++ cat ++ " \" ++ show t)"
- where
- mkInst f xx =
- " Fun i " ++
- "[" ++ prTList "," xx' ++ "]" +++
- "| i == mkCId \"" ++ f ++ "\" ->" +++ mkRHS f xx'
- where xx' = ["x" ++ show i | (_,i) <- zip xx [1..]]
- mkRHS f vars
- | isListCat (cat,rules) =
- if "Base" `isPrefixOf` f then
- gId cat +++ "[" ++ prTList ", " [ "fg" +++ x | x <- vars ] ++ "]"
- else
- let (i,t) = (init vars,last vars)
- in "let" +++ gId cat +++ "xs = fg " ++ t +++ "in" +++
- gId cat +++ prParenth (prTList ":" (["fg"+++v | v <- i] ++ ["xs"]))
- | otherwise =
- gId f +++
- prTList " " [prParenth ("fg" +++ x) | x <- vars]
-
-
---type HSkeleton = [(OIdent, [(OIdent, [OIdent])])]
-hSkeleton :: PGF -> (String,HSkeleton)
-hSkeleton gr =
- (prCId (absname gr),
- [(prCId c, [(prCId f, map prCId cs) | (f, (cs,_)) <- fs]) |
- fs@((_, (_,c)):_) <- fns]
- )
- where
- fns = groupBy valtypg (sortBy valtyps (map jty (Map.assocs (funs (abstract gr)))))
- valtyps (_, (_,x)) (_, (_,y)) = compare x y
- valtypg (_, (_,x)) (_, (_,y)) = x == y
- jty (f,(ty,_)) = (f,catSkeleton ty)
-
-updateSkeleton :: OIdent -> HSkeleton -> (OIdent, [OIdent]) -> HSkeleton
-updateSkeleton cat skel rule =
- case skel of
- (cat0,rules):rr | cat0 == cat -> (cat0, rule:rules) : rr
- (cat0,rules):rr -> (cat0, rules) : updateSkeleton cat rr rule
-
-isListCat :: (OIdent, [(OIdent, [OIdent])]) -> Bool
-isListCat (cat,rules) = "List" `isPrefixOf` cat && length rules == 2
- && ("Base"++c) `elem` fs && ("Cons"++c) `elem` fs
- where c = elemCat cat
- fs = map fst rules
-
--- | Gets the element category of a list category.
-elemCat :: OIdent -> OIdent
-elemCat = drop 4
-
-isBaseFun :: OIdent -> Bool
-isBaseFun f = "Base" `isPrefixOf` f
-
-isConsFun :: OIdent -> Bool
-isConsFun f = "Cons" `isPrefixOf` f
-
-baseSize :: (OIdent, [(OIdent, [OIdent])]) -> Int
-baseSize (_,rules) = length bs
- where Just (_,bs) = find (("Base" `isPrefixOf`) . fst) rules
diff --git a/src-3.0/GF/Compile/GFCCtoJS.hs b/src-3.0/GF/Compile/GFCCtoJS.hs
deleted file mode 100644
index 8259e7385..000000000
--- a/src-3.0/GF/Compile/GFCCtoJS.hs
+++ /dev/null
@@ -1,117 +0,0 @@
-module GF.Compile.GFCCtoJS (pgf2js) where
-
-import PGF.CId
-import PGF.Data
-import qualified PGF.Macros as M
-import qualified GF.JavaScript.AbsJS as JS
-import qualified GF.JavaScript.PrintJS as JS
-
-import GF.Text.UTF8
-import GF.Data.ErrM
-import GF.Infra.Option
-
-import Control.Monad (mplus)
-import Data.Array (Array)
-import qualified Data.Array as Array
-import Data.Maybe (fromMaybe)
-import qualified Data.Map as Map
-
-pgf2js :: PGF -> String
-pgf2js pgf =
- encodeUTF8 $ JS.printTree $ JS.Program [JS.ElStmt $ JS.SDeclOrExpr $ JS.Decl [JS.DInit (JS.Ident n) grammar]]
- where
- n = prCId $ absname pgf
- as = abstract pgf
- cs = Map.assocs (concretes pgf)
- start = M.lookStartCat pgf
- grammar = new "GFGrammar" [js_abstract, js_concrete]
- js_abstract = abstract2js start as
- js_concrete = JS.EObj $ map (concrete2js start n) cs
-
-abstract2js :: String -> Abstr -> JS.Expr
-abstract2js start ds = new "GFAbstract" [JS.EStr start, JS.EObj $ map absdef2js (Map.assocs (funs ds))]
-
-absdef2js :: (CId,(Type,Expr)) -> JS.Property
-absdef2js (f,(typ,_)) =
- let (args,cat) = M.catSkeleton typ in
- JS.Prop (JS.IdentPropName (JS.Ident (prCId f))) (new "Type" [JS.EArray [JS.EStr (prCId x) | x <- args], JS.EStr (prCId cat)])
-
-concrete2js :: String -> String -> (CId,Concr) -> JS.Property
-concrete2js start n (c, cnc) =
- JS.Prop l (new "GFConcrete" ([(JS.EObj $ ((map (cncdef2js n (prCId c)) ds) ++ litslins))] ++
- maybe [] (parser2js start) (parser cnc)))
- where
- l = JS.IdentPropName (JS.Ident (prCId c))
- ds = concatMap Map.assocs [lins cnc, opers cnc, lindefs cnc]
- 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)]])]
-
-
-cncdef2js :: String -> String -> (CId,Term) -> JS.Property
-cncdef2js n l (f, t) = JS.Prop (JS.IdentPropName (JS.Ident (prCId f))) (JS.EFun [children] [JS.SReturn (term2js n l t)])
-
-term2js :: String -> String -> Term -> JS.Expr
-term2js n l t = f t
- where
- f t =
- case t of
- R xs -> new "Arr" (map f xs)
- P x y -> JS.ECall (JS.EMember (f x) (JS.Ident "sel")) [f y]
- S xs -> mkSeq (map f xs)
- K t -> tokn2js t
- V i -> JS.EIndex (JS.EVar children) (JS.EInt i)
- C i -> new "Int" [JS.EInt i]
- F f -> JS.ECall (JS.EMember (JS.EIndex (JS.EMember (JS.EVar $ JS.Ident n) (JS.Ident "concretes")) (JS.EStr l)) (JS.Ident "rule")) [JS.EStr (prCId f), JS.EVar children]
- FV xs -> new "Variants" (map f xs)
- W str x -> new "Suffix" [JS.EStr str, f x]
- TM _ -> new "Meta" []
-
-tokn2js :: Tokn -> JS.Expr
-tokn2js (KS s) = mkStr s
-tokn2js (KP ss vs) = mkSeq (map mkStr ss) -- FIXME
-
-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"
-
--- Parser
-parser2js :: String -> ParserInfo -> [JS.Expr]
-parser2js start p = [new "Parser" [JS.EStr start,
- JS.EArray $ map frule2js (Array.elems (allRules p)),
- JS.EObj $ map cats (Map.assocs (startupCats p))]]
- where
- cats (c,is) = JS.Prop (JS.IdentPropName (JS.Ident (prCId c))) (JS.EArray (map JS.EInt is))
-
-frule2js :: FRule -> JS.Expr
-frule2js (FRule f ps args res lins) = new "Rule" [JS.EInt res, name2js (f,ps), JS.EArray (map JS.EInt args), lins2js lins]
-
-name2js :: (CId,[Profile]) -> JS.Expr
-name2js (f,ps) | f == wildCId = fromProfile (head ps)
- | otherwise = new "FunApp" $ [JS.EStr $ prCId f, JS.EArray (map fromProfile ps)]
- where
- fromProfile :: Profile -> JS.Expr
- fromProfile [] = new "MetaVar" []
- fromProfile [x] = daughter x
- fromProfile args = new "Unify" [JS.EArray (map daughter args)]
-
- daughter i = new "Arg" [JS.EInt i]
-
-lins2js :: Array FIndex (Array FPointPos FSymbol) -> JS.Expr
-lins2js ls = JS.EArray [ JS.EArray [ sym2js s | s <- Array.elems l] | l <- Array.elems ls]
-
-sym2js :: FSymbol -> JS.Expr
-sym2js (FSymCat l n) = new "ArgProj" [JS.EInt n, JS.EInt l]
-sym2js (FSymTok t) = new "Terminal" [JS.EStr t]
-
-new :: String -> [JS.Expr] -> JS.Expr
-new f xs = JS.ENew (JS.Ident f) xs
diff --git a/src-3.0/GF/Compile/GenerateFCFG.hs b/src-3.0/GF/Compile/GenerateFCFG.hs
deleted file mode 100644
index c2854ef3d..000000000
--- a/src-3.0/GF/Compile/GenerateFCFG.hs
+++ /dev/null
@@ -1,526 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Maintainer : Krasimir Angelov
--- Stability : (stable)
--- Portability : (portable)
---
--- Converting SimpleGFC grammars to fast nonerasing MCFG grammar.
---
--- the resulting grammars might be /very large/
---
--- the conversion is only equivalent if the GFC grammar has a context-free backbone.
------------------------------------------------------------------------------
-
-
-module GF.Compile.GenerateFCFG
- (convertConcrete) where
-
-import PGF.CId
-import PGF.Data
-import PGF.Macros --hiding (prt)
-import PGF.Parsing.FCFG.Utilities
-
-import GF.Data.BacktrackM
-import GF.Data.SortedList
-import GF.Data.Utilities (updateNthM, sortNub)
-
-import qualified Data.Map as Map
-import qualified Data.Set as Set
-import qualified Data.List as List
-import qualified Data.ByteString.Char8 as BS
-import Data.Array
-import Data.Maybe
-import Control.Monad
-
-----------------------------------------------------------------------
--- main conversion function
-
-convertConcrete :: Abstr -> Concr -> FGrammar
-convertConcrete abs cnc = fixHoasFuns $ convert abs_defs' conc' cats'
- where abs_defs = Map.assocs (funs abs)
- conc = Map.union (opers cnc) (lins cnc) -- "union big+small most efficient"
- cats = lincats cnc
- (abs_defs',conc',cats') = expandHOAS abs_defs conc cats
-
-expandHOAS :: [(CId,(Type,Expr))] -> TermMap -> TermMap -> ([(CId,(Type,Expr))],TermMap,TermMap)
-expandHOAS funs lins lincats = (funs' ++ hoFuns ++ varFuns,
- Map.unions [lins, hoLins, varLins],
- Map.unions [lincats, hoLincats, varLincat])
- where
- -- replace higher-order fun argument types with new categories
- funs' = [(f,(fixType ty,e)) | (f,(ty,e)) <- funs]
- where
- fixType :: Type -> Type
- fixType ty = let (ats,rt) = typeSkeleton ty in cftype (map catName ats) rt
-
- hoTypes :: [(Int,CId)]
- hoTypes = sortNub [(n,c) | (_,(ty,_)) <- funs, (n,c) <- fst (typeSkeleton ty), n > 0]
- hoCats = sortNub (map snd hoTypes)
- -- for each Cat with N bindings, we add a new category _NCat
- -- each new category contains a single function __NCat : Cat -> _Var -> ... -> _Var -> _NCat
- hoFuns = [(funName ty,(cftype (c : replicate n varCat) (catName ty),EEq [])) | ty@(n,c) <- hoTypes]
- -- lincats for the new categories
- hoLincats = Map.fromList [(catName ty, modifyRec (++ replicate n (S [])) (lincatOf c)) | ty@(n,c) <- hoTypes]
- -- linearizations of the new functions, lin __NCat v_0 ... v_n-1 x = { s1 = x.s1; ...; sk = x.sk; $0 = v_0.s ...
- hoLins = Map.fromList [ (funName ty, mkLin c n) | ty@(n,c) <- hoTypes]
- where mkLin c n = modifyRec (\fs -> [P (V 0) (C j) | j <- [0..length fs-1]] ++ [P (V i) (C 0) | i <- [1..n]]) (lincatOf c)
- -- for each Cat, we a add a fun _Var_Cat : _Var -> Cat
- varFuns = [(varFunName cat, (cftype [varCat] cat,EEq [])) | cat <- hoCats]
- -- linearizations of the _Var_Cat functions
- varLins = Map.fromList [(varFunName cat, R [P (V 0) (C 0)]) | cat <- hoCats]
- -- lincat for the _Var category
- varLincat = Map.singleton varCat (R [S []])
-
- lincatOf c = fromMaybe (error $ "No lincat for " ++ prCId c) $ Map.lookup c lincats
-
- modifyRec :: ([Term] -> [Term]) -> Term -> Term
- modifyRec f (R xs) = R (f xs)
- modifyRec _ t = error $ "Not a record: " ++ show t
-
- varCat = mkCId "_Var"
-
- catName :: (Int,CId) -> CId
- catName (0,c) = c
- catName (n,c) = mkCId ("_" ++ show n ++ prCId c)
-
- funName :: (Int,CId) -> CId
- funName (n,c) = mkCId ("__" ++ show n ++ prCId c)
-
- varFunName :: CId -> CId
- varFunName c = mkCId ("_Var_" ++ prCId c)
-
--- replaces __NCat with _B and _Var_Cat with _.
--- the temporary names are just there to avoid name collisions.
-fixHoasFuns :: FGrammar -> FGrammar
-fixHoasFuns (rs, cs) = ([FRule (fixName n) ps args cat lins | FRule n ps args cat lins <- rs], cs)
- where fixName (CId n) | BS.pack "__" `BS.isPrefixOf` n = (mkCId "_B")
- | BS.pack "_Var_" `BS.isPrefixOf` n = wildCId
- fixName n = n
-
-convert :: [(CId,(Type,Expr))] -> TermMap -> TermMap -> FGrammar
-convert abs_defs cnc_defs cat_defs = getFGrammar (loop frulesEnv)
- where
- srules = [
- (XRule id args res (map findLinType args) (findLinType res) term) |
- (id, (ty,_)) <- abs_defs, let (args,res) = catSkeleton ty,
- term <- Map.lookup id cnc_defs]
-
- findLinType id = fromMaybe (error $ "No lincat for " ++ show id) (Map.lookup id cat_defs)
-
- (xrulesMap,frulesEnv) = List.foldl' helper (Map.empty,emptyFRulesEnv) srules
- where
- helper (xrulesMap,frulesEnv) rule@(XRule id abs_args abs_res cnc_args cnc_res term) =
- let xrulesMap' = Map.insertWith (++) abs_res [rule] xrulesMap
- frulesEnv' = List.foldl' (\env selector -> convertRule cnc_defs selector rule env)
- frulesEnv
- (mkSingletonSelectors cnc_defs cnc_res)
- in xrulesMap' `seq` frulesEnv' `seq` (xrulesMap',frulesEnv')
-
- loop frulesEnv =
- let (todo, frulesEnv') = takeToDoRules xrulesMap frulesEnv
- in case todo of
- [] -> frulesEnv'
- _ -> loop $! List.foldl' (\env (srules,selector) ->
- List.foldl' (\env srule -> convertRule cnc_defs selector srule env) env srules) frulesEnv' todo
-
-convertRule :: TermMap -> TermSelector -> XRule -> FRulesEnv -> FRulesEnv
-convertRule cnc_defs selector (XRule fun args cat ctypes ctype term) frulesEnv =
- foldBM addRule
- frulesEnv
- (convertTerm cnc_defs selector term [([],[])])
- (protoFCat cat, map (\scat -> (protoFCat scat,[])) args, ctype, ctypes)
- where
- addRule linRec (newCat', newArgs', _, _) env0 =
- let (env1, newCat) = genFCatHead env0 newCat'
- (env2, newArgs,idxArgs) = foldr (\((xcat@(PFCat cat rcs tcs),xpaths),ctype,idx) (env,args,all_args) ->
- let xargs = xcat:[PFCat cat [path] tcs | path <- reverse xpaths]
- (env1, xargs1) = List.mapAccumL (genFCatArg cnc_defs ctype) env xargs
- in case xcat of
- PFCat _ [] _ -> (env , args, all_args)
- _ -> (env1,xargs1++args,(idx,zip xargs1 xargs):all_args)) (env1,[],[]) (zip3 newArgs' ctypes [0..])
-
- newLinRec = listArray (0,length linRec-1) [translateLin idxArgs path linRec | path <- case newCat' of {PFCat _ rcs _ -> rcs}]
-
- (_,newProfile) = List.mapAccumL accumProf 0 newArgs'
- where
- accumProf nr (PFCat _ [] _,_ ) = (nr, [] )
- accumProf nr (_ ,xpaths) = (nr+cnt+1, [nr..nr+cnt])
- where cnt = length xpaths
-
- rule = FRule fun newProfile newArgs newCat newLinRec
- in addFRule env2 rule
-
-translateLin idxArgs lbl' [] = array (0,-1) []
-translateLin idxArgs lbl' ((lbl,syms) : lins)
- | lbl' == lbl = listArray (0,length syms-1) (map instSym syms)
- | otherwise = translateLin idxArgs lbl' lins
- where
- instSym = either (\(lbl, nr, xnr) -> instCat lbl nr xnr 0 idxArgs) FSymTok
- instCat lbl nr xnr nr' ((idx,xargs):idxArgs)
- | nr == idx = let (fcat, PFCat _ rcs _) = xargs !! xnr
- in FSymCat (index lbl rcs 0) (nr'+xnr)
- | otherwise = instCat lbl nr xnr (nr'+length xargs) idxArgs
-
- index lbl' (lbl:lbls) idx
- | lbl' == lbl = idx
- | otherwise = index lbl' lbls $! (idx+1)
-
-
-----------------------------------------------------------------------
--- term conversion
-
-type CnvMonad a = BacktrackM Env a
-
-type FPath = [FIndex]
-type Env = (ProtoFCat, [(ProtoFCat,[FPath])], Term, [Term])
-type LinRec = [(FPath, [Either (FPath, FIndex, Int) FToken])]
-
-type TermMap = Map.Map CId Term
-
-convertTerm :: TermMap -> TermSelector -> Term -> LinRec -> CnvMonad LinRec
-convertTerm cnc_defs selector (V nr) ((lbl_path,lin) : lins) = convertArg selector nr [] lbl_path lin lins
-convertTerm cnc_defs selector (C nr) ((lbl_path,lin) : lins) = convertCon selector nr lbl_path lin lins
-convertTerm cnc_defs selector (R record) ((lbl_path,lin) : lins) = convertRec cnc_defs selector 0 record lbl_path lin lins
-
-convertTerm cnc_defs selector (P term sel) lins = do nr <- evalTerm cnc_defs [] sel
- convertTerm cnc_defs (TuplePrj nr selector) term lins
-convertTerm cnc_defs selector (FV vars) lins = do term <- member vars
- convertTerm cnc_defs selector term lins
-convertTerm cnc_defs selector (S ts) ((lbl_path,lin) : lins) = do projectHead lbl_path
- foldM (\lins t -> convertTerm cnc_defs selector t lins) ((lbl_path,lin) : lins) (reverse ts)
-convertTerm cnc_defs selector (K (KS str)) ((lbl_path,lin) : lins) =
- do projectHead lbl_path
- return ((lbl_path,Right str : lin) : lins)
-convertTerm cnc_defs selector (K (KP strs vars))((lbl_path,lin) : lins) =
- do projectHead lbl_path
- toks <- member (strs:[strs' | Alt strs' _ <- vars])
- return ((lbl_path, map Right toks ++ lin) : lins)
-convertTerm cnc_defs selector (F id) lins = do term <- Map.lookup id cnc_defs
- convertTerm cnc_defs selector term lins
-convertTerm cnc_defs selector (W s t) ((lbl_path,lin) : lins) = do
- ss <- case t of
- R ss -> return ss
- F f -> do
- t <- Map.lookup f cnc_defs
- case t of
- R ss -> return ss
- convertRec cnc_defs selector 0 [K (KS (s ++ s1)) | K (KS s1) <- ss] lbl_path lin lins
-convertTerm cnc_defs selector x lins = error ("convertTerm ("++show x++")")
-
-
-convertArg (TupleSel record) nr path lbl_path lin lins =
- foldM (\lins (lbl, selector) -> convertArg selector nr (lbl:path) (lbl:lbl_path) lin lins) lins record
-convertArg (TuplePrj lbl selector) nr path lbl_path lin lins =
- convertArg selector nr (lbl:path) lbl_path lin lins
-convertArg (ConSel indices) nr path lbl_path lin lins = do
- index <- member indices
- restrictHead lbl_path index
- restrictArg nr path index
- return lins
-convertArg StrSel nr path lbl_path lin lins = do
- projectHead lbl_path
- xnr <- projectArg nr path
- return ((lbl_path, Left (path, nr, xnr) : lin) : lins)
-
-convertCon (ConSel indices) index lbl_path lin lins = do
- guard (index `elem` indices)
- restrictHead lbl_path index
- return lins
-convertCon x _ _ _ _ = error $ "SimpleToFCFG,convertCon: " ++ show x
-
-convertRec cnc_defs selector index [] lbl_path lin lins = return lins
-convertRec cnc_defs selector@(TupleSel fields) index (val:record) lbl_path lin lins = select fields
- where
- select [] = convertRec cnc_defs selector (index+1) record lbl_path lin lins
- select ((index',sub_sel) : fields)
- | index == index' = do lins <- convertTerm cnc_defs sub_sel val ((index:lbl_path,lin) : lins)
- convertRec cnc_defs selector (index+1) record lbl_path lin lins
- | otherwise = select fields
-convertRec cnc_defs (TuplePrj index' sub_sel) index record lbl_path lin lins = do
- convertTerm cnc_defs sub_sel (record !! (index'-index)) ((lbl_path,lin) : lins)
-
-
-------------------------------------------------------------
--- eval a term to ground terms
-
-evalTerm :: TermMap -> FPath -> Term -> CnvMonad FIndex
-evalTerm cnc_defs path (V nr) = do term <- readArgCType nr
- unifyPType nr (reverse path) (selectTerm path term)
-evalTerm cnc_defs path (C nr) = return nr
-evalTerm cnc_defs path (R record) = case path of
- (index:path) -> evalTerm cnc_defs path (record !! index)
-evalTerm cnc_defs path (P term sel) = do index <- evalTerm cnc_defs [] sel
- evalTerm cnc_defs (index:path) term
-evalTerm cnc_defs path (FV terms) = member terms >>= evalTerm cnc_defs path
-evalTerm cnc_defs path (F id) = do term <- Map.lookup id cnc_defs
- evalTerm cnc_defs path term
-evalTerm cnc_defs path x = error ("evalTerm ("++show x++")")
-
-unifyPType :: FIndex -> FPath -> Term -> CnvMonad FIndex
-unifyPType nr path (C max_index) =
- do (_, args, _, _) <- readState
- let (PFCat _ _ tcs,_) = args !! nr
- case lookup path tcs of
- Just index -> return index
- Nothing -> do index <- member [0..max_index]
- restrictArg nr path index
- return index
-unifyPType nr path t = error $ "unifyPType " ++ show t ---- AR 2/10/2007
-
-selectTerm :: FPath -> Term -> Term
-selectTerm [] term = term
-selectTerm (index:path) (R record) = selectTerm path (record !! index)
-
-
-----------------------------------------------------------------------
--- FRulesEnv
-
-data FRulesEnv = FRulesEnv {-# UNPACK #-} !Int FCatSet [FRule]
-type FCatSet = Map.Map CId (Map.Map [FPath] (Map.Map [(FPath,FIndex)] (Either FCat FCat)))
-
-data ProtoFCat = PFCat CId [FPath] [(FPath,FIndex)]
-
-protoFCat :: CId -> ProtoFCat
-protoFCat cat = PFCat cat [] []
-
-emptyFRulesEnv = FRulesEnv 0 (ins fcatString (mkCId "String") [[0]] [] $
- ins fcatInt (mkCId "Int") [[0]] [] $
- ins fcatFloat (mkCId "Float") [[0]] [] $
- ins fcatVar (mkCId "_Var") [[0]] [] $
- Map.empty) []
- where
- ins fcat cat rcs tcs fcatSet =
- Map.insertWith (\_ -> Map.insertWith (\_ -> Map.insert tcs right_fcat) rcs tmap_s) cat rmap_s fcatSet
- where
- right_fcat = Right fcat
- tmap_s = Map.singleton tcs right_fcat
- rmap_s = Map.singleton rcs tmap_s
-
-addFRule :: FRulesEnv -> FRule -> FRulesEnv
-addFRule (FRulesEnv last_id fcatSet rules) rule = FRulesEnv last_id fcatSet (rule:rules)
-
-getFGrammar :: FRulesEnv -> FGrammar
-getFGrammar (FRulesEnv last_id fcatSet rules) = (rules, Map.map getFCatList fcatSet)
- where
- getFCatList rcs = Map.fold (\tcs lst -> Map.fold (\x lst -> either id id x : lst) lst tcs) [] rcs
-
-genFCatHead :: FRulesEnv -> ProtoFCat -> (FRulesEnv, FCat)
-genFCatHead env@(FRulesEnv last_id fcatSet rules) (PFCat cat rcs tcs) =
- case Map.lookup cat fcatSet >>= Map.lookup rcs >>= Map.lookup tcs of
- Just (Left fcat) -> (FRulesEnv last_id (ins fcat) rules, fcat)
- Just (Right fcat) -> (env, fcat)
- Nothing -> let fcat = last_id+1
- in (FRulesEnv fcat (ins fcat) rules, fcat)
- where
- ins fcat = Map.insertWith (\_ -> Map.insertWith (\_ -> Map.insert tcs right_fcat) rcs tmap_s) cat rmap_s fcatSet
- where
- right_fcat = Right fcat
- tmap_s = Map.singleton tcs right_fcat
- rmap_s = Map.singleton rcs tmap_s
-
-genFCatArg :: TermMap -> Term -> FRulesEnv -> ProtoFCat -> (FRulesEnv, FCat)
-genFCatArg cnc_defs ctype env@(FRulesEnv last_id fcatSet rules) (PFCat cat rcs tcs) =
- case Map.lookup cat fcatSet >>= Map.lookup rcs of
- Just tmap -> case Map.lookup tcs tmap of
- Just (Left fcat) -> (env, fcat)
- Just (Right fcat) -> (env, fcat)
- Nothing -> ins tmap
- Nothing -> ins Map.empty
- where
- ins tmap =
- let fcat = last_id+1
- (either_fcat,last_id1,tmap1,rules1)
- = foldBM (\tcs st (either_fcat,last_id,tmap,rules) ->
- let (last_id1,tmap1,fcat_arg) = addArg tcs last_id tmap
- rule = FRule wildCId [[0]] [fcat_arg] fcat
- (listArray (0,length rcs-1) [listArray (0,0) [FSymCat lbl 0] | lbl <- [0..length rcs-1]])
- in if st
- then (Right fcat, last_id1,tmap1,rule:rules)
- else (either_fcat,last_id, tmap, rules))
- (Left fcat,fcat,Map.insert tcs either_fcat tmap,rules)
- (gen_tcs ctype [] [])
- False
- rmap1 = Map.singleton rcs tmap1
- in (FRulesEnv last_id1 (Map.insertWith (\_ -> Map.insert rcs tmap1) cat rmap1 fcatSet) rules1, fcat)
- where
- addArg tcs last_id tmap =
- case Map.lookup tcs tmap of
- Just (Left fcat) -> (last_id, tmap, fcat)
- Just (Right fcat) -> (last_id, tmap, fcat)
- Nothing -> let fcat = last_id+1
- in (fcat, Map.insert tcs (Left fcat) tmap, fcat)
-
- gen_tcs :: Term -> FPath -> [(FPath,FIndex)] -> BacktrackM Bool [(FPath,FIndex)]
- gen_tcs (R record) path acc = foldM (\acc (label,ctype) -> gen_tcs ctype (label:path) acc) acc (zip [0..] record)
- gen_tcs (S _) path acc = return acc
- gen_tcs (C max_index) path acc =
- case List.lookup path tcs of
- Just index -> return $! addConstraint path index acc
- Nothing -> do writeState True
- index <- member [0..max_index]
- return $! addConstraint path index acc
- where
- addConstraint path0 index0 (c@(path,index) : cs)
- | path0 > path = c:addConstraint path0 index0 cs
- addConstraint path0 index0 cs = (path0,index0) : cs
- gen_tcs (F id) path acc = case Map.lookup id cnc_defs of
- Just term -> gen_tcs term path acc
- Nothing -> error ("unknown identifier: "++prCId id)
-
-
-
-------------------------------------------------------------
--- TODO queue organization
-
-type XRulesMap = Map.Map CId [XRule]
-data XRule = XRule CId {- function -}
- [CId] {- argument types -}
- CId {- result type -}
- [Term] {- argument lin-types representation -}
- Term {- result lin-type representation -}
- Term {- body -}
-
-takeToDoRules :: XRulesMap -> FRulesEnv -> ([([XRule], TermSelector)], FRulesEnv)
-takeToDoRules xrulesMap (FRulesEnv last_id fcatSet rules) = (todo,FRulesEnv last_id fcatSet' rules)
- where
- (todo,fcatSet') =
- Map.mapAccumWithKey (\todo cat rmap ->
- let (todo1,rmap1) = Map.mapAccumWithKey (\todo rcs tmap ->
- let (tcss,tmap') = Map.mapAccumWithKey (\tcss tcs either_xcat ->
- case either_xcat of
- Left xcat -> (tcs:tcss,Right xcat)
- Right xcat -> ( tcss,either_xcat)) [] tmap
- in case tcss of
- [] -> ( todo,tmap )
- _ -> ((srules,mkSelector rcs tcss) : todo,tmap')) todo rmap
- mb_srules = Map.lookup cat xrulesMap
- Just srules = mb_srules
-
- in case mb_srules of
- Just srules -> (todo1,rmap1)
- Nothing -> (todo ,rmap1)) [] fcatSet
-
-
-------------------------------------------------------------
--- The TermSelector
-
-data TermSelector
- = TupleSel [(FIndex, TermSelector)]
- | TuplePrj FIndex TermSelector
- | ConSel [FIndex]
- | StrSel
- deriving Show
-
-mkSingletonSelectors :: TermMap
- -> Term -- ^ Type representation term
- -> [TermSelector] -- ^ list of selectors containing just one string field
-mkSingletonSelectors cnc_defs term = sels0
- where
- (sels0,tcss0) = loop [] ([],[]) term
-
- loop path st (R record) = List.foldl' (\st (index,term) -> loop (index:path) st term) st (zip [0..] record)
- loop path (sels,tcss) (C i) = ( sels,map ((,) path) [0..i] : tcss)
- loop path (sels,tcss) (S _) = (mkSelector [path] tcss0 : sels, tcss)
- loop path (sels,tcss) (F id) = case Map.lookup id cnc_defs of
- Just term -> loop path (sels,tcss) term
- Nothing -> error ("unknown identifier: "++prCId id)
-
-mkSelector :: [FPath] -> [[(FPath,FIndex)]] -> TermSelector
-mkSelector rcs tcss =
- List.foldl' addRestriction (case xs of
- (path:xs) -> List.foldl' addProjection (path2selector StrSel path) xs) ys
- where
- xs = [ reverse path | path <- rcs]
- ys = [(reverse path,term) | tcs <- tcss, (path,term) <- tcs]
-
- addRestriction :: TermSelector -> (FPath,FIndex) -> TermSelector
- addRestriction (ConSel indices) ([] ,n_index) = ConSel (add indices)
- where
- add [] = [n_index]
- add (index':indices)
- | n_index == index' = index': indices
- | otherwise = index':add indices
- addRestriction (TupleSel fields) (index : path,n_index) = TupleSel (add fields)
- where
- add [] = [(index,path2selector (ConSel [n_index]) path)]
- add (field@(index',sub_sel):fields)
- | index == index' = (index',addRestriction sub_sel (path,n_index)):fields
- | otherwise = field : add fields
-
- addProjection :: TermSelector -> FPath -> TermSelector
- addProjection StrSel [] = StrSel
- addProjection (TupleSel fields) (index : path) = TupleSel (add fields)
- where
- add [] = [(index,path2selector StrSel path)]
- add (field@(index',sub_sel):fields)
- | index == index' = (index',addProjection sub_sel path):fields
- | otherwise = field : add fields
-
- path2selector base [] = base
- path2selector base (index : path) = TupleSel [(index,path2selector base path)]
-
-------------------------------------------------------------
--- updating the MCF rule
-
-readArgCType :: FIndex -> CnvMonad Term
-readArgCType nr = do (_, _, _, ctypes) <- readState
- return (ctypes !! nr)
-
-restrictArg :: FIndex -> FPath -> FIndex -> CnvMonad ()
-restrictArg nr path index = do
- (head, args, ctype, ctypes) <- readState
- args' <- updateNthM (\(xcat,xs) -> do xcat <- restrictProtoFCat path index xcat
- return (xcat,xs) ) nr args
- writeState (head, args', ctype, ctypes)
-
-projectArg :: FIndex -> FPath -> CnvMonad Int
-projectArg nr path = do
- (head, args, ctype, ctypes) <- readState
- (xnr,args') <- updateArgs nr args
- writeState (head, args', ctype, ctypes)
- return xnr
- where
- updateArgs :: FIndex -> [(ProtoFCat,[FPath])] -> CnvMonad (Int,[(ProtoFCat,[FPath])])
- updateArgs 0 ((a@(PFCat _ rcs _),xpaths) : as)
- | path `elem` rcs = return (length xpaths+1,(a,path:xpaths):as)
- | otherwise = do a <- projectProtoFCat path a
- return (0,(a,xpaths):as)
- updateArgs n (a : as) = do
- (xnr,as) <- updateArgs (n-1) as
- return (xnr,a:as)
-
-readHeadCType :: CnvMonad Term
-readHeadCType = do (_, _, ctype, _) <- readState
- return ctype
-
-restrictHead :: FPath -> FIndex -> CnvMonad ()
-restrictHead path term
- = do (head, args, ctype, ctypes) <- readState
- head' <- restrictProtoFCat path term head
- writeState (head', args, ctype, ctypes)
-
-projectHead :: FPath -> CnvMonad ()
-projectHead path
- = do (head, args, ctype, ctypes) <- readState
- head' <- projectProtoFCat path head
- writeState (head', args, ctype, ctypes)
-
-restrictProtoFCat :: FPath -> FIndex -> ProtoFCat -> CnvMonad ProtoFCat
-restrictProtoFCat path0 index0 (PFCat cat rcs tcs) = do
- tcs <- addConstraint tcs
- return (PFCat cat rcs tcs)
- where
- addConstraint (c@(path,index) : cs)
- | path0 > path = liftM (c:) (addConstraint cs)
- | path0 == path = guard (index0 == index) >>
- return (c : cs)
- addConstraint cs = return ((path0,index0) : cs)
-
-projectProtoFCat :: FPath -> ProtoFCat -> CnvMonad ProtoFCat
-projectProtoFCat path0 (PFCat cat rcs tcs) = do
- return (PFCat cat (addConstraint rcs) tcs)
- where
- addConstraint (path : rcs)
- | path0 > path = path : addConstraint rcs
- | path0 == path = path : rcs
- addConstraint rcs = path0 : rcs
diff --git a/src-3.0/GF/Compile/GeneratePMCFG.hs b/src-3.0/GF/Compile/GeneratePMCFG.hs
deleted file mode 100644
index e0343e8d6..000000000
--- a/src-3.0/GF/Compile/GeneratePMCFG.hs
+++ /dev/null
@@ -1,356 +0,0 @@
-{-# OPTIONS -fbang-patterns #-}
-----------------------------------------------------------------------
--- |
--- Maintainer : Krasimir Angelov
--- Stability : (stable)
--- Portability : (portable)
---
--- Converting SimpleGFC grammars to fast nonerasing MCFG grammar.
---
--- the resulting grammars might be /very large/
---
--- the conversion is only equivalent if the GFC grammar has a context-free backbone.
------------------------------------------------------------------------------
-
-
-module GF.Compile.GeneratePMCFG
- (convertConcrete) where
-
-import PGF.CId
-import PGF.Data
-import PGF.Macros --hiding (prt)
-import PGF.Parsing.FCFG.Utilities
-
-import GF.Data.BacktrackM
-import GF.Data.SortedList
-import GF.Data.Utilities (updateNthM, sortNub)
-
-import qualified Data.Map as Map
-import qualified Data.Set as Set
-import qualified Data.List as List
-import qualified Data.ByteString.Char8 as BS
-import Data.Array
-import Data.Maybe
-import Control.Monad
-import Debug.Trace
-
-----------------------------------------------------------------------
--- main conversion function
-
-convertConcrete :: Abstr -> Concr -> FGrammar
-convertConcrete abs cnc = fixHoasFuns $ convert abs_defs' conc' cats'
- where abs_defs = Map.assocs (funs abs)
- conc = Map.union (opers cnc) (lins cnc) -- "union big+small most efficient"
- cats = lincats cnc
- (abs_defs',conc',cats') = expandHOAS abs_defs conc cats
-
-expandHOAS :: [(CId,(Type,Expr))] -> TermMap -> TermMap -> ([(CId,(Type,Expr))],TermMap,TermMap)
-expandHOAS funs lins lincats = (funs' ++ hoFuns ++ varFuns,
- Map.unions [lins, hoLins, varLins],
- Map.unions [lincats, hoLincats, varLincat])
- where
- -- replace higher-order fun argument types with new categories
- funs' = [(f,(fixType ty,e)) | (f,(ty,e)) <- funs]
- where
- fixType :: Type -> Type
- fixType ty = let (ats,rt) = typeSkeleton ty in cftype (map catName ats) rt
-
- hoTypes :: [(Int,CId)]
- hoTypes = sortNub [(n,c) | (_,(ty,_)) <- funs, (n,c) <- fst (typeSkeleton ty), n > 0]
- hoCats = sortNub (map snd hoTypes)
- -- for each Cat with N bindings, we add a new category _NCat
- -- each new category contains a single function __NCat : Cat -> _Var -> ... -> _Var -> _NCat
- hoFuns = [(funName ty,(cftype (c : replicate n varCat) (catName ty),EEq [])) | ty@(n,c) <- hoTypes]
- -- lincats for the new categories
- hoLincats = Map.fromList [(catName ty, modifyRec (++ replicate n (S [])) (lincatOf c)) | ty@(n,c) <- hoTypes]
- -- linearizations of the new functions, lin __NCat v_0 ... v_n-1 x = { s1 = x.s1; ...; sk = x.sk; $0 = v_0.s ...
- hoLins = Map.fromList [ (funName ty, mkLin c n) | ty@(n,c) <- hoTypes]
- where mkLin c n = modifyRec (\fs -> [P (V 0) (C j) | j <- [0..length fs-1]] ++ [P (V i) (C 0) | i <- [1..n]]) (lincatOf c)
- -- for each Cat, we a add a fun _Var_Cat : _Var -> Cat
- varFuns = [(varFunName cat, (cftype [varCat] cat,EEq [])) | cat <- hoCats]
- -- linearizations of the _Var_Cat functions
- varLins = Map.fromList [(varFunName cat, R [P (V 0) (C 0)]) | cat <- hoCats]
- -- lincat for the _Var category
- varLincat = Map.singleton varCat (R [S []])
-
- lincatOf c = fromMaybe (error $ "No lincat for " ++ prCId c) $ Map.lookup c lincats
-
- modifyRec :: ([Term] -> [Term]) -> Term -> Term
- modifyRec f (R xs) = R (f xs)
- modifyRec _ t = error $ "Not a record: " ++ show t
-
- varCat = mkCId "_Var"
-
- catName :: (Int,CId) -> CId
- catName (0,c) = c
- catName (n,c) = mkCId ("_" ++ show n ++ prCId c)
-
- funName :: (Int,CId) -> CId
- funName (n,c) = mkCId ("__" ++ show n ++ prCId c)
-
- varFunName :: CId -> CId
- varFunName c = mkCId ("_Var_" ++ prCId c)
-
--- replaces __NCat with _B and _Var_Cat with _.
--- the temporary names are just there to avoid name collisions.
-fixHoasFuns :: FGrammar -> FGrammar
-fixHoasFuns (!rs, !cs) = ([FRule (fixName n) ps args cat lins | FRule n ps args cat lins <- rs], cs)
- where fixName (CId n) | BS.pack "__" `BS.isPrefixOf` n = (mkCId "_B")
- | BS.pack "_Var_" `BS.isPrefixOf` n = wildCId
- fixName n = n
-
-convert :: [(CId,(Type,Expr))] -> TermMap -> TermMap -> FGrammar
-convert abs_defs cnc_defs cat_defs = getFGrammar (List.foldl' (convertRule cnc_defs) emptyFRulesEnv srules)
- where
- srules = [
- (XRule id args res (map findLinType args) (findLinType res) term) |
- (id, (ty,_)) <- abs_defs, let (args,res) = catSkeleton ty,
- term <- Map.lookup id cnc_defs]
-
- findLinType id = fromMaybe (error $ "No lincat for " ++ show id) (Map.lookup id cat_defs)
-
-
-convertRule :: TermMap -> FRulesEnv -> XRule -> FRulesEnv
-convertRule cnc_defs frulesEnv (XRule fun args cat ctypes ctype term) =
- foldBM addRule
- frulesEnv
- (convertTerm cnc_defs [] ctype term [([],[])])
- (protoFCat cnc_defs cat ctype, zipWith (protoFCat cnc_defs) args ctypes)
- where
- addRule linRec (newCat', newArgs') env0 =
- let (env1, newCat) = genFCatHead env0 newCat'
- (env2, newArgs) = List.mapAccumL (genFCatArg cnc_defs) env1 newArgs'
-
- newLinRec = mkArray (map (mkArray . snd) linRec)
- mkArray lst = listArray (0,length lst-1) lst
-
- rule = FRule fun [] newArgs newCat newLinRec
- in addFRule env2 rule
-
-----------------------------------------------------------------------
--- term conversion
-
-type CnvMonad a = BacktrackM Env a
-
-type FPath = [FIndex]
-data ProtoFCat = PFCat CId [FPath] [(FPath,FIndex)] Term
-type Env = (ProtoFCat, [ProtoFCat])
-type LinRec = [(FPath, [FSymbol])]
-data XRule = XRule CId {- function -}
- [CId] {- argument types -}
- CId {- result type -}
- [Term] {- argument lin-types representation -}
- Term {- result lin-type representation -}
- Term {- body -}
-
-protoFCat :: TermMap -> CId -> Term -> ProtoFCat
-protoFCat cnc_defs cat ctype = PFCat cat (getRCS cnc_defs ctype) [] ctype
-
-type TermMap = Map.Map CId Term
-
-convertTerm :: TermMap -> FPath -> Term -> Term -> LinRec -> CnvMonad LinRec
-convertTerm cnc_defs sel ctype (V nr) ((lbl_path,lin) : lins) = convertArg ctype nr (reverse sel) lbl_path lin lins
-convertTerm cnc_defs sel ctype (C nr) ((lbl_path,lin) : lins) = convertCon ctype nr (reverse sel) lbl_path lin lins
-convertTerm cnc_defs sel ctype (R record) ((lbl_path,lin) : lins) = convertRec cnc_defs sel ctype record lbl_path lin lins
-convertTerm cnc_defs sel ctype (P term p) lins = do nr <- evalTerm cnc_defs [] p
- convertTerm cnc_defs (nr:sel) ctype term lins
-convertTerm cnc_defs sel ctype (FV vars) lins = do term <- member vars
- convertTerm cnc_defs sel ctype term lins
-convertTerm cnc_defs sel ctype (S ts) ((lbl_path,lin) : lins) = foldM (\lins t -> convertTerm cnc_defs sel ctype t lins) ((lbl_path,lin) : lins) (reverse ts)
-convertTerm cnc_defs sel ctype (K (KS str)) ((lbl_path,lin) : lins) = return ((lbl_path,FSymTok str : lin) : lins)
-convertTerm cnc_defs sel ctype (K (KP strs vars))((lbl_path,lin) : lins) =
- do toks <- member (strs:[strs' | Alt strs' _ <- vars])
- return ((lbl_path, map FSymTok toks ++ lin) : lins)
-convertTerm cnc_defs sel ctype (F id) lins = do term <- Map.lookup id cnc_defs
- convertTerm cnc_defs sel ctype term lins
-convertTerm cnc_defs sel ctype (W s t) ((lbl_path,lin) : lins) = do
- ss <- case t of
- R ss -> return ss
- F f -> do
- t <- Map.lookup f cnc_defs
- case t of
- R ss -> return ss
- convertRec cnc_defs sel ctype [K (KS (s ++ s1)) | K (KS s1) <- ss] lbl_path lin lins
-convertTerm cnc_defs sel ctype x lins = error ("convertTerm ("++show x++")")
-
-
-convertArg (R record) nr path lbl_path lin lins =
- foldM (\lins (lbl, ctype) -> convertArg ctype nr (lbl:path) (lbl:lbl_path) lin lins) lins (zip [0..] record)
-convertArg (C max) nr path lbl_path lin lins = do
- index <- member [0..max]
- restrictHead lbl_path index
- restrictArg nr path index
- return lins
-convertArg (S _) nr path lbl_path lin lins = do
- (_, args) <- readState
- let PFCat cat rcs tcs _ = args !! nr
- return ((lbl_path, FSymCat (index path rcs 0) nr : lin) : lins)
- where
- index lbl' (lbl:lbls) idx
- | lbl' == lbl = idx
- | otherwise = index lbl' lbls $! (idx+1)
-
-
-convertCon (C max) index [] lbl_path lin lins = do
- guard (index <= max)
- restrictHead lbl_path index
- return lins
-convertCon x _ _ _ _ _ = error $ "SimpleToFCFG,convertCon: " ++ show x
-
-convertRec cnc_defs [] (R ctypes) record lbl_path lin lins =
- foldM (\lins (index,ctype,val) -> convertTerm cnc_defs [] ctype val ((index:lbl_path,lin) : lins))
- lins
- (zip3 [0..] ctypes record)
-convertRec cnc_defs (index:sub_sel) ctype record lbl_path lin lins = do
- convertTerm cnc_defs sub_sel ctype (record !! index) ((lbl_path,lin) : lins)
-
-
-------------------------------------------------------------
--- eval a term to ground terms
-
-evalTerm :: TermMap -> FPath -> Term -> CnvMonad FIndex
-evalTerm cnc_defs path (V nr) = do (_, args) <- readState
- let PFCat _ _ _ ctype = args !! nr
- unifyPType nr (reverse path) (selectTerm path ctype)
-evalTerm cnc_defs path (C nr) = return nr
-evalTerm cnc_defs path (R record) = case path of
- (index:path) -> evalTerm cnc_defs path (record !! index)
-evalTerm cnc_defs path (P term sel) = do index <- evalTerm cnc_defs [] sel
- evalTerm cnc_defs (index:path) term
-evalTerm cnc_defs path (FV terms) = member terms >>= evalTerm cnc_defs path
-evalTerm cnc_defs path (F id) = do term <- Map.lookup id cnc_defs
- evalTerm cnc_defs path term
-evalTerm cnc_defs path x = error ("evalTerm ("++show x++")")
-
-unifyPType :: FIndex -> FPath -> Term -> CnvMonad FIndex
-unifyPType nr path (C max_index) =
- do (_, args) <- readState
- let PFCat _ _ tcs _ = args !! nr
- case lookup path tcs of
- Just index -> return index
- Nothing -> do index <- member [0..max_index]
- restrictArg nr path index
- return index
-unifyPType nr path t = error $ "unifyPType " ++ show t ---- AR 2/10/2007
-
-selectTerm :: FPath -> Term -> Term
-selectTerm [] term = term
-selectTerm (index:path) (R record) = selectTerm path (record !! index)
-
-
-----------------------------------------------------------------------
--- FRulesEnv
-
-data FRulesEnv = FRulesEnv {-# UNPACK #-} !Int FCatSet [FRule]
-type FCatSet = Map.Map CId (Map.Map [(FPath,FIndex)] FCat)
-
-emptyFRulesEnv = FRulesEnv 0 (ins fcatString (mkCId "String") [] $
- ins fcatInt (mkCId "Int") [] $
- ins fcatFloat (mkCId "Float") [] $
- ins fcatVar (mkCId "_Var") [] $
- Map.empty) []
- where
- ins fcat cat tcs fcatSet =
- Map.insertWith (\_ -> Map.insert tcs fcat) cat tmap_s fcatSet
- where
- tmap_s = Map.singleton tcs fcat
-
-addFRule :: FRulesEnv -> FRule -> FRulesEnv
-addFRule (FRulesEnv last_id fcatSet rules) rule = FRulesEnv last_id fcatSet (rule:rules)
-
-getFGrammar :: FRulesEnv -> FGrammar
-getFGrammar (FRulesEnv last_id fcatSet rules) = (rules, Map.map Map.elems fcatSet)
-
-genFCatHead :: FRulesEnv -> ProtoFCat -> (FRulesEnv, FCat)
-genFCatHead env@(FRulesEnv last_id fcatSet rules) (PFCat cat rcs tcs _) =
- case Map.lookup cat fcatSet >>= Map.lookup tcs of
- Just fcat -> (env, fcat)
- Nothing -> let fcat = last_id+1
- in (FRulesEnv fcat (ins fcat) rules, fcat)
- where
- ins fcat = Map.insertWith (\_ -> Map.insert tcs fcat) cat tmap_s fcatSet
- where
- tmap_s = Map.singleton tcs fcat
-
-genFCatArg :: TermMap -> FRulesEnv -> ProtoFCat -> (FRulesEnv, FCat)
-genFCatArg cnc_defs env@(FRulesEnv last_id fcatSet rules) (PFCat cat rcs tcs ctype) =
- case Map.lookup cat fcatSet of
- Just tmap -> case Map.lookup tcs tmap of
- Just fcat -> (env, fcat)
- Nothing -> ins tmap
- Nothing -> ins Map.empty
- where
- ins tmap =
- let fcat = last_id+1
- (last_id1,tmap1,rules1)
- = foldBM (\tcs st (last_id,tmap,rules) ->
- let (last_id1,tmap1,fcat_arg) = addArg tcs last_id tmap
- rule = FRule wildCId [[0]] [fcat_arg] fcat
- (listArray (0,length rcs-1) [listArray (0,0) [FSymCat lbl 0] | lbl <- [0..length rcs-1]])
- in if st
- then (last_id1,tmap1,rule:rules)
- else (last_id, tmap, rules))
- (fcat,Map.insert tcs fcat tmap,rules)
- (gen_tcs ctype [] [])
- False
- in (FRulesEnv last_id1 (Map.insert cat tmap1 fcatSet) rules1, fcat)
- where
- addArg tcs last_id tmap =
- case Map.lookup tcs tmap of
- Just fcat -> (last_id, tmap, fcat)
- Nothing -> let fcat = last_id+1
- in (fcat, Map.insert tcs fcat tmap, fcat)
-
- gen_tcs :: Term -> FPath -> [(FPath,FIndex)] -> BacktrackM Bool [(FPath,FIndex)]
- gen_tcs (R record) path acc = foldM (\acc (label,ctype) -> gen_tcs ctype (label:path) acc) acc (zip [0..] record)
- gen_tcs (S _) path acc = return acc
- gen_tcs (C max_index) path acc =
- case List.lookup path tcs of
- Just index -> return $! addConstraint path index acc
- Nothing -> do writeState True
- index <- member [0..max_index]
- return $! addConstraint path index acc
- where
- addConstraint path0 index0 (c@(path,index) : cs)
- | path0 > path = c:addConstraint path0 index0 cs
- addConstraint path0 index0 cs = (path0,index0) : cs
- gen_tcs (F id) path acc = case Map.lookup id cnc_defs of
- Just term -> gen_tcs term path acc
- Nothing -> error ("unknown identifier: "++prCId id)
-
-
-getRCS :: TermMap -> Term -> [FPath]
-getRCS cnc_defs = loop [] []
- where
- loop path rcs (R record) = List.foldl' (\rcs (index,term) -> loop (index:path) rcs term) rcs (zip [0..] record)
- loop path rcs (C i) = rcs
- loop path rcs (S _) = path:rcs
- loop path rcs (F id) = case Map.lookup id cnc_defs of
- Just term -> loop path rcs term
- Nothing -> error ("unknown identifier: "++show id)
-
-------------------------------------------------------------
--- updating the MCF rule
-
-restrictArg :: FIndex -> FPath -> FIndex -> CnvMonad ()
-restrictArg nr path index = do
- (head, args) <- readState
- args' <- updateNthM (restrictProtoFCat path index) nr args
- writeState (head, args')
-
-restrictHead :: FPath -> FIndex -> CnvMonad ()
-restrictHead path term
- = do (head, args) <- readState
- head' <- restrictProtoFCat path term head
- writeState (head', args)
-
-restrictProtoFCat :: FPath -> FIndex -> ProtoFCat -> CnvMonad ProtoFCat
-restrictProtoFCat path0 index0 (PFCat cat rcs tcs ctype) = do
- tcs <- addConstraint tcs
- return (PFCat cat rcs tcs ctype)
- where
- addConstraint (c@(path,index) : cs)
- | path0 > path = liftM (c:) (addConstraint cs)
- | path0 == path = guard (index0 == index) >>
- return (c : cs)
- addConstraint cs = return ((path0,index0) : cs)
diff --git a/src-3.0/GF/Compile/GetGrammar.hs b/src-3.0/GF/Compile/GetGrammar.hs
deleted file mode 100644
index a8eb8b749..000000000
--- a/src-3.0/GF/Compile/GetGrammar.hs
+++ /dev/null
@@ -1,55 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : GetGrammar
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/11/15 17:56:13 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.16 $
---
--- this module builds the internal GF grammar that is sent to the type checker
------------------------------------------------------------------------------
-
-module GF.Compile.GetGrammar where
-
-import GF.Data.Operations
-import qualified GF.Source.ErrM as E
-
-import GF.Infra.UseIO
-import GF.Infra.Modules
-import GF.Grammar.Grammar
-import qualified GF.Source.AbsGF as A
-import GF.Source.SourceToGrammar
----- import Macros
----- import Rename
-import GF.Infra.Option
---- import Custom
-import GF.Source.ParGF
-import qualified GF.Source.LexGF as L
-
-import GF.Compile.ReadFiles
-
-import Data.Char (toUpper)
-import Data.List (nub)
-import qualified Data.ByteString.Char8 as BS
-import Control.Monad (foldM)
-import System.Cmd (system)
-
-getSourceModule :: Options -> FilePath -> IOE SourceModule
-getSourceModule opts file0 = do
- file <- foldM runPreprocessor file0 (moduleFlag optPreprocessors opts)
- string <- readFileIOE file
- let tokens = myLexer string
- mo1 <- ioeErr $ pModDef tokens
- ioeErr $ transModDef mo1
-
--- FIXME: should use System.IO.openTempFile
-runPreprocessor :: FilePath -> String -> IOE FilePath
-runPreprocessor file0 p =
- do let tmp = "_gf_preproc.tmp"
- cmd = p +++ file0 ++ ">" ++ tmp
- ioeIO $ system cmd
- -- ioeIO $ putStrLn $ "preproc" +++ cmd
- return tmp
diff --git a/src-3.0/GF/Compile/GrammarToGFCC.hs b/src-3.0/GF/Compile/GrammarToGFCC.hs
deleted file mode 100644
index d14a914f1..000000000
--- a/src-3.0/GF/Compile/GrammarToGFCC.hs
+++ /dev/null
@@ -1,561 +0,0 @@
-{-# LANGUAGE PatternGuards #-}
-module GF.Compile.GrammarToGFCC (prGrammar2gfcc,mkCanon2gfcc,addParsers) where
-
-import GF.Compile.Export
-import GF.Compile.OptimizeGF (unshareModule)
-import qualified GF.Compile.GenerateFCFG as FCFG
-import qualified GF.Compile.GeneratePMCFG as PMCFG
-
-import PGF.CId
-import PGF.BuildParser (buildParserInfo)
-import qualified PGF.Macros as CM
-import qualified PGF.Data as C
-import qualified PGF.Data as D
-import GF.Grammar.Predef
-import GF.Grammar.PrGrammar
-import GF.Grammar.Grammar
-import qualified GF.Grammar.Lookup as Look
-import qualified GF.Grammar.Abstract as A
-import qualified GF.Grammar.Macros as GM
-import qualified GF.Compile.Compute as Compute ----
-import qualified GF.Infra.Modules as M
-import qualified GF.Infra.Option as O
-
-import GF.Infra.Ident
-import GF.Infra.Option
-import GF.Data.Operations
-import GF.Text.UTF8
-
-import Data.List
-import Data.Char (isDigit,isSpace)
-import qualified Data.Map as Map
-import qualified Data.ByteString.Char8 as BS
-import Debug.Trace ----
-
--- when developing, swap commenting
-
---traceD s t = trace s t
-traceD s t = t
-
-
--- the main function: generate PGF from GF.
-
-prGrammar2gfcc :: Options -> String -> SourceGrammar -> (String,String)
-prGrammar2gfcc opts cnc gr = (abs,printPGF gc) where
- (abs,gc) = mkCanon2gfcc opts cnc gr
-
-mkCanon2gfcc :: Options -> String -> SourceGrammar -> (String,D.PGF)
-mkCanon2gfcc opts cnc gr =
- (prIdent abs, (canon2gfcc opts pars . reorder abs . canon2canon abs) gr)
- where
- abs = err error id $ M.abstractOfConcrete gr (identC (BS.pack cnc))
- pars = mkParamLincat gr
-
--- Adds parsers for all concretes
-addParsers :: D.PGF -> D.PGF
-addParsers pgf = pgf { D.concretes = Map.map conv (D.concretes pgf) }
- where
- conv cnc = cnc { D.parser = Just (buildParserInfo fcfg) }
- where
- fcfg
- | Map.lookup (mkCId "erasing") (D.cflags cnc) == Just "on" = PMCFG.convertConcrete (D.abstract pgf) cnc
- | otherwise = FCFG.convertConcrete (D.abstract pgf) cnc
-
-
--- Generate PGF from GFCM.
--- this assumes a grammar translated by canon2canon
-
-canon2gfcc :: Options -> (Ident -> Ident -> C.Term) -> SourceGrammar -> D.PGF
-canon2gfcc opts pars cgr@(M.MGrammar ((a,M.ModMod abm):cms)) =
- (if dump opts DumpCanon then trace (prGrammar cgr) else id) $
- D.PGF an cns gflags abs cncs
- where
- -- abstract
- an = (i2i a)
- cns = map (i2i . fst) cms
- abs = D.Abstr aflags funs cats catfuns
- gflags = Map.empty
- aflags = Map.fromList [(mkCId f,x) | (f,x) <- moduleOptionsGFO (M.flags abm)]
- mkDef pty = case pty of
- Yes t -> mkExp t
- _ -> CM.primNotion
-
- -- concretes
- lfuns = [(f', (mkType ty, mkDef pty)) |
- (f,AbsFun (Yes ty) pty) <- tree2list (M.jments abm), let f' = i2i f]
- funs = Map.fromAscList lfuns
- lcats = [(i2i c, mkContext cont) |
- (c,AbsCat (Yes cont) _) <- tree2list (M.jments abm)]
- cats = Map.fromAscList lcats
- catfuns = Map.fromList
- [(cat,[f | (f, (C.DTyp _ c _,_)) <- lfuns, c==cat]) | (cat,_) <- lcats]
-
- cncs = Map.fromList [mkConcr lang (i2i lang) mo | (lang,M.ModMod mo) <- cms]
- mkConcr lang0 lang mo =
- (lang,D.Concr flags lins opers lincats lindefs printnames params fcfg)
- where
- js = tree2list (M.jments mo)
- flags = Map.fromList [(mkCId f,x) | (f,x) <- moduleOptionsGFO (M.flags mo)]
- opers = Map.fromAscList [] -- opers will be created as optimization
- utf = if moduleFlag optEncoding (moduleOptions (M.flags mo)) == UTF_8
- then D.convertStringsInTerm decodeUTF8 else id
- lins = Map.fromAscList
- [(i2i f, utf (mkTerm tr)) | (f,CncFun _ (Yes tr) _) <- js]
- lincats = Map.fromAscList
- [(i2i c, mkCType ty) | (c,CncCat (Yes ty) _ _) <- js]
- lindefs = Map.fromAscList
- [(i2i c, mkTerm tr) | (c,CncCat _ (Yes tr) _) <- js]
- printnames = Map.union
- (Map.fromAscList [(i2i f, mkTerm tr) | (f,CncFun _ _ (Yes tr)) <- js])
- (Map.fromAscList [(i2i f, mkTerm tr) | (f,CncCat _ _ (Yes tr)) <- js])
- params = Map.fromAscList
- [(i2i c, pars lang0 c) | (c,CncCat (Yes ty) _ _) <- js]
- fcfg = Nothing
-
-i2i :: Ident -> CId
-i2i = CId . ident2bs
-
-mkType :: A.Type -> C.Type
-mkType t = case GM.typeForm t of
- Ok (hyps,(_,cat),args) -> C.DTyp (mkContext hyps) (i2i cat) (map mkExp args)
-
-mkExp :: A.Term -> C.Expr
-mkExp t = case t of
- A.Eqs eqs -> C.EEq [C.Equ (map mkPatt ps) (mkExp e) | (ps,e) <- eqs]
- _ -> case GM.termForm t of
- Ok (xs,c,args) -> mkAbs xs (mkApp c (map mkExp args))
- where
- mkAbs xs t = foldr (C.EAbs . i2i) t xs
- mkApp c args = case c of
- Q _ c -> foldl C.EApp (C.EVar (i2i c)) args
- QC _ c -> foldl C.EApp (C.EVar (i2i c)) args
- Vr x -> C.EVar (i2i x)
- EInt i -> C.ELit (C.LInt i)
- EFloat f -> C.ELit (C.LFlt f)
- K s -> C.ELit (C.LStr s)
- Meta (MetaSymb i) -> C.EMeta i
- _ -> C.EMeta 0
- mkPatt p = case p of
- A.PP _ c ps -> foldl C.EApp (C.EVar (i2i c)) (map mkPatt ps)
- A.PV x -> C.EVar (i2i x)
- A.PW -> C.EVar wildCId
- A.PInt i -> C.ELit (C.LInt i)
-
-mkContext :: A.Context -> [C.Hypo]
-mkContext hyps = [C.Hyp (i2i x) (mkType ty) | (x,ty) <- hyps]
-
-mkTerm :: Term -> C.Term
-mkTerm tr = case tr of
- Vr (IA _ i) -> C.V i
- Vr (IAV _ _ i) -> C.V i
- Vr (IC s) | isDigit (BS.last s) ->
- C.V ((read . BS.unpack . snd . BS.spanEnd isDigit) s)
- ---- from gf parser of gfc
- EInt i -> C.C $ fromInteger i
- R rs -> C.R [mkTerm t | (_, (_,t)) <- rs]
- P t l -> C.P (mkTerm t) (C.C (mkLab l))
- TSh _ _ -> error $ show tr
- T _ cs -> C.R [mkTerm t | (_,t) <- cs] ------
- V _ cs -> C.R [mkTerm t | t <- cs]
- S t p -> C.P (mkTerm t) (mkTerm p)
- C s t -> C.S $ concatMap flats [mkTerm x | x <- [s,t]]
- FV ts -> C.FV [mkTerm t | t <- ts]
- K s -> C.K (C.KS s)
------ K (KP ss _) -> C.K (C.KP ss []) ---- TODO: prefix variants
- Empty -> C.S []
- App _ _ -> prtTrace tr $ C.C 66661 ---- for debugging
- Abs _ t -> mkTerm t ---- only on toplevel
- Alts (td,tvs) ->
- C.K (C.KP (strings td) [C.Alt (strings u) (strings v) | (u,v) <- tvs])
- _ -> prtTrace tr $ C.S [C.K (C.KS (A.prt tr +++ "66662"))] ---- for debugging
- where
- mkLab (LIdent l) = case BS.unpack l of
- '_':ds -> (read ds) :: Int
- _ -> prtTrace tr $ 66663
- strings t = case t of
- K s -> [s]
- C u v -> strings u ++ strings v
- Strs ss -> concatMap strings ss
- _ -> prtTrace tr $ ["66660"]
- flats t = case t of
- C.S ts -> concatMap flats ts
- _ -> [t]
-
--- encoding PGF-internal lincats as terms
-mkCType :: Type -> C.Term
-mkCType t = case t of
- EInt i -> C.C $ fromInteger i
- RecType rs -> C.R [mkCType t | (_, t) <- rs]
- Table pt vt -> case pt of
- EInt i -> C.R $ replicate (1 + fromInteger i) $ mkCType vt
- RecType rs -> mkCType $ foldr Table vt (map snd rs)
- Sort s | s == cStr -> C.S [] --- Str only
- _ | Just i <- GM.isTypeInts t -> C.C $ fromInteger i
- _ -> error $ "mkCType " ++ show t
-
--- encoding showable lincats (as in source gf) as terms
-mkParamLincat :: SourceGrammar -> Ident -> Ident -> C.Term
-mkParamLincat sgr lang cat = errVal (C.R [C.S []]) $ do
- typ <- Look.lookupLincat sgr lang cat
- mkPType typ
- where
- mkPType typ = case typ of
- RecType lts -> do
- ts <- mapM (mkPType . snd) lts
- return $ C.R [ C.P (kks $ prt_ l) t | ((l,_),t) <- zip lts ts]
- Table (RecType lts) v -> do
- ps <- mapM (mkPType . snd) lts
- v' <- mkPType v
- return $ foldr (\p v -> C.S [p,v]) v' ps
- Table p v -> do
- p' <- mkPType p
- v' <- mkPType v
- return $ C.S [p',v']
- Sort s | s == cStr -> return $ C.S []
- _ -> return $
- C.FV $ map (kks . filter showable . prt_) $
- errVal [] $ Look.allParamValues sgr typ
- showable c = not (isSpace c) ---- || (c == ' ') -- to eliminate \n in records
- kks = C.K . C.KS
-
--- return just one module per language
-
-reorder :: Ident -> SourceGrammar -> SourceGrammar
-reorder abs cg = M.MGrammar $
- (abs, M.ModMod $
- M.Module M.MTAbstract M.MSComplete aflags [] [] adefs poss):
- [(c, M.ModMod $
- M.Module (M.MTConcrete abs) M.MSComplete fs [] [] (sorted2tree js) poss)
- | (c,(fs,js)) <- cncs]
- where
- poss = emptyBinTree -- positions no longer needed
- mos = M.allModMod cg
- adefs = sorted2tree $ sortIds $
- predefADefs ++ Look.allOrigInfos cg abs
- predefADefs =
- [(c, AbsCat (Yes []) Nope) | c <- [cFloat,cInt,cString]]
- aflags =
- concatModuleOptions [M.flags mo | (_,mo) <- M.allModMod cg, M.isModAbs mo]
-
- cncs = sortIds [(lang, concr lang) | lang <- M.allConcretes cg abs]
- concr la = (flags,
- sortIds (predefCDefs ++ jments)) where
- jments = Look.allOrigInfos cg la
- flags = concatModuleOptions
- [M.flags mo |
- (i,mo) <- mos, M.isModCnc mo,
- Just r <- [lookup i (M.allExtendSpecs cg la)]]
-
- predefCDefs =
- [(c, CncCat (Yes GM.defLinType) Nope Nope) | c <- [cInt,cFloat,cString]]
-
- sortIds = sortBy (\ (f,_) (g,_) -> compare f g)
-
-
--- one grammar per language - needed for symtab generation
-repartition :: Ident -> SourceGrammar -> [SourceGrammar]
-repartition abs cg = [M.partOfGrammar cg (lang,mo) |
- let mos = M.allModMod cg,
- lang <- M.allConcretes cg abs,
- let mo = errVal
- (error ("no module found for " ++ A.prt lang)) $ M.lookupModule cg lang
- ]
-
-
--- translate tables and records to arrays, parameters and labels to indices
-
-canon2canon :: Ident -> SourceGrammar -> SourceGrammar
-canon2canon abs =
- recollect . map cl2cl . repartition abs . purgeGrammar abs
- where
- recollect = M.MGrammar . nubBy (\ (i,_) (j,_) -> i==j) . concatMap M.modules
- cl2cl = M.MGrammar . js2js . map (c2c p2p) . M.modules
-
- js2js ms = map (c2c (j2j (M.MGrammar ms))) ms
-
- c2c f2 (c,m) = case m of
- M.ModMod mo ->
- (c, M.ModMod $ M.replaceJudgements mo $ mapTree f2 (M.jments mo))
- _ -> (c,m)
- j2j cg (f,j) = case j of
- CncFun x (Yes tr) z -> (f,CncFun x (Yes ({-trace ("+ " ++ prt f)-} (t2t tr))) z)
- CncCat (Yes ty) (Yes x) y -> (f,CncCat (Yes (ty2ty ty)) (Yes (t2t x)) y)
- _ -> (f,j)
- where
- t2t = term2term cg pv
- ty2ty = type2type cg pv
- pv@(labels,untyps,typs) = trs $ paramValues cg
-
- -- flatten record arguments of param constructors
- p2p (f,j) = case j of
- ResParam (Yes (ps,v)) ->
- (f,ResParam (Yes ([(c,concatMap unRec cont) | (c,cont) <- ps],Nothing)))
- _ -> (f,j)
- unRec (x,ty) = case ty of
- RecType fs -> [ity | (_,typ) <- fs, ity <- unRec (identW,typ)]
- _ -> [(x,ty)]
-
-----
- trs v = traceD (tr v) v
-
- tr (labels,untyps,typs) =
- ("LABELS:" ++++
- unlines [A.prt c ++ "." ++ unwords (map A.prt l) +++ "=" +++ show i |
- ((c,l),i) <- Map.toList labels]) ++++
- ("UNTYPS:" ++++ unlines [A.prt t +++ "=" +++ show i |
- (t,i) <- Map.toList untyps]) ++++
- ("TYPS:" ++++ unlines [A.prt t +++ "=" +++ show (Map.assocs i) |
- (t,i) <- Map.toList typs])
-----
-
-purgeGrammar :: Ident -> SourceGrammar -> SourceGrammar
-purgeGrammar abstr gr =
- (M.MGrammar . list . map unopt . filter complete . purge . M.modules) gr
- where
- list ms = traceD ("MODULES" +++ unwords (map (prt . fst) ms)) ms
- purge = nubBy (\x y -> fst x == fst y) . filter (flip elem needed . fst)
- needed = nub $ concatMap (requiredCanModules isSingle gr) acncs
- acncs = abstr : M.allConcretes gr abstr
- isSingle = True
- complete (i,M.ModMod m) = M.isCompleteModule m --- not . isIncompleteCanon
- unopt = unshareModule gr -- subexp elim undone when compiled
-
-type ParamEnv =
- (Map.Map (Ident,[Label]) (Type,Integer), -- numbered labels
- Map.Map Term Integer, -- untyped terms to values
- Map.Map Type (Map.Map Term Integer)) -- types to their terms to values
-
---- gathers those param types that are actually used in lincats and lin terms
-paramValues :: SourceGrammar -> ParamEnv
-paramValues cgr = (labels,untyps,typs) where
- partyps = nub $
- --- [App (Q (IC "Predef") (IC "Ints")) (EInt i) | i <- [1,9]] ---linTypeInt
- [ty |
- (_,(_,CncCat (Yes ty0) _ _)) <- jments,
- ty <- typsFrom ty0
- ] ++ [
- Q m ty |
- (m,(ty,ResParam _)) <- jments
- ] ++ [ty |
- (_,(_,CncFun _ (Yes tr) _)) <- jments,
- ty <- err (const []) snd $ appSTM (typsFromTrm tr) []
- ]
- params = [(ty, errVal (traceD ("UNKNOWN PARAM TYPE" +++ show ty) []) $
- Look.allParamValues cgr ty) | ty <- partyps]
- typsFrom ty = unlockTy ty : case ty of
- Table p t -> typsFrom p ++ typsFrom t
- RecType ls -> concat [typsFrom t | (_, t) <- ls]
- _ -> []
-
- typsFromTrm :: Term -> STM [Type] Term
- typsFromTrm tr = case tr of
- R fs -> mapM_ (typsFromField . snd) fs >> return tr
- where
- typsFromField (mty, t) = case mty of
- Just x -> updateSTM (x:) >> typsFromTrm t
- _ -> typsFromTrm t
- V ty ts -> updateSTM (ty:) >> mapM_ typsFromTrm ts >> return tr
- T (TTyped ty) cs ->
- updateSTM (ty:) >> mapM_ typsFromTrm [t | (_, t) <- cs] >> return tr
- T (TComp ty) cs ->
- updateSTM (ty:) >> mapM_ typsFromTrm [t | (_, t) <- cs] >> return tr
- _ -> GM.composOp typsFromTrm tr
-
- jments =
- [(m,j) | (m,mo) <- M.allModMod cgr, j <- tree2list $ M.jments mo]
- typs =
- Map.fromList [(ci,Map.fromList (zip vs [0..])) | (ci,vs) <- params]
- untyps =
- Map.fromList $ concatMap Map.toList [typ | (_,typ) <- Map.toList typs]
- lincats =
- [(cat,[f | let RecType fs = GM.defLinType, f <- fs]) | cat <- [cInt,cFloat, cString]] ++
- reverse ---- TODO: really those lincats that are reached
- ---- reverse is enough to expel overshadowed ones...
- [(cat,ls) | (_,(cat,CncCat (Yes ty) _ _)) <- jments,
- RecType ls <- [unlockTy ty]]
- labels = Map.fromList $ concat
- [((cat,[lab]),(typ,i)):
- [((cat,[LVar v]),(typ,toInteger (mx + v))) | v <- [0,1]] ++ ---- 1 or 2 vars
- [((cat,[lab,lab2]),(ty,j)) |
- rs <- getRec typ, ((lab2, ty),j) <- zip rs [0..]]
- |
- (cat,ls) <- lincats, ((lab, typ),i) <- zip ls [0..], let mx = length ls]
- -- go to tables recursively
- ---- TODO: even go to deeper records
- where
- getRec typ = case typ of
- RecType rs -> [rs] ---- [unlockTyp rs] -- (sort (unlockTyp ls))
- Table _ t -> getRec t
- _ -> []
-
-type2type :: SourceGrammar -> ParamEnv -> Type -> Type
-type2type cgr env@(labels,untyps,typs) ty = case ty of
- RecType rs ->
- RecType [(mkLab i, t2t t) | (i,(l, t)) <- zip [0..] (unlockTyp rs)]
- Table pt vt -> Table (t2t pt) (t2t vt)
- QC _ _ -> look ty
- _ -> ty
- where
- t2t = type2type cgr env
- look ty = EInt $ (+ (-1)) $ toInteger $ case Map.lookup ty typs of
- Just vs -> length $ Map.assocs vs
- _ -> trace ("unknown partype " ++ show ty) 66669
-
-term2term :: SourceGrammar -> ParamEnv -> Term -> Term
-term2term cgr env@(labels,untyps,typs) tr = case tr of
- App _ _ -> mkValCase (unrec tr)
- QC _ _ -> mkValCase tr
- R rs -> R [(mkLab i, (Nothing, t2t t)) |
- (i,(l,(_,t))) <- zip [0..] (GM.sortRec (unlock rs))]
- P t l -> r2r tr
- PI t l i -> EInt $ toInteger i
-
- T (TWild _) _ -> error $ "wild" +++ prt tr
- T (TComp ty) cs -> t2t $ V ty $ map snd cs ---- should be elim'ed in tc
- T (TTyped ty) cs -> t2t $ V ty $ map snd cs ---- should be elim'ed in tc
- V ty ts -> mkCurry $ V ty [t2t t | t <- ts]
- S t p -> mkCurrySel (t2t t) (t2t p)
-
- _ -> GM.composSafeOp t2t tr
- where
- t2t = term2term cgr env
-
- unrec t = case t of
- App f (R fs) -> GM.mkApp (unrec f) [unrec u | (_,(_,u)) <- fs]
- _ -> GM.composSafeOp unrec t
-
- mkValCase tr = case appSTM (doVar tr) [] of
- Ok (tr', st@(_:_)) -> t2t $ comp $ foldr mkCase tr' st
- _ -> valNum $ comp tr
-
- --- this is mainly needed for parameter record projections
- ---- was:
- comp t = errVal t $ Compute.computeConcreteRec cgr t
- compt t = case t of
- T (TComp typ) ts -> comp $ V typ (map (comp . snd) ts) ---- should...
- T (TTyped typ) ts -> comp $ V typ (map (comp . snd) ts) ---- should
- V typ ts -> V typ (map comp ts)
- S tb (FV ts) -> FV $ map (comp . S tb) ts
- S tb@(V typ ts) v0 -> err error id $ do
- let v = comp v0
- let mv1 = Map.lookup v untyps
- case mv1 of
- Just v1 -> return $ (comp . (ts !!) . fromInteger) v1
- _ -> return (S (comp tb) v)
-
- R r -> R [(l,(ty,comp t)) | (l,(ty,t)) <- r]
- P (R r) l -> maybe t (comp . snd) $ lookup l r
- _ -> GM.composSafeOp comp t
-
- doVar :: Term -> STM [((Type,[Term]),(Term,Term))] Term
- doVar tr = case getLab tr of
- Ok (cat, lab) -> do
- k <- readSTM >>= return . length
- let tr' = Vr $ identC $ (BS.pack (show k)) -----
-
- let tyvs = case Map.lookup (cat,lab) labels of
- Just (ty,_) -> case Map.lookup ty typs of
- Just vs -> (ty,[t |
- (t,_) <- sortBy (\x y -> compare (snd x) (snd y))
- (Map.assocs vs)])
- _ -> error $ "doVar1" +++ A.prt ty
- _ -> error $ "doVar2" +++ A.prt tr +++ show (cat,lab) ---- debug
- updateSTM ((tyvs, (tr', tr)):)
- return tr'
- _ -> GM.composOp doVar tr
-
- r2r tr@(P (S (V ty ts) v) l) = t2t $ S (V ty [comp (P t l) | t <- ts]) v
-
- r2r tr@(P p _) = case getLab tr of
- Ok (cat,labs) -> P (t2t p) . mkLab $
- maybe (prtTrace tr $ 66664) snd $
- Map.lookup (cat,labs) labels
- _ -> K ((A.prt tr +++ prtTrace tr "66665"))
-
- -- this goes recursively into tables (ignored) and records (accumulated)
- getLab tr = case tr of
- Vr (IA cat _) -> return (identC cat,[])
- Vr (IAV cat _ _) -> return (identC cat,[])
- Vr (IC s) -> return (identC cat,[]) where
- cat = BS.takeWhile (/='_') s ---- also to match IAVs; no _ in a cat tolerated
- ---- init (reverse (dropWhile (/='_') (reverse s))) ---- from gf parser
----- Vr _ -> error $ "getLab " ++ show tr
- P p lab2 -> do
- (cat,labs) <- getLab p
- return (cat,labs++[lab2])
- S p _ -> getLab p
- _ -> Bad "getLab"
-
-
- mkCase ((ty,vs),(x,p)) tr =
- S (V ty [mkBranch x v tr | v <- vs]) p
- mkBranch x t tr = case tr of
- _ | tr == x -> t
- _ -> GM.composSafeOp (mkBranch x t) tr
-
- valNum tr = maybe (valNumFV $ tryFV tr) EInt $ Map.lookup tr untyps
- where
- tryFV tr = case GM.appForm tr of
- (c@(QC _ _), ts) -> [GM.mkApp c ts' | ts' <- combinations (map tryFV ts)]
- (FV ts,_) -> ts
- _ -> [tr]
- valNumFV ts = case ts of
- [tr] -> error ("valNum" +++ prt tr) ----- prtTrace tr $ K "66667"
- _ -> FV $ map valNum ts
-
- mkCurry trm = case trm of
- V (RecType [(_,ty)]) ts -> V ty ts
- V (RecType ((_,ty):ltys)) ts ->
- V ty [mkCurry (V (RecType ltys) cs) |
- cs <- chop (product (map (lengthtyp . snd) ltys)) ts]
- _ -> trm
- lengthtyp ty = case Map.lookup ty typs of
- Just m -> length (Map.assocs m)
- _ -> error $ "length of type " ++ show ty
- chop i xs = case splitAt i xs of
- (xs1,[]) -> [xs1]
- (xs1,xs2) -> xs1:chop i xs2
-
-
- mkCurrySel t p = S t p -- done properly in CheckGFCC
-
-
-mkLab k = LIdent (BS.pack ("_" ++ show k))
-
--- remove lock fields; in fact, any empty records and record types
-unlock = filter notlock where
- notlock (l,(_, t)) = case t of --- need not look at l
- R [] -> False
- RecType [] -> False
- _ -> True
-
-unlockTyp = filter notlock
-
-notlock (l, t) = case t of --- need not look at l
- RecType [] -> False
- _ -> True
-
-unlockTy ty = case ty of
- RecType ls -> RecType $ GM.sortRec [(l, unlockTy t) | (l,t) <- ls, notlock (l,t)]
- _ -> GM.composSafeOp unlockTy ty
-
-
-prtTrace tr n =
- trace ("-- INTERNAL COMPILER ERROR" +++ A.prt tr ++++ show n) n
-prTrace tr n = trace ("-- OBSERVE" +++ A.prt tr +++ show n +++ show tr) n
-
-
--- | this function finds out what modules are really needed in the canonical gr.
--- its argument is typically a concrete module name
-requiredCanModules :: (Ord i, Show i) => Bool -> M.MGrammar i a -> i -> [i]
-requiredCanModules isSingle gr c = nub $ filter notReuse ops ++ exts where
- exts = M.allExtends gr c
- ops = if isSingle
- then map fst (M.modules gr)
- else iterFix (concatMap more) $ exts
- more i = errVal [] $ do
- m <- M.lookupModMod gr i
- return $ M.extends m ++ [o | o <- map M.openedModule (M.opens m)]
- notReuse i = errVal True $ do
- m <- M.lookupModMod gr i
- return $ M.isModRes m -- to exclude reused Cnc and Abs from required
diff --git a/src-3.0/GF/Compile/ModDeps.hs b/src-3.0/GF/Compile/ModDeps.hs
deleted file mode 100644
index b5b1b798c..000000000
--- a/src-3.0/GF/Compile/ModDeps.hs
+++ /dev/null
@@ -1,153 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : ModDeps
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/11/11 23:24:34 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.14 $
---
--- Check correctness of module dependencies. Incomplete.
---
--- AR 13\/5\/2003
------------------------------------------------------------------------------
-
-module GF.Compile.ModDeps (mkSourceGrammar,
- moduleDeps,
- openInterfaces,
- requiredCanModules
- ) where
-
-import GF.Grammar.Grammar
-import GF.Infra.Ident
-import GF.Infra.Option
-import GF.Grammar.PrGrammar
-import GF.Compile.Update
-import GF.Grammar.Lookup
-import GF.Infra.Modules
-
-import GF.Data.Operations
-
-import Control.Monad
-import Data.List
-
--- | to check uniqueness of module names and import names, the
--- appropriateness of import and extend types,
--- to build a dependency graph of modules, and to sort them topologically
-mkSourceGrammar :: [(Ident,SourceModInfo)] -> Err SourceGrammar
-mkSourceGrammar ms = do
- let ns = map fst ms
- checkUniqueErr ns
- mapM (checkUniqueImportNames ns . snd) ms
- deps <- moduleDeps ms
- deplist <- either
- return
- (\ms -> Bad $ "circular modules" +++ unwords (map show ms)) $
- topoTest deps
- return $ MGrammar [(m, maybe undefined id $ lookup m ms) | IdentM m _ <- deplist]
-
-checkUniqueErr :: (Show i, Eq i) => [i] -> Err ()
-checkUniqueErr ms = do
- let msg = checkUnique ms
- if null msg then return () else Bad $ unlines msg
-
--- | check that import names don't clash with module names
-checkUniqueImportNames :: [Ident] -> SourceModInfo -> Err ()
-checkUniqueImportNames ns mo = case mo of
- ModMod m -> test [n | OQualif _ n v <- opens m, n /= v]
- _ -> return () --- Bad $ "bug: ModDeps does not treat" +++ show mo
- where
-
- test ms = testErr (all (`notElem` ns) ms)
- ("import names clashing with module names among" +++
- unwords (map prt ms))
-
-type Dependencies = [(IdentM Ident,[IdentM Ident])]
-
--- | to decide what modules immediately depend on what, and check if the
--- dependencies are appropriate
-moduleDeps :: [(Ident,SourceModInfo)] -> Err Dependencies
-moduleDeps ms = mapM deps ms where
- deps (c,mi) = errIn ("checking dependencies of module" +++ prt c) $ case mi of
- ModMod m -> case mtype m of
- MTConcrete a -> do
- aty <- lookupModuleType gr a
- testErr (aty == MTAbstract) "the of-module is not an abstract syntax"
- chDep (IdentM c (MTConcrete a))
- (extends m) (MTConcrete a) (opens m) MTResource
- t -> chDep (IdentM c t) (extends m) t (opens m) t
-
- chDep it es ety os oty = do
- ests <- mapM (lookupModuleType gr) es
- testErr (all (compatMType ety) ests) "inappropriate extension module type"
----- osts <- mapM (lookupModuleType gr . openedModule) os
----- testErr (all (compatOType oty) osts) "inappropriate open module type"
- let ab = case it of
- IdentM _ (MTConcrete a) -> [IdentM a MTAbstract]
- _ -> [] ----
- return (it, ab ++
- [IdentM e ety | e <- es] ++
- [IdentM (openedModule o) oty | o <- os])
-
- -- check for superficial compatibility, not submodule relation etc: what can be extended
- compatMType mt0 mt = case (mt0,mt) of
- (MTResource, MTConcrete _) -> True
- (MTInstance _, MTConcrete _) -> True
- (MTInterface, MTAbstract) -> True
- (MTConcrete _, MTConcrete _) -> True
- (MTInstance _, MTInstance _) -> True
- (MTReuse _, MTReuse _) -> True
- (MTInstance _, MTResource) -> True
- (MTResource, MTInstance _) -> True
- ---- some more?
- _ -> mt0 == mt
- -- in the same way; this defines what can be opened
- compatOType mt0 mt = case mt0 of
- MTAbstract -> mt == MTAbstract
- MTTransfer _ _ -> mt == MTAbstract
- _ -> case mt of
- MTResource -> True
- MTReuse _ -> True
- MTInterface -> True
- MTInstance _ -> True
- _ -> False
-
- gr = MGrammar ms --- hack
-
-openInterfaces :: Dependencies -> Ident -> Err [Ident]
-openInterfaces ds m = do
- let deps = [(i,ds) | (IdentM i _,ds) <- ds]
- let more (c,_) = [(i,mt) | Just is <- [lookup c deps], IdentM i mt <- is]
- let mods = iterFix (concatMap more) (more (m,undefined))
- return $ [i | (i,MTInterface) <- mods]
-
--- | this function finds out what modules are really needed in the canonical gr.
--- its argument is typically a concrete module name
-requiredCanModules :: (Ord i, Show i) => Bool -> MGrammar i a -> i -> [i]
-requiredCanModules isSingle gr c = nub $ filter notReuse ops ++ exts where
- exts = allExtends gr c
- ops = if isSingle
- then map fst (modules gr)
- else iterFix (concatMap more) $ exts
- more i = errVal [] $ do
- m <- lookupModMod gr i
- return $ extends m ++ [o | o <- map openedModule (opens m)]
- notReuse i = errVal True $ do
- m <- lookupModMod gr i
- return $ isModRes m -- to exclude reused Cnc and Abs from required
-
-
-{-
--- to test
-exampleDeps = [
- (ir "Nat",[ii "Gen", ir "Adj"]),
- (ir "Adj",[ii "Num", ii "Gen", ir "Nou"]),
- (ir "Nou",[ii "Cas"])
- ]
-
-ii s = IdentM (IC s) MTInterface
-ir s = IdentM (IC s) MTResource
--}
-
diff --git a/src-3.0/GF/Compile/Optimize.hs b/src-3.0/GF/Compile/Optimize.hs
deleted file mode 100644
index 83cbeb57a..000000000
--- a/src-3.0/GF/Compile/Optimize.hs
+++ /dev/null
@@ -1,235 +0,0 @@
-{-# LANGUAGE PatternGuards #-}
-----------------------------------------------------------------------
--- |
--- Module : Optimize
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/09/16 13:56:13 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.18 $
---
--- Top-level partial evaluation for GF source modules.
------------------------------------------------------------------------------
-
-module GF.Compile.Optimize (optimizeModule) where
-
-import GF.Grammar.Grammar
-import GF.Infra.Ident
-import GF.Infra.Modules
-import GF.Grammar.PrGrammar
-import GF.Grammar.Macros
-import GF.Grammar.Lookup
-import GF.Grammar.Predef
-import GF.Compile.Refresh
-import GF.Compile.Compute
-import GF.Compile.BackOpt
-import GF.Compile.CheckGrammar
-import GF.Compile.Update
-
-import GF.Data.Operations
-import GF.Infra.CheckM
-import GF.Infra.Option
-
-import Control.Monad
-import Data.List
-import qualified Data.Set as Set
-
-import Debug.Trace
-
-
--- conditional trace
-
-prtIf :: (Print a) => Bool -> a -> a
-prtIf b t = if b then trace (" " ++ prt t) t else t
-
--- | partial evaluation of concrete syntax. AR 6\/2001 -- 16\/5\/2003 -- 5\/2\/2005.
-
-type EEnv = () --- not used
-
--- only do this for resource: concrete is optimized in gfc form
-optimizeModule :: Options -> ([(Ident,SourceModInfo)],EEnv) ->
- (Ident,SourceModInfo) -> Err ((Ident,SourceModInfo),EEnv)
-optimizeModule opts mse@(ms,eenv) mo@(_,mi) = case mi of
- ModMod m0 | mstatus m0 == MSComplete && isModRes m0 -> do
- (mo1,_) <- evalModule oopts mse mo
- let mo2 = shareModule optim mo1
- return (mo2,eenv)
- _ -> evalModule oopts mse mo
- where
- oopts = addOptions opts (moduleOptions (flagsModule mo))
- optim = moduleFlag optOptimizations oopts
-
-evalModule :: Options -> ([(Ident,SourceModInfo)],EEnv) -> (Ident,SourceModInfo) ->
- Err ((Ident,SourceModInfo),EEnv)
-evalModule oopts (ms,eenv) mo@(name,mod) = case mod of
-
- ModMod m0 | mstatus m0 == MSComplete -> case mtype m0 of
- _ | isModRes m0 -> do
- let deps = allOperDependencies name (jments m0)
- ids <- topoSortOpers deps
- MGrammar (mod' : _) <- foldM evalOp gr ids
- return $ (mod',eenv)
-
- MTConcrete a -> do
- js' <- mapMTree (evalCncInfo oopts gr name a) (jments m0)
- return $ ((name, ModMod (replaceJudgements m0 js')),eenv)
-
- _ -> return $ ((name,mod),eenv)
- _ -> return $ ((name,mod),eenv)
- where
- gr0 = MGrammar $ ms
- gr = MGrammar $ (name,mod) : ms
-
- evalOp g@(MGrammar ((_, ModMod m) : _)) i = do
- info <- lookupTree prt i $ jments m
- info' <- evalResInfo oopts gr (i,info)
- return $ updateRes g name i info'
-
--- | only operations need be compiled in a resource, and this is local to each
--- definition since the module is traversed in topological order
-evalResInfo :: Options -> SourceGrammar -> (Ident,Info) -> Err Info
-evalResInfo oopts gr (c,info) = case info of
-
- ResOper pty pde -> eIn "operation" $ do
- pde' <- case pde of
- Yes de | optres -> liftM yes $ comp de
- _ -> return pde
- return $ ResOper pty pde'
-
- _ -> return info
- where
- comp = if optres then computeConcrete gr else computeConcreteRec gr
- eIn cat = errIn ("Error optimizing" +++ cat +++ prt c +++ ":")
- optim = moduleFlag optOptimizations oopts
- optres = OptExpand `Set.member` optim
-
-
-evalCncInfo ::
- Options -> SourceGrammar -> Ident -> Ident -> (Ident,Info) -> Err (Ident,Info)
-evalCncInfo opts gr cnc abs (c,info) = do
-
- seq (prtIf (verbAtLeast opts Verbose) c) $ return ()
-
- errIn ("optimizing" +++ prt c) $ case info of
-
- CncCat ptyp pde ppr -> do
- pde' <- case (ptyp,pde) of
- (Yes typ, Yes de) ->
- liftM yes $ pEval ([(varStr, typeStr)], typ) de
- (Yes typ, Nope) ->
- liftM yes $ mkLinDefault gr typ >>= partEval noOptions gr ([(varStr, typeStr)],typ)
- (May b, Nope) ->
- return $ May b
- _ -> return pde -- indirection
-
- ppr' <- liftM yes $ evalPrintname gr c ppr (yes $ K $ prt c)
-
- return (c, CncCat ptyp pde' ppr')
-
- CncFun (mt@(Just (_,ty@(cont,val)))) pde ppr -> --trace (prt c) $
- eIn ("linearization in type" +++ prt (mkProd (cont,val,[])) ++++ "of function") $ do
- pde' <- case pde of
- Yes de -> do
- liftM yes $ pEval ty de
-
- _ -> return pde
- ppr' <- liftM yes $ evalPrintname gr c ppr pde'
- return $ (c, CncFun mt pde' ppr') -- only cat in type actually needed
-
- _ -> return (c,info)
- where
- pEval = partEval opts gr
- eIn cat = errIn ("Error optimizing" +++ cat +++ prt c +++ ":")
-
--- | the main function for compiling linearizations
-partEval :: Options -> SourceGrammar -> (Context,Type) -> Term -> Err Term
-partEval opts gr (context, val) trm = errIn ("parteval" +++ prt_ trm) $ do
- let vars = map fst context
- args = map Vr vars
- subst = [(v, Vr v) | v <- vars]
- trm1 = mkApp trm args
- trm2 <- computeTerm gr subst trm1
- trm3 <- if rightType trm2
- then computeTerm gr subst trm2
- else recordExpand val trm2 >>= computeTerm gr subst
- return $ mkAbs vars trm3
- where
- -- don't eta expand records of right length (correct by type checking)
- rightType (R rs) = case val of
- RecType ts -> length rs == length ts
- _ -> False
- rightType _ = False
-
-
-
-
--- here we must be careful not to reduce
--- variants {{s = "Auto" ; g = N} ; {s = "Wagen" ; g = M}}
--- {s = variants {"Auto" ; "Wagen"} ; g = variants {N ; M}} ;
-
-recordExpand :: Type -> Term -> Err Term
-recordExpand typ trm = case unComputed typ of
- RecType tys -> case trm of
- FV rs -> return $ FV [R [assign lab (P r lab) | (lab,_) <- tys] | r <- rs]
- _ -> return $ R [assign lab (P trm lab) | (lab,_) <- tys]
- _ -> return trm
-
-
--- | auxiliaries for compiling the resource
-
-mkLinDefault :: SourceGrammar -> Type -> Err Term
-mkLinDefault gr typ = do
- case unComputed typ of
- RecType lts -> mapPairsM mkDefField lts >>= (return . Abs varStr . R . mkAssign)
- _ -> liftM (Abs varStr) $ mkDefField typ
----- _ -> prtBad "linearization type must be a record type, not" typ
- where
- mkDefField typ = case unComputed typ of
- Table p t -> do
- t' <- mkDefField t
- let T _ cs = mkWildCases t'
- return $ T (TWild p) cs
- Sort s | s == cStr -> return $ Vr varStr
- QC q p -> lookupFirstTag gr q p
- RecType r -> do
- let (ls,ts) = unzip r
- ts' <- mapM mkDefField ts
- return $ R $ [assign l t | (l,t) <- zip ls ts']
- _ | Just _ <- isTypeInts typ -> return $ EInt 0 -- exists in all as first val
- _ -> prtBad "linearization type field cannot be" typ
-
--- | Form the printname: if given, compute. If not, use the computed
--- lin for functions, cat name for cats (dispatch made in evalCncDef above).
---- We cannot use linearization at this stage, since we do not know the
---- defaults we would need for question marks - and we're not yet in canon.
-evalPrintname :: SourceGrammar -> Ident -> MPr -> Perh Term -> Err Term
-evalPrintname gr c ppr lin =
- case ppr of
- Yes pr -> comp pr
- _ -> case lin of
- Yes t -> return $ K $ clean $ prt $ oneBranch t ---- stringFromTerm
- _ -> return $ K $ prt c ----
- where
- comp = computeConcrete gr
-
- oneBranch t = case t of
- Abs _ b -> oneBranch b
- R (r:_) -> oneBranch $ snd $ snd r
- T _ (c:_) -> oneBranch $ snd c
- V _ (c:_) -> oneBranch c
- FV (t:_) -> oneBranch t
- C x y -> C (oneBranch x) (oneBranch y)
- S x _ -> oneBranch x
- P x _ -> oneBranch x
- Alts (d,_) -> oneBranch d
- _ -> t
-
- --- very unclean cleaner
- clean s = case s of
- '+':'+':' ':cs -> clean cs
- '"':cs -> clean cs
- c:cs -> c: clean cs
- _ -> s
-
diff --git a/src-3.0/GF/Compile/OptimizeGF.hs b/src-3.0/GF/Compile/OptimizeGF.hs
deleted file mode 100644
index 41b828aa3..000000000
--- a/src-3.0/GF/Compile/OptimizeGF.hs
+++ /dev/null
@@ -1,277 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : OptimizeGF
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/04/21 16:21:33 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.6 $
---
--- Optimizations on GF source code: sharing, parametrization, value sets.
---
--- optimization: sharing branches in tables. AR 25\/4\/2003.
--- following advice of Josef Svenningsson
------------------------------------------------------------------------------
-
-module GF.Compile.OptimizeGF (
- optModule,unshareModule,unsubexpModule,unoptModule,subexpModule,shareModule
- ) where
-
-import GF.Grammar.Grammar
-import GF.Grammar.Lookup
-import GF.Infra.Ident
-import qualified GF.Grammar.Macros as C
-import GF.Grammar.PrGrammar (prt)
-import qualified GF.Infra.Modules as M
-import GF.Data.Operations
-
-import Control.Monad
-import Data.Map (Map)
-import qualified Data.Map as Map
-import qualified Data.ByteString.Char8 as BS
-import Data.List
-
-optModule :: (Ident, SourceModInfo) -> (Ident, SourceModInfo)
-optModule = subexpModule . shareModule
-
-shareModule = processModule optim
-
-unoptModule :: SourceGrammar -> (Ident, SourceModInfo) -> (Ident, SourceModInfo)
-unoptModule gr = unshareModule gr . unsubexpModule
-
-unshareModule :: SourceGrammar -> (Ident, SourceModInfo) -> (Ident, SourceModInfo)
-unshareModule gr = processModule (const (unoptim gr))
-
-processModule ::
- (Ident -> Term -> Term) -> (Ident, SourceModInfo) -> (Ident, SourceModInfo)
-processModule opt (i,m) = case m of
- M.ModMod mo ->
- (i,M.ModMod (M.replaceJudgements mo (mapTree (shareInfo opt) (M.jments mo))))
- _ -> (i,m)
-
-shareInfo opt (c, CncCat ty (Yes t) m) = (c,CncCat ty (Yes (opt c t)) m)
-shareInfo opt (c, CncFun kxs (Yes t) m) = (c,CncFun kxs (Yes (opt c t)) m)
-shareInfo opt (c, ResOper ty (Yes t)) = (c,ResOper ty (Yes (opt c t)))
-shareInfo _ i = i
-
--- the function putting together optimizations
-optim :: Ident -> Term -> Term
-optim c = values . factor c 0
-
--- we need no counter to create new variable names, since variables are
--- local to tables (only true in GFC) ---
-
--- factor parametric branches
-
-factor :: Ident -> Int -> Term -> Term
-factor c i t = case t of
- T _ [_] -> t
- T _ [] -> t
- T (TComp ty) cs ->
- T (TTyped ty) $ factors i [(p, factor c (i+1) v) | (p, v) <- cs]
- _ -> C.composSafeOp (factor c i) t
- where
-
- factors i psvs = -- we know psvs has at least 2 elements
- let p = qqIdent c i
- vs' = map (mkFun p) psvs
- in if allEqs vs'
- then mkCase p vs'
- else psvs
-
- mkFun p (patt, val) = replace (C.patt2term patt) (Vr p) val
-
- allEqs (v:vs) = all (==v) vs
-
- mkCase p (v:_) = [(PV p, v)]
-
---- we hope this will be fresh and don't check... in GFC would be safe
-
-qqIdent c i = identC (BS.pack ("q_" ++ prt c ++ "__" ++ show i))
-
-
--- we need to replace subterms
-
-replace :: Term -> Term -> Term -> Term
-replace old new trm = case trm of
-
- -- these are the important cases, since they can correspond to patterns
- QC _ _ | trm == old -> new
- App t ts | trm == old -> new
- App t ts -> App (repl t) (repl ts)
- R _ | isRec && trm == old -> new
- _ -> C.composSafeOp repl trm
- where
- repl = replace old new
- isRec = case trm of
- R _ -> True
- _ -> False
-
--- It is very important that this is performed only after case
--- expansion since otherwise the order and number of values can
--- be incorrect. Guaranteed by the TComp flag.
-
-values :: Term -> Term
-values t = case t of
- T ty [(ps,t)] -> T ty [(ps,values t)] -- don't destroy parametrization
- T (TComp ty) cs -> V ty [values t | (_, t) <- cs]
- T (TTyped ty) cs -> V ty [values t | (_, t) <- cs]
- ---- why are these left?
- ---- printing with GrammarToSource does not preserve the distinction
- _ -> C.composSafeOp values t
-
-
--- to undo the effect of factorization
-
-unoptim :: SourceGrammar -> Term -> Term
-unoptim gr = unfactor gr
-
-unfactor :: SourceGrammar -> Term -> Term
-unfactor gr t = case t of
- T (TTyped ty) [(PV x,u)] -> V ty [restore x v (unfac u) | v <- vals ty]
- _ -> C.composSafeOp unfac t
- where
- unfac = unfactor gr
- vals = err error id . allParamValues gr
- restore x u t = case t of
- Vr y | y == x -> u
- _ -> C.composSafeOp (restore x u) t
-
-
-----------------------------------------------------------------------
-
-{-
-This module implements a simple common subexpression elimination
- for gfc grammars, to factor out shared subterms in lin rules.
-It works in three phases:
-
- (1) collectSubterms collects recursively all subterms of forms table and (P x..y)
- from lin definitions (experience shows that only these forms
- tend to get shared) and counts how many times they occur
- (2) addSubexpConsts takes those subterms t that occur more than once
- and creates definitions of form "oper A''n = t" where n is a
- fresh number; notice that we assume no ids of this form are in
- scope otherwise
- (3) elimSubtermsMod goes through lins and the created opers by replacing largest
- possible subterms by the newly created identifiers
-
-The optimization is invoked in gf by the flag i -subs.
-
-If an application does not support GFC opers, the effect of this
-optimization can be undone by the function unSubelimCanon.
-
-The function unSubelimCanon can be used to diagnostisize how much
-cse is possible in the grammar. It is used by the flag pg -printer=subs.
-
--}
-
-subexpModule :: SourceModule -> SourceModule
-subexpModule (n,m) = errVal (n,m) $ case m of
- M.ModMod mo -> do
- let ljs = tree2list (M.jments mo)
- (tree,_) <- appSTM (getSubtermsMod n ljs) (Map.empty,0)
- js2 <- liftM buildTree $ addSubexpConsts n tree $ ljs
- return (n,M.ModMod (M.replaceJudgements mo js2))
- _ -> return (n,m)
-
-unsubexpModule :: SourceModule -> SourceModule
-unsubexpModule sm@(i,m) = case m of
- M.ModMod mo | hasSub ljs ->
- (i, M.ModMod (M.replaceJudgements mo
- (rebuild (map unparInfo ljs))))
- where ljs = tree2list (M.jments mo)
- _ -> (i,m)
- where
- -- perform this iff the module has opers
- hasSub ljs = not $ null [c | (c,ResOper _ _) <- ljs]
- unparInfo (c,info) = case info of
- CncFun xs (Yes t) m -> [(c, CncFun xs (Yes (unparTerm t)) m)]
- ResOper (Yes (EInt 8)) _ -> [] -- subexp-generated opers
- ResOper pty (Yes t) -> [(c, ResOper pty (Yes (unparTerm t)))]
- _ -> [(c,info)]
- unparTerm t = case t of
- Q m c | isOperIdent c -> --- name convention of subexp opers
- errVal t $ liftM unparTerm $ lookupResDef gr m c
- _ -> C.composSafeOp unparTerm t
- gr = M.MGrammar [sm]
- rebuild = buildTree . concat
-
--- implementation
-
-type TermList = Map Term (Int,Int) -- number of occs, id
-type TermM a = STM (TermList,Int) a
-
-addSubexpConsts ::
- Ident -> Map Term (Int,Int) -> [(Ident,Info)] -> Err [(Ident,Info)]
-addSubexpConsts mo tree lins = do
- let opers = [oper id trm | (trm,(_,id)) <- list]
- mapM mkOne $ opers ++ lins
- where
-
- mkOne (f,def) = case def of
- CncFun xs (Yes trm) pn -> do
- trm' <- recomp f trm
- return (f,CncFun xs (Yes trm') pn)
- ResOper ty (Yes trm) -> do
- trm' <- recomp f trm
- return (f,ResOper ty (Yes trm'))
- _ -> return (f,def)
- recomp f t = case Map.lookup t tree of
- Just (_,id) | operIdent id /= f -> return $ Q mo (operIdent id)
- _ -> C.composOp (recomp f) t
-
- list = Map.toList tree
-
- oper id trm = (operIdent id, ResOper (Yes (EInt 8)) (Yes trm))
- --- impossible type encoding generated opers
-
-getSubtermsMod :: Ident -> [(Ident,Info)] -> TermM (Map Term (Int,Int))
-getSubtermsMod mo js = do
- mapM (getInfo (collectSubterms mo)) js
- (tree0,_) <- readSTM
- return $ Map.filter (\ (nu,_) -> nu > 1) tree0
- where
- getInfo get fi@(f,i) = case i of
- CncFun xs (Yes trm) pn -> do
- get trm
- return $ fi
- ResOper ty (Yes trm) -> do
- get trm
- return $ fi
- _ -> return fi
-
-collectSubterms :: Ident -> Term -> TermM Term
-collectSubterms mo t = case t of
- App f a -> do
- collect f
- collect a
- add t
- T ty cs -> do
- let (_,ts) = unzip cs
- mapM collect ts
- add t
- V ty ts -> do
- mapM collect ts
- add t
----- K (KP _ _) -> add t
- _ -> C.composOp (collectSubterms mo) t
- where
- collect = collectSubterms mo
- add t = do
- (ts,i) <- readSTM
- let
- ((count,id),next) = case Map.lookup t ts of
- Just (nu,id) -> ((nu+1,id), i)
- _ -> ((1, i ), i+1)
- writeSTM (Map.insert t (count,id) ts, next)
- return t --- only because of composOp
-
-operIdent :: Int -> Ident
-operIdent i = identC (operPrefix `BS.append` (BS.pack (show i))) ---
-
-isOperIdent :: Ident -> Bool
-isOperIdent id = BS.isPrefixOf operPrefix (ident2bs id)
-
-operPrefix = BS.pack ("A''")
diff --git a/src-3.0/GF/Compile/OptimizeGFCC.hs b/src-3.0/GF/Compile/OptimizeGFCC.hs
deleted file mode 100644
index c73d5bbcb..000000000
--- a/src-3.0/GF/Compile/OptimizeGFCC.hs
+++ /dev/null
@@ -1,124 +0,0 @@
-module GF.Compile.OptimizeGFCC where
-
-import PGF.CId
-import PGF.Data
-
-import GF.Data.Operations
-
-import Data.List
-import qualified Data.Map as Map
-
-
--- back-end optimization:
--- suffix analysis followed by common subexpression elimination
-
-optPGF :: PGF -> PGF
-optPGF = cseOptimize . suffixOptimize
-
-suffixOptimize :: PGF -> PGF
-suffixOptimize pgf = pgf {
- concretes = Map.map opt (concretes pgf)
- }
- where
- opt cnc = cnc {
- lins = Map.map optTerm (lins cnc),
- lindefs = Map.map optTerm (lindefs cnc),
- printnames = Map.map optTerm (printnames cnc)
- }
-
-cseOptimize :: PGF -> PGF
-cseOptimize pgf = pgf {
- concretes = Map.map subex (concretes pgf)
- }
-
--- analyse word form lists into prefix + suffixes
--- suffix sets can later be shared by subex elim
-
-optTerm :: Term -> Term
-optTerm tr = case tr of
- R ts@(_:_:_) | all isK ts -> mkSuff $ optToks [s | K (KS s) <- ts]
- R ts -> R $ map optTerm ts
- P t v -> P (optTerm t) v
- _ -> tr
- where
- optToks ss = prf : suffs where
- prf = pref (head ss) (tail ss)
- suffs = map (drop (length prf)) ss
- pref cand ss = case ss of
- s1:ss2 -> if isPrefixOf cand s1 then pref cand ss2 else pref (init cand) ss
- _ -> cand
- isK t = case t of
- K (KS _) -> True
- _ -> False
- mkSuff ("":ws) = R (map (K . KS) ws)
- mkSuff (p:ws) = W p (R (map (K . KS) ws))
-
-
--- common subexpression elimination
-
----subex :: [(CId,Term)] -> [(CId,Term)]
-subex :: Concr -> Concr
-subex cnc = err error id $ do
- (tree,_) <- appSTM (getSubtermsMod cnc) (Map.empty,0)
- return $ addSubexpConsts tree cnc
-
-type TermList = Map.Map Term (Int,Int) -- number of occs, id
-type TermM a = STM (TermList,Int) a
-
-addSubexpConsts :: TermList -> Concr -> Concr
-addSubexpConsts tree cnc = cnc {
- opers = Map.fromList [(f,recomp f trm) | (f,trm) <- ops],
- lins = rec lins,
- lindefs = rec lindefs,
- printnames = rec printnames
- }
- where
- ops = [(fid id, trm) | (trm,(_,id)) <- Map.assocs tree]
- mkOne (f,trm) = (f, recomp f trm)
- recomp f t = case Map.lookup t tree of
- Just (_,id) | fid id /= f -> F $ fid id -- not to replace oper itself
- _ -> case t of
- R ts -> R $ map (recomp f) ts
- S ts -> S $ map (recomp f) ts
- W s t -> W s (recomp f t)
- P t p -> P (recomp f t) (recomp f p)
- _ -> t
- fid n = mkCId $ "_" ++ show n
- rec field = Map.fromAscList [(f,recomp f trm) | (f,trm) <- Map.assocs (field cnc)]
-
-
-getSubtermsMod :: Concr -> TermM TermList
-getSubtermsMod cnc = do
- mapM getSubterms (Map.assocs (lins cnc))
- mapM getSubterms (Map.assocs (lindefs cnc))
- mapM getSubterms (Map.assocs (printnames cnc))
- (tree0,_) <- readSTM
- return $ Map.filter (\ (nu,_) -> nu > 1) tree0
- where
- getSubterms (f,trm) = collectSubterms trm >> return ()
-
-collectSubterms :: Term -> TermM ()
-collectSubterms t = case t of
- R ts -> do
- mapM collectSubterms ts
- add t
- S ts -> do
- mapM collectSubterms ts
- add t
- W s u -> do
- collectSubterms u
- add t
- P p u -> do
- collectSubterms p
- collectSubterms u
- add t
- _ -> return ()
- where
- add t = do
- (ts,i) <- readSTM
- let
- ((count,id),next) = case Map.lookup t ts of
- Just (nu,id) -> ((nu+1,id), i)
- _ -> ((1, i ), i+1)
- writeSTM (Map.insert t (count,id) ts, next)
-
diff --git a/src-3.0/GF/Compile/ReadFiles.hs b/src-3.0/GF/Compile/ReadFiles.hs
deleted file mode 100644
index cd2faec15..000000000
--- a/src-3.0/GF/Compile/ReadFiles.hs
+++ /dev/null
@@ -1,195 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : ReadFiles
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/11/11 23:24:34 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.26 $
---
--- Decide what files to read as function of dependencies and time stamps.
---
--- make analysis for GF grammar modules. AR 11\/6\/2003--24\/2\/2004
---
--- to find all files that have to be read, put them in dependency order, and
--- decide which files need recompilation. Name @file.gf@ is returned for them,
--- and @file.gfo@ otherwise.
------------------------------------------------------------------------------
-
-module GF.Compile.ReadFiles
- ( getAllFiles,ModName,ModEnv,importsOfModule,
- gfoFile,gfFile,isGFO,
- getOptionsFromFile) where
-
-import GF.Infra.UseIO
-import GF.Infra.Option
-import GF.Data.Operations
-import GF.Source.AbsGF hiding (FileName)
-import GF.Source.LexGF
-import GF.Source.ParGF
-
-import Control.Monad
-import Data.Char
-import Data.List
-import qualified Data.ByteString.Char8 as BS
-import qualified Data.Map as Map
-import System.Time
-import System.Directory
-import System.FilePath
-
-type ModName = String
-type ModEnv = Map.Map ModName (ClockTime,[ModName])
-
-
--- | Returns a list of all files to be compiled in topological order i.e.
--- the low level (leaf) modules are first.
-getAllFiles :: Options -> [InitPath] -> ModEnv -> FileName -> IOE [FullPath]
-getAllFiles opts ps env file = do
- -- read module headers from all files recursively
- ds <- liftM reverse $ get [] [] (justModuleName file)
- ioeIO $ putIfVerb opts $ "all modules:" +++ show [name | (name,_,_,_,_) <- ds]
- return $ paths ds
- where
- -- construct list of paths to read
- paths cs = [mk (p </> f) | (f,st,_,_,p) <- cs, mk <- mkFile st]
- where
- mkFile CSComp = [gfFile ]
- mkFile CSRead = [gfoFile]
- mkFile _ = []
-
- -- | traverses the dependency graph and returns a topologicaly sorted
- -- list of ModuleInfo. An error is raised if there is circular dependency
- get :: [ModName] -- ^ keeps the current path in the dependency graph to avoid cycles
- -> [ModuleInfo] -- ^ a list of already traversed modules
- -> ModName -- ^ the current module
- -> IOE [ModuleInfo] -- ^ the final
- get trc ds name
- | name `elem` trc = ioeErr $ Bad $ "circular modules" +++ unwords trc
- | (not . null) [n | (n,_,_,_,_) <- ds, name == n] --- file already read
- = return ds
- | otherwise = do
- (name,st0,t0,imps,p) <- findModule name
- ds <- foldM (get (name:trc)) ds imps
- let (st,t) | (not . null) [f | (f,CSComp,_,_,_) <- ds, elem f imps]
- = (CSComp,Nothing)
- | otherwise = (st0,t0)
- return ((name,st,t,imps,p):ds)
-
- -- searches for module in the search path and if it is found
- -- returns 'ModuleInfo'. It fails if there is no such module
- findModule :: ModName -> IOE ModuleInfo
- findModule name = do
- (file,gfTime,gfoTime) <- do
- mb_gfFile <- ioeIO $ getFilePathMsg "" ps (gfFile name)
- case mb_gfFile of
- Just gfFile -> do gfTime <- ioeIO $ getModificationTime gfFile
- mb_gfoTime <- ioeIO $ catch (liftM Just $ getModificationTime (replaceExtension gfFile "gfo"))
- (\_->return Nothing)
- return (gfFile, Just gfTime, mb_gfoTime)
- Nothing -> do mb_gfoFile <- ioeIO $ getFilePathMsg "" ps (gfoFile name)
- case mb_gfoFile of
- Just gfoFile -> do gfoTime <- ioeIO $ getModificationTime gfoFile
- return (gfoFile, Nothing, Just gfoTime)
- Nothing -> ioeErr $ Bad ("File " ++ gfFile name ++ " does not exist.")
-
-
- let mb_envmod = Map.lookup name env
- (st,t) = selectFormat opts (fmap fst mb_envmod) gfTime gfoTime
-
- imps <- if st == CSEnv
- then return (maybe [] snd mb_envmod)
- else do s <- ioeIO $ BS.readFile file
- (mname,imps) <- ioeErr ((liftM importsOfModule . pModHeader . myLexer) s)
- ioeErr $ testErr (mname == name)
- ("module name" +++ mname +++ "differs from file name" +++ name)
- return imps
-
- return (name,st,t,imps,dropFileName file)
-
-
-isGFO :: FilePath -> Bool
-isGFO = (== ".gfo") . takeExtensions
-
-gfoFile :: FilePath -> FilePath
-gfoFile f = addExtension f "gfo"
-
-gfFile :: FilePath -> FilePath
-gfFile f = addExtension f "gf"
-
-
--- From the given Options and the time stamps computes
--- whether the module have to be computed, read from .gfo or
--- the environment version have to be used
-selectFormat :: Options -> Maybe ClockTime -> Maybe ClockTime -> Maybe ClockTime -> (CompStatus,Maybe ClockTime)
-selectFormat opts mtenv mtgf mtgfo =
- case (mtenv,mtgfo,mtgf) of
- (_,_,Just tgf) | fromSrc -> (CSComp,Nothing)
- (Just tenv,_,_) | fromComp -> (CSEnv, Just tenv)
- (_,Just tgfo,_) | fromComp -> (CSRead,Just tgfo)
- (Just tenv,_,Just tgf) | tenv > tgf -> (CSEnv, Just tenv)
- (_,Just tgfo,Just tgf) | tgfo > tgf -> (CSRead,Just tgfo)
- (Just tenv,_,Nothing) -> (CSEnv,Just tenv) -- source does not exist
- (_,_, Nothing) -> (CSRead,Nothing) -- source does not exist
- _ -> (CSComp,Nothing)
- where
- fromComp = flag optRecomp opts == NeverRecomp
- fromSrc = flag optRecomp opts == AlwaysRecomp
-
-
--- internal module dep information
-
-
-data CompStatus =
- CSComp -- compile: read gf
- | CSRead -- read gfo
- | CSEnv -- gfo is in env
- deriving Eq
-
-type ModuleInfo = (ModName,CompStatus,Maybe ClockTime,[ModName],InitPath)
-
-
-importsOfModule :: ModDef -> (ModName,[ModName])
-importsOfModule (MModule _ typ body) = modType typ (modBody body [])
- where
- modType (MTAbstract m) xs = (modName m,xs)
- modType (MTResource m) xs = (modName m,xs)
- modType (MTInterface m) xs = (modName m,xs)
- modType (MTConcrete m m2) xs = (modName m,modName m2:xs)
- modType (MTInstance m m2) xs = (modName m,modName m2:xs)
- modType (MTTransfer m o1 o2) xs = (modName m,open o1 (open o2 xs))
-
- modBody (MBody e o _) xs = extend e (opens o xs)
- modBody (MNoBody is) xs = foldr include xs is
- modBody (MWith i os) xs = include i (foldr open xs os)
- modBody (MWithBody i os o _) xs = include i (foldr open (opens o xs) os)
- modBody (MWithE is i os) xs = foldr include (include i (foldr open xs os)) is
- modBody (MWithEBody is i os o _) xs = foldr include (include i (foldr open (opens o xs) os)) is
- modBody (MReuse m) xs = modName m:xs
- modBody (MUnion is) xs = foldr include xs is
-
- include (IAll m) xs = modName m:xs
- include (ISome m _) xs = modName m:xs
- include (IMinus m _) xs = modName m:xs
-
- open (OName n) xs = modName n:xs
- open (OQualQO _ n) xs = modName n:xs
- open (OQual _ _ n) xs = modName n:xs
-
- extend NoExt xs = xs
- extend (Ext is) xs = foldr include xs is
-
- opens NoOpens xs = xs
- opens (OpenIn os) xs = foldr open xs os
-
- modName (PIdent (_,s)) = BS.unpack s
-
-
--- | options can be passed to the compiler by comments in @--#@, in the main file
-getOptionsFromFile :: FilePath -> IOE Options
-getOptionsFromFile file = do
- s <- ioeIO $ readFileIfStrict file
- let ls = filter (BS.isPrefixOf (BS.pack "--#")) $ BS.lines s
- fs = map (BS.unpack . BS.unwords . BS.words . BS.drop 3) ls
- ioeErr $ liftM moduleOptions $ parseModuleOptions fs
diff --git a/src-3.0/GF/Compile/Rebuild.hs b/src-3.0/GF/Compile/Rebuild.hs
deleted file mode 100644
index ec9076e1c..000000000
--- a/src-3.0/GF/Compile/Rebuild.hs
+++ /dev/null
@@ -1,104 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : Rebuild
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/05/30 21:08:14 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.14 $
---
--- Rebuild a source module from incomplete and its with-instance.
------------------------------------------------------------------------------
-
-module GF.Compile.Rebuild (rebuildModule) where
-
-import GF.Grammar.Grammar
-import GF.Compile.ModDeps
-import GF.Grammar.PrGrammar
-import GF.Grammar.Lookup
-import GF.Compile.Extend
-import GF.Grammar.Macros
-
-import GF.Infra.Ident
-import GF.Infra.Modules
-import GF.Infra.Option
-import GF.Data.Operations
-
-import Data.List (nub)
-
--- | rebuilding instance + interface, and "with" modules, prior to renaming.
--- AR 24/10/2003
-rebuildModule :: [SourceModule] -> SourceModule -> Err SourceModule
-rebuildModule ms mo@(i,mi) = do
- let gr = MGrammar ms
----- deps <- moduleDeps ms
----- is <- openInterfaces deps i
- let is = [] ---- the method above is buggy: try "i -src" for two grs. AR 8/3/2005
- mi' <- case mi of
-
- -- add the information given in interface into an instance module
- ModMod m -> do
- testErr (null is || mstatus m == MSIncomplete)
- ("module" +++ prt i +++
- "has open interfaces and must therefore be declared incomplete")
- case mtype m of
- MTInstance i0 -> do
- m1 <- lookupModMod gr i0
- testErr (isModRes m1) ("interface expected instead of" +++ prt i0)
- m' <- do
- js' <- extendMod False (i0,const True) i (jments m1) (jments m)
- --- to avoid double inclusions, in instance I of I0 = J0 ** ...
- case extends m of
- [] -> return $ replaceJudgements m js'
- j0s -> do
- m0s <- mapM (lookupModMod gr) j0s
- let notInM0 c _ = all (not . isInBinTree c . jments) m0s
- let js2 = filterBinTree notInM0 js'
- return $ (replaceJudgements m js2)
- {positions =
- buildTree (tree2list (positions m1) ++
- tree2list (positions m))}
- return $ ModMod m'
- _ -> return mi
-
- -- add the instance opens to an incomplete module "with" instances
- -- ModWith mt stat ext me ops -> do
- ModWith (Module mt stat fs_ me ops_ js_ ps_) (ext,incl) ops -> do
- let insts = [(inf,inst) | OQualif _ inf inst <- ops]
- let infs = map fst insts
- let stat' = ifNull MSComplete (const MSIncomplete)
- [i | i <- is, notElem i infs]
- testErr (stat' == MSComplete || stat == MSIncomplete)
- ("module" +++ prt i +++ "remains incomplete")
- Module mt0 _ fs me' ops0 js ps0 <- lookupModMod gr ext
- let ops1 = nub $
- ops_ ++ -- N.B. js has been name-resolved already
- ops ++ [o | o <- ops0, notElem (openedModule o) infs]
- ++ [oQualif i i | i <- map snd insts] ----
- ++ [oSimple i | i <- map snd insts] ----
-
- --- check if me is incomplete
- let fs1 = addModuleOptions fs fs_ -- new flags have priority
- let js0 = [ci | ci@(c,_) <- tree2list js, isInherited incl c]
- let js1 = buildTree (tree2list js_ ++ js0)
- let ps1 = buildTree (tree2list ps_ ++ tree2list ps0)
- return $ ModMod $ Module mt0 stat' fs1 me ops1 js1 ps1
- ---- (mapTree (qualifInstanceInfo insts) js) -- not needed
-
- _ -> return mi
- return (i,mi')
-
-checkCompleteInstance :: SourceRes -> SourceRes -> Err ()
-checkCompleteInstance abs cnc = ifNull (return ()) (Bad . unlines) $
- checkComplete [f | (f, ResOper (Yes _) _) <- abs'] cnc'
- where
- abs' = tree2list $ jments abs
- cnc' = jments cnc
- checkComplete sought given = foldr ckOne [] sought
- where
- ckOne f = if isInBinTree f given
- then id
- else (("Error: no definition given to" +++ prt f):)
-
diff --git a/src-3.0/GF/Compile/Refresh.hs b/src-3.0/GF/Compile/Refresh.hs
deleted file mode 100644
index 39fb57db0..000000000
--- a/src-3.0/GF/Compile/Refresh.hs
+++ /dev/null
@@ -1,133 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : Refresh
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/04/21 16:22:27 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.6 $
---
--- (Description of the module)
------------------------------------------------------------------------------
-
-module GF.Compile.Refresh (refreshTerm, refreshTermN,
- refreshModule
- ) where
-
-import GF.Data.Operations
-import GF.Grammar.Grammar
-import GF.Infra.Ident
-import GF.Infra.Modules
-import GF.Grammar.Macros
-import Control.Monad
-
-refreshTerm :: Term -> Err Term
-refreshTerm = refreshTermN 0
-
-refreshTermN :: Int -> Term -> Err Term
-refreshTermN i e = liftM snd $ refreshTermKN i e
-
-refreshTermKN :: Int -> Term -> Err (Int,Term)
-refreshTermKN i e = liftM (\ (t,(_,i)) -> (i,t)) $
- appSTM (refresh e) (initIdStateN i)
-
-refresh :: Term -> STM IdState Term
-refresh e = case e of
-
- Vr x -> liftM Vr (lookVar x)
- Abs x b -> liftM2 Abs (refVarPlus x) (refresh b)
-
- Prod x a b -> do
- a' <- refresh a
- x' <- refVar x
- b' <- refresh b
- return $ Prod x' a' b'
-
- Let (x,(mt,a)) b -> do
- a' <- refresh a
- mt' <- case mt of
- Just t -> refresh t >>= (return . Just)
- _ -> return mt
- x' <- refVar x
- b' <- refresh b
- return (Let (x',(mt',a')) b')
-
- R r -> liftM R $ refreshRecord r
-
- ExtR r s -> liftM2 ExtR (refresh r) (refresh s)
-
- T i cc -> liftM2 T (refreshTInfo i) (mapM refreshCase cc)
-
- _ -> composOp refresh e
-
-refreshCase :: (Patt,Term) -> STM IdState (Patt,Term)
-refreshCase (p,t) = liftM2 (,) (refreshPatt p) (refresh t)
-
-refreshPatt p = case p of
- PV x -> liftM PV (refVar x)
- PC c ps -> liftM (PC c) (mapM refreshPatt ps)
- PP q c ps -> liftM (PP q c) (mapM refreshPatt ps)
- PR r -> liftM PR (mapPairsM refreshPatt r)
- PT t p' -> liftM2 PT (refresh t) (refreshPatt p')
-
- PAs x p' -> liftM2 PAs (refVar x) (refreshPatt p')
-
- PSeq p' q' -> liftM2 PSeq (refreshPatt p') (refreshPatt q')
- PAlt p' q' -> liftM2 PAlt (refreshPatt p') (refreshPatt q')
- PRep p' -> liftM PRep (refreshPatt p')
- PNeg p' -> liftM PNeg (refreshPatt p')
-
- _ -> return p
-
-refreshRecord r = case r of
- [] -> return r
- (x,(mt,a)):b -> do
- a' <- refresh a
- mt' <- case mt of
- Just t -> refresh t >>= (return . Just)
- _ -> return mt
- b' <- refreshRecord b
- return $ (x,(mt',a')) : b'
-
-refreshTInfo i = case i of
- TTyped t -> liftM TTyped $ refresh t
- TComp t -> liftM TComp $ refresh t
- TWild t -> liftM TWild $ refresh t
- _ -> return i
-
--- for abstract syntax
-
-refreshEquation :: Equation -> Err ([Patt],Term)
-refreshEquation pst = err Bad (return . fst) (appSTM (refr pst) initIdState) where
- refr (ps,t) = liftM2 (,) (mapM refreshPatt ps) (refresh t)
-
--- for concrete and resource in grammar, before optimizing
-
-refreshGrammar :: SourceGrammar -> Err SourceGrammar
-refreshGrammar = liftM (MGrammar . snd) . foldM refreshModule (0,[]) . modules
-
-refreshModule :: (Int,[SourceModule]) -> SourceModule -> Err (Int,[SourceModule])
-refreshModule (k,ms) mi@(i,m) = case m of
- ModMod mo | (isModCnc mo || isModRes mo) -> do
- (k',js') <- foldM refreshRes (k,[]) $ tree2list $ jments mo
- return (k', (i, ModMod(replaceJudgements mo (buildTree js'))) : ms)
- _ -> return (k, mi:ms)
- where
- refreshRes (k,cs) ci@(c,info) = case info of
- ResOper ptyp (Yes trm) -> do ---- refresh ptyp
- (k',trm') <- refreshTermKN k trm
- return $ (k', (c, ResOper ptyp (Yes trm')):cs)
- ResOverload os tyts -> do
- (k',tyts') <- liftM (\ (t,(_,i)) -> (i,t)) $
- appSTM (mapPairsM refresh tyts) (initIdStateN k)
- return $ (k', (c, ResOverload os tyts'):cs)
- CncCat mt (Yes trm) pn -> do ---- refresh mt, pn
- (k',trm') <- refreshTermKN k trm
- return $ (k', (c, CncCat mt (Yes trm') pn):cs)
- CncFun mt (Yes trm) pn -> do ---- refresh pn
- (k',trm') <- refreshTermKN k trm
- return $ (k', (c, CncFun mt (Yes trm') pn):cs)
- _ -> return (k, ci:cs)
-
diff --git a/src-3.0/GF/Compile/RemoveLiT.hs b/src-3.0/GF/Compile/RemoveLiT.hs
deleted file mode 100644
index d06b80400..000000000
--- a/src-3.0/GF/Compile/RemoveLiT.hs
+++ /dev/null
@@ -1,64 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : RemoveLiT
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/04/21 16:21:45 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.6 $
---
--- remove obsolete (Lin C) expressions before doing anything else. AR 21/6/2003
---
--- What the program does is replace the occurrences of Lin C with the actual
--- definition T given in lincat C = T ; with {s : Str} if no lincat is found.
--- The procedure is uncertain, if T contains another Lin.
------------------------------------------------------------------------------
-
-module GF.Compile.RemoveLiT (removeLiT) where
-
-import GF.Grammar.Grammar
-import GF.Infra.Ident
-import GF.Infra.Modules
-import GF.Grammar.Macros
-import GF.Grammar.Lookup
-import GF.Grammar.Predef
-
-import GF.Data.Operations
-
-import Control.Monad
-
-removeLiT :: SourceGrammar -> Err SourceGrammar
-removeLiT gr = liftM MGrammar $ mapM (remlModule gr) (modules gr)
-
-remlModule :: SourceGrammar -> (Ident,SourceModInfo) -> Err (Ident,SourceModInfo)
-remlModule gr mi@(name,mod) = case mod of
- ModMod mo -> do
- js1 <- mapMTree (remlResInfo gr) (jments mo)
- let mod2 = ModMod $ mo {jments = js1}
- return $ (name,mod2)
- _ -> return mi
-
-remlResInfo :: SourceGrammar -> (Ident,Info) -> Err (Ident,Info)
-remlResInfo gr mi@(i,info) = case info of
- ResOper pty ptr -> liftM ((,) i) $ liftM2 ResOper (ren pty) (ren ptr)
- CncCat pty ptr ppr -> liftM ((,) i) $ liftM3 CncCat (ren pty) (ren ptr) (ren ppr)
- CncFun mt ptr ppr -> liftM ((,) i) $ liftM2 (CncFun mt) (ren ptr) (ren ppr)
- _ -> return mi
- where
- ren = remlPerh gr
-
-remlPerh gr pt = case pt of
- Yes t -> liftM Yes $ remlTerm gr t
- _ -> return pt
-
-remlTerm :: SourceGrammar -> Term -> Err Term
-remlTerm gr trm = case trm of
- LiT c -> look c >>= remlTerm gr
- _ -> composOp (remlTerm gr) trm
- where
- look c = err (const $ return defLinType) return $ lookupLincat gr m c
- m = case [cnc | (cnc,ModMod m) <- modules gr, isModCnc m] of
- cnc:_ -> cnc -- actually there is always exactly one
- _ -> cCNC
diff --git a/src-3.0/GF/Compile/Rename.hs b/src-3.0/GF/Compile/Rename.hs
deleted file mode 100644
index 7b4d09277..000000000
--- a/src-3.0/GF/Compile/Rename.hs
+++ /dev/null
@@ -1,338 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : Rename
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/05/30 18:39:44 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.19 $
---
--- AR 14\/5\/2003
--- The top-level function 'renameGrammar' does several things:
---
--- - extends each module symbol table by indirections to extended module
---
--- - changes unqualified and as-qualified imports to absolutely qualified
---
--- - goes through the definitions and resolves names
---
--- Dependency analysis between modules has been performed before this pass.
--- Hence we can proceed by @fold@ing "from left to right".
------------------------------------------------------------------------------
-
-module GF.Compile.Rename (renameGrammar,
- renameSourceTerm,
- renameModule
- ) where
-
-import GF.Grammar.Grammar
-import GF.Grammar.Values
-import GF.Grammar.Predef
-import GF.Infra.Modules
-import GF.Infra.Ident
-import GF.Grammar.Macros
-import GF.Grammar.PrGrammar
-import GF.Grammar.AppPredefined
-import GF.Grammar.Lookup
-import GF.Compile.Extend
-import GF.Data.Operations
-
-import Control.Monad
-import Data.List (nub)
-import Debug.Trace (trace)
-
-renameGrammar :: SourceGrammar -> Err SourceGrammar
-renameGrammar g = liftM (MGrammar . reverse) $ foldM renameModule [] (modules g)
-
--- | this gives top-level access to renaming term input in the cc command
-renameSourceTerm :: SourceGrammar -> Ident -> Term -> Err Term
-renameSourceTerm g m t = do
- mo <- lookupErr m (modules g)
- status <- buildStatus g m mo
- renameTerm status [] t
-
-renameModule :: [SourceModule] -> SourceModule -> Err [SourceModule]
-renameModule ms (name,mod) = errIn ("renaming module" +++ prt name) $ case mod of
- ModMod mo -> do
- let js1 = jments mo
- status <- buildStatus (MGrammar ms) name mod
- js2 <- mapsErrTree (renameInfo mo status) js1
- let mod2 = ModMod $ mo {opens = map forceQualif (opens mo), jments = js2}
- return $ (name,mod2) : ms
-
-type Status = (StatusTree, [(OpenSpec Ident, StatusTree)])
-
-type StatusTree = BinTree Ident StatusInfo
-
-type StatusInfo = Ident -> Term
-
-renameIdentTerm :: Status -> Term -> Err Term
-renameIdentTerm env@(act,imps) t =
- errIn ("atomic term" +++ prt t +++ "given" +++ unwords (map (prt . fst) qualifs)) $
- case t of
- Vr c -> ident predefAbs c
- Cn c -> ident (\_ s -> Bad s) c
- Q m' c | m' == cPredef {- && isInPredefined c -} -> return t
- Q m' c -> do
- m <- lookupErr m' qualifs
- f <- lookupTree prt c m
- return $ f c
- QC m' c | m' == cPredef {- && isInPredefined c -} -> return t
- QC m' c -> do
- m <- lookupErr m' qualifs
- f <- lookupTree prt c m
- return $ f c
- _ -> return t
- where
- opens = [st | (OSimple _ _,st) <- imps]
- qualifs = [(m, st) | (OQualif _ m _, st) <- imps] ++
- [(m, st) | (OSimple _ m, st) <- imps] -- qualif is always possible
-
- -- this facility is mainly for BWC with GF1: you need not import PredefAbs
- predefAbs c s
- | isPredefCat c = return $ Q cPredefAbs c
- | otherwise = Bad s
-
- ident alt c = case lookupTree prt c act of
- Ok f -> return $ f c
- _ -> case lookupTreeManyAll prt opens c of
- [f] -> return $ f c
- [] -> alt c ("constant not found:" +++ prt c)
- fs -> case nub [f c | f <- fs] of
- [tr] -> return tr
- ts@(t:_) -> trace ("WARNING: conflict" +++ unwords (map prt ts)) (return t)
- -- a warning will be generated in CheckGrammar, and the head returned
- -- in next V:
- -- Bad $ "conflicting imports:" +++ unwords (map prt ts)
-
-
---- | would it make sense to optimize this by inlining?
-renameIdentPatt :: Status -> Patt -> Err Patt
-renameIdentPatt env p = do
- let t = patt2term p
- t' <- renameIdentTerm env t
- term2patt t'
-
-info2status :: Maybe Ident -> (Ident,Info) -> (Ident,StatusInfo)
-info2status mq (c,i) = (c, case i of
- AbsFun _ (Yes EData) -> maybe Con QC mq
- ResValue _ -> maybe Con QC mq
- ResParam _ -> maybe Con QC mq
- AnyInd True m -> maybe Con (const (QC m)) mq
- AnyInd False m -> maybe Cn (const (Q m)) mq
- _ -> maybe Cn Q mq
- )
-
-tree2status :: OpenSpec Ident -> BinTree Ident Info -> BinTree Ident StatusInfo
-tree2status o = case o of
- OSimple _ i -> mapTree (info2status (Just i))
- OQualif _ i j -> mapTree (info2status (Just j))
-
-buildStatus :: SourceGrammar -> Ident -> SourceModInfo -> Err Status
-buildStatus gr c mo = let mo' = self2status c mo in case mo of
- ModMod m -> do
- let gr1 = MGrammar $ (c,mo) : modules gr
- ops = [OSimple OQNormal e | e <- allExtends gr1 c] ++ allOpens m
- mods <- mapM (lookupModule gr1 . openedModule) ops
- let sts = map modInfo2status $ zip ops mods
- return $ if isModCnc m
- then (emptyBinTree, reverse sts) -- the module itself does not define any names
- else (mo',reverse sts) -- so the empty ident is not needed
-
-modInfo2status :: (OpenSpec Ident,SourceModInfo) -> (OpenSpec Ident, StatusTree)
-modInfo2status (o,i) = (o,case i of
- ModMod m -> tree2status o (jments m)
- )
-
-self2status :: Ident -> SourceModInfo -> StatusTree
-self2status c i = mapTree (info2status (Just c)) js where -- qualify internal
- js = case i of
- ModMod m
- | isModTrans m -> sorted2tree $ filter noTrans $ tree2list $ jments m
- | otherwise -> jments m
- noTrans (_,d) = case d of -- to enable other than transfer js in transfer module
- AbsTrans _ -> False
- _ -> True
-
-forceQualif o = case o of
- OSimple q i -> OQualif q i i
- OQualif q _ i -> OQualif q i i
-
-renameInfo :: Module Ident Info -> Status -> (Ident,Info) -> Err (Ident,Info)
-renameInfo mo status (i,info) = errIn
- ("renaming definition of" +++ prt i +++ showPosition mo i) $
- liftM ((,) i) $ case info of
- AbsCat pco pfs -> liftM2 AbsCat (renPerh (renameContext status) pco)
- (renPerh (mapM rent) pfs)
- AbsFun pty ptr -> liftM2 AbsFun (ren pty) (ren ptr)
- AbsTrans f -> liftM AbsTrans (rent f)
-
- ResOper pty ptr -> liftM2 ResOper (ren pty) (ren ptr)
- ResOverload os tysts ->
- liftM (ResOverload os) (mapM (pairM rent) tysts)
-
- ResParam (Yes (pp,m)) -> do
- pp' <- mapM (renameParam status) pp
- return $ ResParam $ Yes (pp',m)
- ResValue (Yes (t,m)) -> do
- t' <- rent t
- return $ ResValue $ Yes (t',m)
- CncCat pty ptr ppr -> liftM3 CncCat (ren pty) (ren ptr) (ren ppr)
- CncFun mt ptr ppr -> liftM2 (CncFun mt) (ren ptr) (ren ppr)
- _ -> return info
- where
- ren = renPerh rent
- rent = renameTerm status []
-
-renPerh ren pt = case pt of
- Yes t -> liftM Yes $ ren t
- _ -> return pt
-
-renameTerm :: Status -> [Ident] -> Term -> Err Term
-renameTerm env vars = ren vars where
- ren vs trm = case trm of
- Abs x b -> liftM (Abs x) (ren (x:vs) b)
- Prod x a b -> liftM2 (Prod x) (ren vs a) (ren (x:vs) b)
- Typed a b -> liftM2 Typed (ren vs a) (ren vs b)
- Vr x
- | elem x vs -> return trm
- | otherwise -> renid trm
- Cn _ -> renid trm
- Con _ -> renid trm
- Q _ _ -> renid trm
- QC _ _ -> renid trm
- Eqs eqs -> liftM Eqs $ mapM (renameEquation env vars) eqs
- T i cs -> do
- i' <- case i of
- TTyped ty -> liftM TTyped $ ren vs ty -- the only annotation in source
- _ -> return i
- liftM (T i') $ mapM (renCase vs) cs
-
- Let (x,(m,a)) b -> do
- m' <- case m of
- Just ty -> liftM Just $ ren vs ty
- _ -> return m
- a' <- ren vs a
- b' <- ren (x:vs) b
- return $ Let (x,(m',a')) b'
-
- P t@(Vr r) l -- for constant t we know it is projection
- | elem r vs -> return trm -- var proj first
- | otherwise -> case renid (Q r (label2ident l)) of -- qualif second
- Ok t -> return t
- _ -> case liftM (flip P l) $ renid t of
- Ok t -> return t -- const proj last
- _ -> prtBad "unknown qualified constant" trm
-
- EPatt p -> do
- (p',_) <- renpatt p
- return $ EPatt p'
-
- _ -> composOp (ren vs) trm
-
- renid = renameIdentTerm env
- renCase vs (p,t) = do
- (p',vs') <- renpatt p
- t' <- ren (vs' ++ vs) t
- return (p',t')
- renpatt = renamePattern env
-
--- | vars not needed in env, since patterns always overshadow old vars
-renamePattern :: Status -> Patt -> Err (Patt,[Ident])
-renamePattern env patt = case patt of
-
- PMacro c -> do
- c' <- renid $ Vr c
- case c' of
- Q p d -> renp $ PM p d
- _ -> prtBad "unresolved pattern" patt
-
- PC c ps -> do
- c' <- renameIdentTerm env $ Cn c
- case c' of
- QC p d -> renp $ PP p d ps
--- Q p d -> renp $ PP p d ps --- why this? AR 15/3/2008
- _ -> prtBad "unresolved pattern" c' ---- (PC c ps', concat vs)
-
- PP p c ps -> do
-
- (p', c') <- case renameIdentTerm env (QC p c) of
- Ok (QC p' c') -> return (p',c')
- _ -> return (p,c) --- temporarily, for bw compat
- psvss <- mapM renp ps
- let (ps',vs) = unzip psvss
- return (PP p' c' ps', concat vs)
-
- PM p c -> do
- (p', c') <- case renameIdentTerm env (Q p c) of
- Ok (Q p' c') -> return (p',c')
- _ -> prtBad "not a pattern macro" patt
- return (PM p' c', [])
-
- PV x -> case renid (Vr x) of
- Ok (QC m c) -> return (PP m c [],[])
- _ -> return (patt, [x])
-
- PR r -> do
- let (ls,ps) = unzip r
- psvss <- mapM renp ps
- let (ps',vs') = unzip psvss
- return (PR (zip ls ps'), concat vs')
-
- PAlt p q -> do
- (p',vs) <- renp p
- (q',ws) <- renp q
- return (PAlt p' q', vs ++ ws)
-
- PSeq p q -> do
- (p',vs) <- renp p
- (q',ws) <- renp q
- return (PSeq p' q', vs ++ ws)
-
- PRep p -> do
- (p',vs) <- renp p
- return (PRep p', vs)
-
- PNeg p -> do
- (p',vs) <- renp p
- return (PNeg p', vs)
-
- PAs x p -> do
- (p',vs) <- renp p
- return (PAs x p', x:vs)
-
- _ -> return (patt,[])
-
- where
- renp = renamePattern env
- renid = renameIdentTerm env
-
-renameParam :: Status -> (Ident, Context) -> Err (Ident, Context)
-renameParam env (c,co) = do
- co' <- renameContext env co
- return (c,co')
-
-renameContext :: Status -> Context -> Err Context
-renameContext b = renc [] where
- renc vs cont = case cont of
- (x,t) : xts
- | isWildIdent x -> do
- t' <- ren vs t
- xts' <- renc vs xts
- return $ (x,t') : xts'
- | otherwise -> do
- t' <- ren vs t
- let vs' = x:vs
- xts' <- renc vs' xts
- return $ (x,t') : xts'
- _ -> return cont
- ren = renameTerm b
-
--- | vars not needed in env, since patterns always overshadow old vars
-renameEquation :: Status -> [Ident] -> Equation -> Err Equation
-renameEquation b vs (ps,t) = do
- (ps',vs') <- liftM unzip $ mapM (renamePattern b) ps
- t' <- renameTerm b (concat vs' ++ vs) t
- return (ps',t')
diff --git a/src-3.0/GF/Compile/TC.hs b/src-3.0/GF/Compile/TC.hs
deleted file mode 100644
index c0c8a83ae..000000000
--- a/src-3.0/GF/Compile/TC.hs
+++ /dev/null
@@ -1,292 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : TC
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/10/02 20:50:19 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.11 $
---
--- Thierry Coquand's type checking algorithm that creates a trace
------------------------------------------------------------------------------
-
-module GF.Compile.TC (AExp(..),
- Theory,
- checkExp,
- inferExp,
- checkEqs,
- eqVal,
- whnf
- ) where
-
-import GF.Data.Operations
-import GF.Grammar.Predef
-import GF.Grammar.Abstract
-
-import Control.Monad
-import Data.List (sortBy)
-
-data AExp =
- AVr Ident Val
- | ACn QIdent Val
- | AType
- | AInt Integer
- | AFloat Double
- | AStr String
- | AMeta MetaSymb Val
- | AApp AExp AExp Val
- | AAbs Ident Val AExp
- | AProd Ident AExp AExp
- | AEqs [([Exp],AExp)] --- not used
- | AData Val
- deriving (Eq,Show)
-
-type Theory = QIdent -> Err Val
-
-lookupConst :: Theory -> QIdent -> Err Val
-lookupConst th f = th f
-
-lookupVar :: Env -> Ident -> Err Val
-lookupVar g x = maybe (prtBad "unknown variable" x) return $ lookup x ((IW,uVal):g)
--- wild card IW: no error produced, ?0 instead.
-
-type TCEnv = (Int,Env,Env)
-
-emptyTCEnv :: TCEnv
-emptyTCEnv = (0,[],[])
-
-whnf :: Val -> Err Val
-whnf v = ---- errIn ("whnf" +++ prt v) $ ---- debug
- case v of
- VApp u w -> do
- u' <- whnf u
- w' <- whnf w
- app u' w'
- VClos env e -> eval env e
- _ -> return v
-
-app :: Val -> Val -> Err Val
-app u v = case u of
- VClos env (Abs x e) -> eval ((x,v):env) e
- _ -> return $ VApp u v
-
-eval :: Env -> Exp -> Err Val
-eval env e = ---- errIn ("eval" +++ prt e +++ "in" +++ prEnv env) $
- case e of
- Vr x -> lookupVar env x
- Q m c -> return $ VCn (m,c)
- QC m c -> return $ VCn (m,c) ---- == Q ?
- Sort c -> return $ VType --- the only sort is Type
- App f a -> join $ liftM2 app (eval env f) (eval env a)
- _ -> return $ VClos env e
-
-eqVal :: Int -> Val -> Val -> Err [(Val,Val)]
-eqVal k u1 u2 = ---- errIn (prt u1 +++ "<>" +++ prBracket (show k) +++ prt u2) $
- do
- w1 <- whnf u1
- w2 <- whnf u2
- let v = VGen k
- case (w1,w2) of
- (VApp f1 a1, VApp f2 a2) -> liftM2 (++) (eqVal k f1 f2) (eqVal k a1 a2)
- (VClos env1 (Abs x1 e1), VClos env2 (Abs x2 e2)) ->
- eqVal (k+1) (VClos ((x1,v x1):env1) e1) (VClos ((x2,v x1):env2) e2)
- (VClos env1 (Prod x1 a1 e1), VClos env2 (Prod x2 a2 e2)) ->
- liftM2 (++)
- (eqVal k (VClos env1 a1) (VClos env2 a2))
- (eqVal (k+1) (VClos ((x1,v x1):env1) e1) (VClos ((x2,v x1):env2) e2))
- (VGen i _, VGen j _) -> return [(w1,w2) | i /= j]
- (VCn (_, i), VCn (_,j)) -> return [(w1,w2) | i /= j]
- --- thus ignore qualifications; valid because inheritance cannot
- --- be qualified. Simplifies annotation. AR 17/3/2005
- _ -> return [(w1,w2) | w1 /= w2]
--- invariant: constraints are in whnf
-
-checkType :: Theory -> TCEnv -> Exp -> Err (AExp,[(Val,Val)])
-checkType th tenv e = checkExp th tenv e vType
-
-checkExp :: Theory -> TCEnv -> Exp -> Val -> Err (AExp, [(Val,Val)])
-checkExp th tenv@(k,rho,gamma) e ty = do
- typ <- whnf ty
- let v = VGen k
- case e of
- Meta m -> return $ (AMeta m typ,[])
- EData -> return $ (AData typ,[])
-
- Abs x t -> case typ of
- VClos env (Prod y a b) -> do
- a' <- whnf $ VClos env a ---
- (t',cs) <- checkExp th
- (k+1,(x,v x):rho, (x,a'):gamma) t (VClos ((y,v x):env) b)
- return (AAbs x a' t', cs)
- _ -> prtBad ("function type expected for" +++ prt e +++ "instead of") typ
-
--- {- --- to get deprec when checkEqs works (15/9/2005)
- Eqs es -> do
- bcs <- mapM (\b -> checkBranch th tenv b typ) es
- let (bs,css) = unzip bcs
- return (AEqs bs, concat css)
--- - }
- Prod x a b -> do
- testErr (typ == vType) "expected Type"
- (a',csa) <- checkType th tenv a
- (b',csb) <- checkType th (k+1, (x,v x):rho, (x,VClos rho a):gamma) b
- return (AProd x a' b', csa ++ csb)
-
- _ -> checkInferExp th tenv e typ
-
-checkInferExp :: Theory -> TCEnv -> Exp -> Val -> Err (AExp, [(Val,Val)])
-checkInferExp th tenv@(k,_,_) e typ = do
- (e',w,cs1) <- inferExp th tenv e
- cs2 <- eqVal k w typ
- return (e',cs1 ++ cs2)
-
-inferExp :: Theory -> TCEnv -> Exp -> Err (AExp, Val, [(Val,Val)])
-inferExp th tenv@(k,rho,gamma) e = case e of
- Vr x -> mkAnnot (AVr x) $ noConstr $ lookupVar gamma x
- Q m c | m == cPredefAbs && isPredefCat c
- -> return (ACn (m,c) vType, vType, [])
- | otherwise -> mkAnnot (ACn (m,c)) $ noConstr $ lookupConst th (m,c)
- QC m c -> mkAnnot (ACn (m,c)) $ noConstr $ lookupConst th (m,c) ----
- EInt i -> return (AInt i, valAbsInt, [])
- EFloat i -> return (AFloat i, valAbsFloat, [])
- K i -> return (AStr i, valAbsString, [])
- Sort _ -> return (AType, vType, [])
- App f t -> do
- (f',w,csf) <- inferExp th tenv f
- typ <- whnf w
- case typ of
- VClos env (Prod x a b) -> do
- (a',csa) <- checkExp th tenv t (VClos env a)
- b' <- whnf $ VClos ((x,VClos rho t):env) b
- return $ (AApp f' a' b', b', csf ++ csa)
- _ -> prtBad ("Prod expected for function" +++ prt f +++ "instead of") typ
- _ -> prtBad "cannot infer type of expression" e
-
-checkEqs :: Theory -> TCEnv -> (Fun,Trm) -> Val -> Err [(Val,Val)]
-checkEqs th tenv@(k,rho,gamma) (fun@(m,f),def) val = case def of
- Eqs es -> liftM concat $ mapM checkBranch es
- _ -> liftM snd $ checkExp th tenv def val
- where
- checkBranch (ps,df) =
- let
- (ps',_,vars) = foldr p2t ([],0,[]) ps
- fps = mkApp (Q m f) ps'
- in errIn ("branch" +++ prt fps) $ do
- (aexp, typ, cs1) <- inferExp th tenv fps
- let
- bds = binds vars aexp
- tenv' = (k, rho, bds ++ gamma)
- (_,cs2) <- errIn (show bds) $ checkExp th tenv' df typ
- return $ (cs1 ++ cs2)
- p2t p (ps,i,g) = case p of
- PW -> (Meta (MetaSymb i) : ps, i+1, g)
- PV IW -> (Meta (MetaSymb i) : ps, i+1, g)
- PV x -> (Meta (MetaSymb i) : ps, i+1,upd x i g)
- PString s -> ( K s : ps, i, g)
- PInt n -> (EInt n : ps, i, g)
- PFloat n -> (EFloat n : ps, i, g)
- PP m c xs -> (mkApp (qq (m,c)) xss : ps, i', g')
- where (xss,i',g') = foldr p2t ([],i,g) xs
- _ -> error $ "undefined p2t case" +++ prt p +++ "in checkBranch"
- upd x i g = (x,i) : g --- to annotate pattern variables: treat as metas
-
- -- notice: in vars, the sequence 0.. is sorted. In subst aexp, all
- -- this occurs and nothing else.
- binds vars aexp = [(x,v) | ((x,_),v) <- zip vars metas] where
- metas = map snd $ sortBy (\ (x,_) (y,_) -> compare x y) $ subst aexp
- subst aexp = case aexp of
- AMeta (MetaSymb i) v -> [(i,v)]
- AApp c a _ -> subst c ++ subst a
- _ -> [] -- never matter in patterns
-
-checkBranch :: Theory -> TCEnv -> Equation -> Val -> Err (([Exp],AExp),[(Val,Val)])
-checkBranch th tenv b@(ps,t) ty = errIn ("branch" +++ show b) $
- chB tenv' ps' ty
- where
-
- (ps',_,rho2,k') = ps2ts k ps
- tenv' = (k, rho2++rho, gamma) ---- k' ?
- (k,rho,gamma) = tenv
-
- chB tenv@(k,rho,gamma) ps ty = case ps of
- p:ps2 -> do
- typ <- whnf ty
- case typ of
- VClos env (Prod y a b) -> do
- a' <- whnf $ VClos env a
- (p', sigma, binds, cs1) <- checkP tenv p y a'
- let tenv' = (length binds, sigma ++ rho, binds ++ gamma)
- ((ps',exp),cs2) <- chB tenv' ps2 (VClos ((y,p'):env) b)
- return ((p:ps',exp), cs1 ++ cs2) -- don't change the patt
- _ -> prtBad ("Product expected for definiens" +++prt t +++ "instead of") typ
- [] -> do
- (e,cs) <- checkExp th tenv t ty
- return (([],e),cs)
- checkP env@(k,rho,gamma) t x a = do
- (delta,cs) <- checkPatt th env t a
- let sigma = [(x, VGen i x) | ((x,_),i) <- zip delta [k..]]
- return (VClos sigma t, sigma, delta, cs)
-
- ps2ts k = foldr p2t ([],0,[],k)
- p2t p (ps,i,g,k) = case p of
- PW -> (Meta (MetaSymb i) : ps, i+1,g,k)
- PV IW -> (Meta (MetaSymb i) : ps, i+1,g,k)
- PV x -> (Vr x : ps, i, upd x k g,k+1)
- PString s -> (K s : ps, i, g, k)
- PInt n -> (EInt n : ps, i, g, k)
- PFloat n -> (EFloat n : ps, i, g, k)
- PP m c xs -> (mkApp (qq (m,c)) xss : ps, j, g',k')
- where (xss,j,g',k') = foldr p2t ([],i,g,k) xs
- _ -> error $ "undefined p2t case" +++ prt p +++ "in checkBranch"
-
- upd x k g = (x, VGen k x) : g --- hack to recognize pattern variables
-
-
-checkPatt :: Theory -> TCEnv -> Exp -> Val -> Err (Binds,[(Val,Val)])
-checkPatt th tenv exp val = do
- (aexp,_,cs) <- checkExpP tenv exp val
- let binds = extrBinds aexp
- return (binds,cs)
- where
- extrBinds aexp = case aexp of
- AVr i v -> [(i,v)]
- AApp f a _ -> extrBinds f ++ extrBinds a
- _ -> [] -- no other cases are possible
-
---- ad hoc, to find types of variables
- checkExpP tenv@(k,rho,gamma) exp val = case exp of
- Meta m -> return $ (AMeta m val, val, [])
- Vr x -> return $ (AVr x val, val, [])
- EInt i -> return (AInt i, valAbsInt, [])
- EFloat i -> return (AFloat i, valAbsFloat, [])
- K s -> return (AStr s, valAbsString, [])
-
- Q m c -> do
- typ <- lookupConst th (m,c)
- return $ (ACn (m,c) typ, typ, [])
- QC m c -> do
- typ <- lookupConst th (m,c)
- return $ (ACn (m,c) typ, typ, []) ----
- App f t -> do
- (f',w,csf) <- checkExpP tenv f val
- typ <- whnf w
- case typ of
- VClos env (Prod x a b) -> do
- (a',_,csa) <- checkExpP tenv t (VClos env a)
- b' <- whnf $ VClos ((x,VClos rho t):env) b
- return $ (AApp f' a' b', b', csf ++ csa)
- _ -> prtBad ("Prod expected for function" +++ prt f +++ "instead of") typ
- _ -> prtBad "cannot typecheck pattern" exp
-
--- auxiliaries
-
-noConstr :: Err Val -> Err (Val,[(Val,Val)])
-noConstr er = er >>= (\v -> return (v,[]))
-
-mkAnnot :: (Val -> AExp) -> Err (Val,[(Val,Val)]) -> Err (AExp,Val,[(Val,Val)])
-mkAnnot a ti = do
- (v,cs) <- ti
- return (a v, v, cs)
-
diff --git a/src-3.0/GF/Compile/TypeCheck.hs b/src-3.0/GF/Compile/TypeCheck.hs
deleted file mode 100644
index 2d58a33ee..000000000
--- a/src-3.0/GF/Compile/TypeCheck.hs
+++ /dev/null
@@ -1,118 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : TypeCheck
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/09/15 16:22:02 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.16 $
---
--- (Description of the module)
------------------------------------------------------------------------------
-
-module GF.Compile.TypeCheck (-- * top-level type checking functions; TC should not be called directly.
- checkContext,
- checkTyp,
- checkEquation,
- checkConstrs,
- ) where
-
-import GF.Data.Operations
-import GF.Data.Zipper
-
-import GF.Grammar.Abstract
-import GF.Compile.Refresh
-import GF.Grammar.LookAbs
-import qualified GF.Grammar.Lookup as Lookup ---
-import GF.Grammar.Unify ---
-
-import GF.Compile.TC
-
-import Control.Monad (foldM, liftM, liftM2)
-import Data.List (nub) ---
-
--- | invariant way of creating TCEnv from context
-initTCEnv gamma =
- (length gamma,[(x,VGen i x) | ((x,_),i) <- zip gamma [0..]], gamma)
-
--- interface to TC type checker
-
-type2val :: Type -> Val
-type2val = VClos []
-
-aexp2tree :: (AExp,[(Val,Val)]) -> Err Tree
-aexp2tree (aexp,cs) = do
- (bi,at,vt,ts) <- treeForm aexp
- ts' <- mapM aexp2tree [(t,[]) | t <- ts]
- return $ Tr (N (bi,at,vt,(cs,[]),False),ts')
- where
- treeForm a = case a of
- AAbs x v b -> do
- (bi, at, vt, args) <- treeForm b
- v' <- whnf v ---- should not be needed...
- return ((x,v') : bi, at, vt, args)
- AApp c a v -> do
- (_,at,_,args) <- treeForm c
- v' <- whnf v ----
- return ([],at,v',args ++ [a])
- AVr x v -> do
- v' <- whnf v ----
- return ([],AtV x,v',[])
- ACn c v -> do
- v' <- whnf v ----
- return ([],AtC c,v',[])
- AInt i -> do
- return ([],AtI i,valAbsInt,[])
- AFloat i -> do
- return ([],AtF i,valAbsFloat,[])
- AStr s -> do
- return ([],AtL s,valAbsString,[])
- AMeta m v -> do
- v' <- whnf v ----
- return ([],AtM m,v',[])
- _ -> Bad "illegal tree" -- AProd
-
-cont2exp :: Context -> Exp
-cont2exp c = mkProd (c, eType, []) -- to check a context
-
-cont2val :: Context -> Val
-cont2val = type2val . cont2exp
-
--- some top-level batch-mode checkers for the compiler
-
-justTypeCheck :: Grammar -> Exp -> Val -> Err Constraints
-justTypeCheck gr e v = do
- (_,constrs0) <- checkExp (grammar2theory gr) (initTCEnv []) e v
- return $ filter notJustMeta constrs0
----- return $ fst $ splitConstraintsSrc gr constrs0
----- this change was to force proper tc of abstract modules.
----- May not be quite right. AR 13/9/2005
-
-notJustMeta (c,k) = case (c,k) of
- (VClos g1 (Meta m1), VClos g2 (Meta m2)) -> False
- _ -> True
-
-grammar2theory :: Grammar -> Theory
-grammar2theory gr (m,f) = case lookupFunType gr m f of
- Ok t -> return $ type2val t
- Bad s -> case lookupCatContext gr m f of
- Ok cont -> return $ cont2val cont
- _ -> Bad s
-
-checkContext :: Grammar -> Context -> [String]
-checkContext st = checkTyp st . cont2exp
-
-checkTyp :: Grammar -> Type -> [String]
-checkTyp gr typ = err singleton prConstrs $ justTypeCheck gr typ vType
-
-checkEquation :: Grammar -> Fun -> Trm -> [String]
-checkEquation gr (m,fun) def = err singleton id $ do
- typ <- lookupFunType gr m fun
- cs <- justTypeCheck gr def (vClos typ)
- let cs1 = filter notJustMeta cs
- return $ ifNull [] (singleton . prConstraints) cs1
-
-checkConstrs :: Grammar -> Cat -> [Ident] -> [String]
-checkConstrs gr cat _ = [] ---- check constructors!
diff --git a/src-3.0/GF/Compile/Update.hs b/src-3.0/GF/Compile/Update.hs
deleted file mode 100644
index 82d7a609e..000000000
--- a/src-3.0/GF/Compile/Update.hs
+++ /dev/null
@@ -1,135 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : Update
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/05/30 18:39:44 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.8 $
---
--- (Description of the module)
------------------------------------------------------------------------------
-
-module GF.Compile.Update (updateRes, buildAnyTree, combineAnyInfos, unifyAnyInfo,
- -- * these auxiliaries should be somewhere else
- -- since they don't use the info types
- groupInfos, sortInfos, combineInfos, unifyInfos,
- tryInsert, unifAbsDefs, unifConstrs
- ) where
-
-import GF.Infra.Ident
-import GF.Grammar.Grammar
-import GF.Grammar.PrGrammar
-import GF.Infra.Modules
-
-import GF.Data.Operations
-
-import Data.List
-import Control.Monad
-
--- | update a resource module by adding a new or changing an old definition
-updateRes :: SourceGrammar -> Ident -> Ident -> Info -> SourceGrammar
-updateRes gr@(MGrammar ms) m i info = MGrammar $ map upd ms where
- upd (n,mod)
- | n /= m = (n,mod)
- | n == m = case mod of
- ModMod r -> (m,ModMod $ updateModule r i info)
- _ -> (n,mod) --- no error msg
-
--- | combine a list of definitions into a balanced binary search tree
-buildAnyTree :: [(Ident,Info)] -> Err (BinTree Ident Info)
-buildAnyTree ias = do
- ias' <- combineAnyInfos ias
- return $ buildTree ias'
-
-
--- | unifying information for abstract, resource, and concrete
-combineAnyInfos :: [(Ident,Info)] -> Err [(Ident,Info)]
-combineAnyInfos = combineInfos unifyAnyInfo
-
-unifyAnyInfo :: Ident -> Info -> Info -> Err Info
-unifyAnyInfo c i j = errIn ("combining information for" +++ prt c) $ case (i,j) of
- (AbsCat mc1 mf1, AbsCat mc2 mf2) ->
- liftM2 AbsCat (unifPerhaps mc1 mc2) (unifConstrs mf1 mf2) -- adding constrs
- (AbsFun mt1 md1, AbsFun mt2 md2) ->
- liftM2 AbsFun (unifPerhaps mt1 mt2) (unifAbsDefs md1 md2) -- adding defs
-
- (ResParam mt1, ResParam mt2) -> liftM ResParam $ unifPerhaps mt1 mt2
- (ResOper mt1 m1, ResOper mt2 m2) ->
- liftM2 ResOper (unifPerhaps mt1 mt2) (unifPerhaps m1 m2)
-
- (CncCat mc1 mf1 mp1, CncCat mc2 mf2 mp2) ->
- liftM3 CncCat (unifPerhaps mc1 mc2) (unifPerhaps mf1 mf2) (unifPerhaps mp1 mp2)
- (CncFun m mt1 md1, CncFun _ mt2 md2) ->
- liftM2 (CncFun m) (unifPerhaps mt1 mt2) (unifPerhaps md1 md2) ---- adding defs
--- for bw compatibility with unspecified printnames in old GF
- (CncFun Nothing Nope (Yes pr),_) ->
- unifyAnyInfo c (CncCat Nope Nope (Yes pr)) j
- (_,CncFun Nothing Nope (Yes pr)) ->
- unifyAnyInfo c i (CncCat Nope Nope (Yes pr))
-
- _ -> Bad $ "cannot unify informations in" ++++ show i ++++ "and" ++++ show j
-
---- these auxiliaries should be somewhere else since they don't use the info types
-
-groupInfos :: Eq a => [(a,b)] -> [[(a,b)]]
-groupInfos = groupBy (\i j -> fst i == fst j)
-
-sortInfos :: Ord a => [(a,b)] -> [(a,b)]
-sortInfos = sortBy (\i j -> compare (fst i) (fst j))
-
-combineInfos :: Ord a => (a -> b -> b -> Err b) -> [(a,b)] -> Err [(a,b)]
-combineInfos f ris = do
- let riss = groupInfos $ sortInfos ris
- mapM (unifyInfos f) riss
-
-unifyInfos :: (a -> b -> b -> Err b) -> [(a,b)] -> Err (a,b)
-unifyInfos _ [] = Bad "empty info list"
-unifyInfos unif ris = do
- let c = fst $ head ris
- let infos = map snd ris
- let ([i],is) = splitAt 1 infos
- info <- foldM (unif c) i is
- return (c,info)
-
-
-tryInsert :: Ord a => (b -> b -> Err b) -> (b -> b) ->
- BinTree a b -> (a,b) -> Err (BinTree a b)
-tryInsert unif indir tree z@(x, info) = case justLookupTree x tree of
- Ok info0 -> do
- info1 <- unif info info0
- return $ updateTree (x,info1) tree
- _ -> return $ updateTree (x,indir info) tree
-
-{- ----
-case tree of
- NT -> return $ BT (x, indir info) NT NT
- BT c@(a,info0) left right
- | x < a -> do
- left' <- tryInsert unif indir left z
- return $ BT c left' right
- | x > a -> do
- right' <- tryInsert unif indir right z
- return $ BT c left right'
- | x == a -> do
- info' <- unif info info0
- return $ BT (x,info') left right
--}
-
---- addToMaybeList m c = maybe (return c) (\old -> return (c ++ old)) m
-
-unifAbsDefs :: Perh Term -> Perh Term -> Err (Perh Term)
-unifAbsDefs p1 p2 = case (p1,p2) of
- (Nope, _) -> return p2
- (_, Nope) -> return p1
- (Yes (Eqs bs), Yes (Eqs ds)) -> return $ yes $ Eqs $ bs ++ ds --- order!
- _ -> Bad "update conflict for definitions"
-
-unifConstrs :: Perh [Term] -> Perh [Term] -> Err (Perh [Term])
-unifConstrs p1 p2 = case (p1,p2) of
- (Nope, _) -> return p2
- (_, Nope) -> return p1
- (Yes bs, Yes ds) -> return $ yes $ bs ++ ds
- _ -> Bad "update conflict for constructors"
diff --git a/src-3.0/GF/Data/Assoc.hs b/src-3.0/GF/Data/Assoc.hs
deleted file mode 100644
index f775319ea..000000000
--- a/src-3.0/GF/Data/Assoc.hs
+++ /dev/null
@@ -1,143 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : Assoc
--- Maintainer : Peter Ljunglöf
--- Stability : Stable
--- Portability : Haskell 98
---
--- > CVS $Date: 2005/05/09 09:28:44 $
--- > CVS $Author: peb $
--- > CVS $Revision: 1.4 $
---
--- Association lists, or finite maps,
--- including sets as maps with result type @()@.
--- function names stolen from module @Array@.
--- /O(log n)/ key lookup
------------------------------------------------------------------------------
-
-module GF.Data.Assoc ( Assoc,
- Set,
- emptyAssoc,
- emptySet,
- listAssoc,
- listSet,
- accumAssoc,
- aAssocs,
- aElems,
- assocMap,
- assocFilter,
- lookupAssoc,
- lookupWith,
- (?),
- (?=)
- ) where
-
-import GF.Data.SortedList
-
-infixl 9 ?, ?=
-
--- | a set is a finite map with empty values
-type Set a = Assoc a ()
-
-emptyAssoc :: Ord a => Assoc a b
-emptySet :: Ord a => Set a
-
--- | creating a finite map from a sorted key-value list
-listAssoc :: Ord a => SList (a, b) -> Assoc a b
-
--- | creating a set from a sorted list
-listSet :: Ord a => SList a -> Set a
-
--- | building a finite map from a list of keys and 'b's,
--- and a function that combines a sorted list of 'b's into a value
-accumAssoc :: (Ord a, Ord c) => (SList c -> b) -> [(a, c)] -> Assoc a b
-
--- | all key-value pairs from an association list
-aAssocs :: Ord a => Assoc a b -> SList (a, b)
-
--- | all keys from an association list
-aElems :: Ord a => Assoc a b -> SList a
-
--- fmap :: Ord a => (b -> b') -> Assoc a b -> Assoc a b'
-
--- | mapping values to other values.
--- the mapping function can take the key as information
-assocMap :: Ord a => (a -> b -> b') -> Assoc a b -> Assoc a b'
-
-assocFilter :: Ord a => (b -> Bool) -> Assoc a b -> Assoc a b
-assocFilter pred = listAssoc . filter (pred . snd) . aAssocs
-
--- | monadic lookup function,
--- returning failure if the key does not exist
-lookupAssoc :: (Ord a, Monad m) => Assoc a b -> a -> m b
-
--- | if the key does not exist,
--- the first argument is returned
-lookupWith :: Ord a => b -> Assoc a b -> a -> b
-
--- | if the values are monadic, we can return the value type
-(?) :: (Ord a, Monad m) => Assoc a (m b) -> a -> m b
-
--- | checking wheter the map contains a given key
-(?=) :: Ord a => Assoc a b -> a -> Bool
-
-
-------------------------------------------------------------
-
-data Assoc a b = ANil | ANode (Assoc a b) a b (Assoc a b)
- deriving (Eq, Ord, Show)
-
-emptyAssoc = ANil
-emptySet = emptyAssoc
-
-listAssoc as = assoc
- where (assoc, []) = sl2bst (length as) as
- sl2bst 0 xs = (ANil, xs)
- sl2bst 1 (x:xs) = (ANode ANil (fst x) (snd x) ANil, xs)
- sl2bst n xs = (ANode left (fst x) (snd x) right, zs)
- where llen = (n-1) `div` 2
- rlen = n - 1 - llen
- (left, x:ys) = sl2bst llen xs
- (right, zs) = sl2bst rlen ys
-
-listSet as = listAssoc (zip as (repeat ()))
-
-accumAssoc join = listAssoc . map (mapSnd join) . groupPairs . nubsort
- where mapSnd f (a, b) = (a, f b)
-
-aAssocs as = prs as []
- where prs ANil = id
- prs (ANode left a b right) = prs left . ((a,b) :) . prs right
-
-aElems = map fst . aAssocs
-
-
-instance Ord a => Functor (Assoc a) where
- fmap f = assocMap (const f)
-
-assocMap f ANil = ANil
-assocMap f (ANode left a b right) = ANode (assocMap f left) a (f a b) (assocMap f right)
-
-
-lookupAssoc ANil _ = fail "key not found"
-lookupAssoc (ANode left a b right) a' = case compare a a' of
- GT -> lookupAssoc left a'
- LT -> lookupAssoc right a'
- EQ -> return b
-
-lookupWith z ANil _ = z
-lookupWith z (ANode left a b right) a' = case compare a a' of
- GT -> lookupWith z left a'
- LT -> lookupWith z right a'
- EQ -> b
-
-(?) = lookupWith (fail "key not found")
-
-(?=) = \assoc -> maybe False (const True) . lookupAssoc assoc
-
-
-
-
-
-
-
diff --git a/src-3.0/GF/Data/BacktrackM.hs b/src-3.0/GF/Data/BacktrackM.hs
deleted file mode 100644
index 790d11a83..000000000
--- a/src-3.0/GF/Data/BacktrackM.hs
+++ /dev/null
@@ -1,93 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : BacktrackM
--- Maintainer : PL
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/04/21 16:22:00 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.4 $
---
--- Backtracking state monad, with r\/o environment
------------------------------------------------------------------------------
-
-{-# OPTIONS_GHC -fglasgow-exts #-}
-module GF.Data.BacktrackM ( -- * the backtracking state monad
- BacktrackM,
- -- * controlling the monad
- failure,
- (|||),
- -- * handling the state & environment
- readState,
- writeState,
- -- * monad specific utilities
- member,
- -- * running the monad
- foldBM, runBM,
- foldSolutions, solutions,
- foldFinalStates, finalStates
- ) where
-
-import Data.List
-import Control.Monad
-
-----------------------------------------------------------------------
--- Combining endomorphisms and continuations
--- a la Ralf Hinze
-
--- BacktrackM = state monad transformer over the backtracking monad
-
-newtype BacktrackM s a = BM (forall b . (a -> s -> b -> b) -> s -> b -> b)
-
--- * running the monad
-
-runBM :: BacktrackM s a -> s -> [(s,a)]
-runBM (BM m) s = m (\x s xs -> (s,x) : xs) s []
-
-foldBM :: (a -> s -> b -> b) -> b -> BacktrackM s a -> s -> b
-foldBM f b (BM m) s = m f s b
-
-foldSolutions :: (a -> b -> b) -> b -> BacktrackM s a -> s -> b
-foldSolutions f b (BM m) s = m (\x s b -> f x b) s b
-
-solutions :: BacktrackM s a -> s -> [a]
-solutions = foldSolutions (:) []
-
-foldFinalStates :: (s -> b -> b) -> b -> BacktrackM s () -> s -> b
-foldFinalStates f b (BM m) s = m (\x s b -> f s b) s b
-
-finalStates :: BacktrackM s () -> s -> [s]
-finalStates bm = map fst . runBM bm
-
-
--- * handling the state & environment
-
-readState :: BacktrackM s s
-readState = BM (\c s b -> c s s b)
-
-writeState :: s -> BacktrackM s ()
-writeState s = BM (\c _ b -> c () s b)
-
-instance Monad (BacktrackM s) where
- return a = BM (\c s b -> c a s b)
- BM m >>= k = BM (\c s b -> m (\a s b -> unBM (k a) c s b) s b)
- where unBM (BM m) = m
- fail _ = failure
-
--- * controlling the monad
-
-failure :: BacktrackM s a
-failure = BM (\c s b -> b)
-
-(|||) :: BacktrackM s a -> BacktrackM s a -> BacktrackM s a
-(BM f) ||| (BM g) = BM (\c s b -> g c s $! f c s b)
-
-instance MonadPlus (BacktrackM s) where
- mzero = failure
- mplus = (|||)
-
--- * specific functions on the backtracking monad
-
-member :: [a] -> BacktrackM s a
-member xs = BM (\c s b -> foldl' (\b x -> c x s b) b xs)
diff --git a/src-3.0/GF/Data/ErrM.hs b/src-3.0/GF/Data/ErrM.hs
deleted file mode 100644
index e8cea12d4..000000000
--- a/src-3.0/GF/Data/ErrM.hs
+++ /dev/null
@@ -1,38 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : ErrM
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/04/21 16:22:00 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.5 $
---
--- hack for BNFC generated files. AR 21/9/2003
------------------------------------------------------------------------------
-
-module GF.Data.ErrM (Err(..)) where
-
-import Control.Monad (MonadPlus(..))
-
--- | like @Maybe@ type with error msgs
-data Err a = Ok a | Bad String
- deriving (Read, Show, Eq)
-
-instance Monad Err where
- return = Ok
- fail = Bad
- Ok a >>= f = f a
- Bad s >>= f = Bad s
-
--- | added 2\/10\/2003 by PEB
-instance Functor Err where
- fmap f (Ok a) = Ok (f a)
- fmap f (Bad s) = Bad s
-
--- | added by KJ
-instance MonadPlus Err where
- mzero = Bad "error (no reason given)"
- mplus (Ok a) _ = Ok a
- mplus (Bad s) b = b
diff --git a/src-3.0/GF/Data/MultiMap.hs b/src-3.0/GF/Data/MultiMap.hs
deleted file mode 100644
index e565f433b..000000000
--- a/src-3.0/GF/Data/MultiMap.hs
+++ /dev/null
@@ -1,47 +0,0 @@
-module GF.Data.MultiMap where
-
-import Data.Map (Map)
-import qualified Data.Map as Map
-import Data.Set (Set)
-import qualified Data.Set as Set
-import Prelude hiding (map)
-import qualified Prelude
-
-type MultiMap k a = Map k (Set a)
-
-empty :: MultiMap k a
-empty = Map.empty
-
-keys :: MultiMap k a -> [k]
-keys = Map.keys
-
-elems :: MultiMap k a -> [a]
-elems = concatMap Set.toList . Map.elems
-
-(!) :: Ord k => MultiMap k a -> k -> [a]
-m ! k = Set.toList $ Map.findWithDefault Set.empty k m
-
-member :: (Ord k, Ord a) => k -> a -> MultiMap k a -> Bool
-member k x m = x `Set.member` Map.findWithDefault Set.empty k m
-
-insert :: (Ord k, Ord a) => k -> a -> MultiMap k a -> MultiMap k a
-insert k x m = Map.insertWith Set.union k (Set.singleton x) m
-
-insert' :: (Ord k, Ord a) => k -> a -> MultiMap k a -> Maybe (MultiMap k a)
-insert' k x m | member k x m = Nothing -- FIXME: inefficient
- | otherwise = Just (insert k x m)
-
-union :: (Ord k, Ord a) => MultiMap k a -> MultiMap k a -> MultiMap k a
-union = Map.unionWith Set.union
-
-size :: MultiMap k a -> Int
-size = sum . Prelude.map Set.size . Map.elems
-
-map :: (Ord a, Ord b) => (a -> b) -> MultiMap k a -> MultiMap k b
-map f = Map.map (Set.map f)
-
-fromList :: (Ord k, Ord a) => [(k,a)] -> MultiMap k a
-fromList xs = Map.fromListWith Set.union [(k, Set.singleton x) | (k,x) <- xs]
-
-toList :: MultiMap k a -> [(k,a)]
-toList m = [(k,x) | (k,s) <- Map.toList m, x <- Set.toList s] \ No newline at end of file
diff --git a/src-3.0/GF/Data/Operations.hs b/src-3.0/GF/Data/Operations.hs
deleted file mode 100644
index 253723876..000000000
--- a/src-3.0/GF/Data/Operations.hs
+++ /dev/null
@@ -1,676 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : Operations
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/11/11 16:12:41 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.22 $
---
--- some auxiliary GF operations. AR 19\/6\/1998 -- 6\/2\/2001
---
--- Copyright (c) Aarne Ranta 1998-2000, under GNU General Public License (see GPL)
------------------------------------------------------------------------------
-
-module GF.Data.Operations (-- * misc functions
- ifNull, onSnd,
-
- -- * the Error monad
- Err(..), err, maybeErr, testErr, errVal, errIn, derrIn,
- performOps, repeatUntilErr, repeatUntil, okError, isNotError,
- showBad, lookupErr, lookupErrMsg, lookupDefault, updateLookupList,
- mapPairListM, mapPairsM, pairM, mapErr, mapErrN, foldErr,
- (!?), errList, singleton, mapsErr, mapsErrTree,
-
- -- ** checking
- checkUnique, titleIfNeeded, errMsg, errAndMsg,
-
- -- * a three-valued maybe type to express indirections
- Perhaps(..), yes, may, nope,
- mapP,
- unifPerhaps, updatePerhaps, updatePerhapsHard,
-
- -- * binary search trees; now with FiniteMap
- BinTree, emptyBinTree, isInBinTree, justLookupTree,
- lookupTree, lookupTreeMany, lookupTreeManyAll, updateTree,
- buildTree, filterBinTree,
- sorted2tree, mapTree, mapMTree, tree2list,
-
-
- -- * parsing
- WParser, wParseResults, paragraphs,
-
- -- * printing
- indent, (+++), (++-), (++++), (+++++),
- prUpper, prReplicate, prTList, prQuotedString, prParenth, prCurly,
- prBracket, prArgList, prSemicList, prCurlyList, restoreEscapes,
- numberedParagraphs, prConjList, prIfEmpty, wrapLines,
-
- -- ** LaTeX code producing functions
- dollar, mbox, ital, boldf, verbat, mkLatexFile,
- begindocument, enddocument,
-
- -- * extra
- sortByLongest, combinations, mkTextFile, initFilePath,
-
- -- * topological sorting with test of cyclicity
- topoTest, topoSort, cyclesIn,
-
- -- * the generic fix point iterator
- iterFix,
-
- -- * association lists
- updateAssoc, removeAssoc,
-
- -- * chop into separator-separated parts
- chunks, readIntArg, subSequences,
-
- -- * state monad with error; from Agda 6\/11\/2001
- STM(..), appSTM, stm, stmr, readSTM, updateSTM, writeSTM, done,
-
- -- * error monad class
- ErrorMonad(..), checkAgain, checks, allChecks, doUntil
-
- ) where
-
-import Data.Char (isSpace, toUpper, isSpace, isDigit)
-import Data.List (nub, sortBy, sort, deleteBy, nubBy)
---import Data.FiniteMap
-import Control.Monad (liftM,liftM2, MonadPlus, mzero, mplus)
-
-import GF.Data.ErrM
-
-infixr 5 +++
-infixr 5 ++-
-infixr 5 ++++
-infixr 5 +++++
-infixl 9 !?
-
-ifNull :: b -> ([a] -> b) -> [a] -> b
-ifNull b f xs = if null xs then b else f xs
-
-onSnd :: (a -> b) -> (c,a) -> (c,b)
-onSnd f (x, y) = (x, f y)
-
--- the Error monad
-
--- | analogue of @maybe@
-err :: (String -> b) -> (a -> b) -> Err a -> b
-err d f e = case e of
- Ok a -> f a
- Bad s -> d s
-
--- | add msg s to @Maybe@ failures
-maybeErr :: String -> Maybe a -> Err a
-maybeErr s = maybe (Bad s) Ok
-
-testErr :: Bool -> String -> Err ()
-testErr cond msg = if cond then return () else Bad msg
-
-errVal :: a -> Err a -> a
-errVal a = err (const a) id
-
-errIn :: String -> Err a -> Err a
-errIn msg = err (\s -> Bad (s ++++ "OCCURRED IN" ++++ msg)) return
-
--- | used for extra error reports when developing GF
-derrIn :: String -> Err a -> Err a
-derrIn m = errIn m -- id
-
-performOps :: [a -> Err a] -> a -> Err a
-performOps ops a = case ops of
- f:fs -> f a >>= performOps fs
- [] -> return a
-
-repeatUntilErr :: (a -> Bool) -> (a -> Err a) -> a -> Err a
-repeatUntilErr cond f a = if cond a then return a else f a >>= repeatUntilErr cond f
-
-repeatUntil :: (a -> Bool) -> (a -> a) -> a -> a
-repeatUntil cond f a = if cond a then a else repeatUntil cond f (f a)
-
-okError :: Err a -> a
--- okError = err (error "no result Ok") id
-okError = err (error . ("Bad result occurred" ++++)) id
-
-isNotError :: Err a -> Bool
-isNotError = err (const False) (const True)
-
-showBad :: Show a => String -> a -> Err b
-showBad s a = Bad (s +++ show a)
-
-lookupErr :: (Eq a,Show a) => a -> [(a,b)] -> Err b
-lookupErr a abs = maybeErr ("Unknown" +++ show a) (lookup a abs)
-
-lookupErrMsg :: (Eq a,Show a) => String -> a -> [(a,b)] -> Err b
-lookupErrMsg m a abs = maybeErr (m +++ "gave unknown" +++ show a) (lookup a abs)
-
-lookupDefault :: Eq a => b -> a -> [(a,b)] -> b
-lookupDefault d x l = maybe d id $ lookup x l
-
-updateLookupList :: Eq a => (a,b) -> [(a,b)] -> [(a,b)]
-updateLookupList ab abs = insert ab [] abs where
- insert c cc [] = cc ++ [c]
- insert (a,b) cc ((a',b'):cc') = if a == a'
- then cc ++ [(a,b)] ++ cc'
- else insert (a,b) (cc ++ [(a',b')]) cc'
-
-mapPairListM :: Monad m => ((a,b) -> m c) -> [(a,b)] -> m [(a,c)]
-mapPairListM f xys = mapM (\ p@(x,_) -> liftM ((,) x) (f p)) xys
-
-mapPairsM :: Monad m => (b -> m c) -> [(a,b)] -> m [(a,c)]
-mapPairsM f xys = mapM (\ (x,y) -> liftM ((,) x) (f y)) xys
-
-pairM :: Monad a => (b -> a c) -> (b,b) -> a (c,c)
-pairM op (t1,t2) = liftM2 (,) (op t1) (op t2)
-
--- | like @mapM@, but continue instead of halting with 'Err'
-mapErr :: (a -> Err b) -> [a] -> Err ([b], String)
-mapErr f xs = Ok (ys, unlines ss)
- where
- (ys,ss) = ([y | Ok y <- fxs], [s | Bad s <- fxs])
- fxs = map f xs
-
--- | alternative variant, peb 9\/6-04
-mapErrN :: Int -> (a -> Err b) -> [a] -> Err ([b], String)
-mapErrN maxN f xs = Ok (ys, unlines (errHdr : ss2))
- where
- (ys, ss) = ([y | Ok y <- fxs], [s | Bad s <- fxs])
- errHdr = show nss ++ " errors occured" ++
- if nss > maxN then ", showing the first " ++ show maxN else ""
- ss2 = map ("* "++) $ take maxN ss
- nss = length ss
- fxs = map f xs
-
-
--- | like @foldM@, but also return the latest value if fails
-foldErr :: (a -> b -> Err a) -> a -> [b] -> Err (a, Maybe String)
-foldErr f s xs = case xs of
- [] -> return (s,Nothing)
- x:xx -> case f s x of
- Ok v -> foldErr f v xx
- Bad m -> return $ (s, Just m)
-
--- @!!@ with the error monad
-(!?) :: [a] -> Int -> Err a
-xs !? i = foldr (const . return) (Bad "too few elements in list") $ drop i xs
-
-errList :: Err [a] -> [a]
-errList = errVal []
-
-singleton :: a -> [a]
-singleton = (:[])
-
--- checking
-
-checkUnique :: (Show a, Eq a) => [a] -> [String]
-checkUnique ss = ["overloaded" +++ show s | s <- nub overloads] where
- overloads = filter overloaded ss
- overloaded s = length (filter (==s) ss) > 1
-
-titleIfNeeded :: a -> [a] -> [a]
-titleIfNeeded a [] = []
-titleIfNeeded a as = a:as
-
-errMsg :: Err a -> [String]
-errMsg (Bad m) = [m]
-errMsg _ = []
-
-errAndMsg :: Err a -> Err (a,[String])
-errAndMsg (Bad m) = Bad m
-errAndMsg (Ok a) = return (a,[])
-
--- | a three-valued maybe type to express indirections
-data Perhaps a b = Yes a | May b | Nope deriving (Show,Read,Eq,Ord)
-
-yes :: a -> Perhaps a b
-yes = Yes
-
-may :: b -> Perhaps a b
-may = May
-
-nope :: Perhaps a b
-nope = Nope
-
-mapP :: (a -> c) -> Perhaps a b -> Perhaps c b
-mapP f p = case p of
- Yes a -> Yes (f a)
- May b -> May b
- Nope -> Nope
-
--- | this is what happens when matching two values in the same module
-unifPerhaps :: (Eq a, Eq b, Show a, Show b) =>
- Perhaps a b -> Perhaps a b -> Err (Perhaps a b)
-unifPerhaps p1 p2 = case (p1,p2) of
- (Nope, _) -> return p2
- (_, Nope) -> return p1
- _ -> if p1==p2 then return p1
- else Bad ("update conflict between" ++++ show p1 ++++ show p2)
-
--- | this is what happens when updating a module extension
-updatePerhaps :: (Eq a,Eq b, Show a, Show b) =>
- b -> Perhaps a b -> Perhaps a b -> Err (Perhaps a b)
-updatePerhaps old p1 p2 = case (p1,p2) of
- (Yes a, Nope) -> return $ may old
- (May older,Nope) -> return $ may older
- (_, May a) -> Bad "strange indirection"
- _ -> unifPerhaps p1 p2
-
--- | here the value is copied instead of referred to; used for oper types
-updatePerhapsHard :: (Eq a, Eq b, Show a, Show b) => b ->
- Perhaps a b -> Perhaps a b -> Err (Perhaps a b)
-updatePerhapsHard old p1 p2 = case (p1,p2) of
- (Yes a, Nope) -> return $ yes a
- (May older,Nope) -> return $ may older
- (_, May a) -> Bad "strange indirection"
- _ -> unifPerhaps p1 p2
-
--- binary search trees
---- FiniteMap implementation is slower in crucial tests
-
-data BinTree a b = NT | BT (a,b) !(BinTree a b) !(BinTree a b) deriving (Show)
--- type BinTree a b = FiniteMap a b
-
-emptyBinTree :: BinTree a b
-emptyBinTree = NT
--- emptyBinTree = emptyFM
-
-isInBinTree :: (Ord a) => a -> BinTree a b -> Bool
-isInBinTree x = err (const False) (const True) . justLookupTree x
--- isInBinTree = elemFM
-
-justLookupTree :: (Monad m,Ord a) => a -> BinTree a b -> m b
-justLookupTree = lookupTree (const [])
-
-lookupTree :: (Monad m,Ord a) => (a -> String) -> a -> BinTree a b -> m b
-lookupTree pr x tree = case tree of
- NT -> fail ("no occurrence of element" +++ pr x)
- BT (a,b) left right
- | x < a -> lookupTree pr x left
- | x > a -> lookupTree pr x right
- | x == a -> return b
---lookupTree pr x tree = case lookupFM tree x of
--- Just y -> return y
--- _ -> fail ("no occurrence of element" +++ pr x)
-
-lookupTreeMany :: Ord a => (a -> String) -> [BinTree a b] -> a -> Err b
-lookupTreeMany pr (t:ts) x = case lookupTree pr x t of
- Ok v -> return v
- _ -> lookupTreeMany pr ts x
-lookupTreeMany pr [] x = Bad $ "failed to find" +++ pr x
-
-lookupTreeManyAll :: Ord a => (a -> String) -> [BinTree a b] -> a -> [b]
-lookupTreeManyAll pr (t:ts) x = case lookupTree pr x t of
- Ok v -> v : lookupTreeManyAll pr ts x
- _ -> lookupTreeManyAll pr ts x
-lookupTreeManyAll pr [] x = []
-
--- | destructive update
-updateTree :: (Ord a) => (a,b) -> BinTree a b -> BinTree a b
--- updateTree (a,b) tr = addToFM tr a b
-updateTree = updateTreeGen True
-
--- | destructive or not
-updateTreeGen :: (Ord a) => Bool -> (a,b) -> BinTree a b -> BinTree a b
-updateTreeGen destr z@(x,y) tree = case tree of
- NT -> BT z NT NT
- BT c@(a,b) left right
- | x < a -> let left' = updateTree z left in BT c left' right
- | x > a -> let right' = updateTree z right in BT c left right'
- | otherwise -> if destr
- then BT z left right -- removing the old value of a
- else tree -- retaining the old value if one exists
-
-buildTree :: (Ord a) => [(a,b)] -> BinTree a b
-buildTree = sorted2tree . sortBy fs where
- fs (x,_) (y,_)
- | x < y = LT
- | x > y = GT
- | True = EQ
--- buildTree = listToFM
-
-sorted2tree :: Ord a => [(a,b)] -> BinTree a b
-sorted2tree [] = NT
-sorted2tree xs = BT x (sorted2tree t1) (sorted2tree t2) where
- (t1,(x:t2)) = splitAt (length xs `div` 2) xs
---sorted2tree = listToFM
-
---- dm less general than orig
-mapTree :: ((a,b) -> (a,c)) -> BinTree a b -> BinTree a c
-mapTree f NT = NT
-mapTree f (BT a left right) = BT (f a) (mapTree f left) (mapTree f right)
---mapTree f = mapFM (\k v -> snd (f (k,v)))
-
---- fm less efficient than orig?
-mapMTree :: (Ord a,Monad m) => ((a,b) -> m (a,c)) -> BinTree a b -> m (BinTree a c)
-mapMTree f NT = return NT
-mapMTree f (BT a left right) = do
- a' <- f a
- left' <- mapMTree f left
- right' <- mapMTree f right
- return $ BT a' left' right'
---mapMTree f t = liftM listToFM $ mapM f $ fmToList t
-
-filterBinTree :: Ord a => (a -> b -> Bool) -> BinTree a b -> BinTree a b
--- filterFM f t
-filterBinTree f = sorted2tree . filter (uncurry f) . tree2list
-
-tree2list :: BinTree a b -> [(a,b)] -- inorder
-tree2list NT = []
-tree2list (BT z left right) = tree2list left ++ [z] ++ tree2list right
---tree2list = fmToList
-
--- parsing
-
-type WParser a b = [a] -> [(b,[a])] -- old Wadler style parser
-
-wParseResults :: WParser a b -> [a] -> [b]
-wParseResults p aa = [b | (b,[]) <- p aa]
-
-paragraphs :: String -> [String]
-paragraphs = map unlines . chop . lines where
- chop [] = []
- chop ss = let (ps,rest) = break empty ss in ps : chop (dropWhile empty rest)
- empty = all isSpace
-
--- printing
-
-indent :: Int -> String -> String
-indent i s = replicate i ' ' ++ s
-
-(+++), (++-), (++++), (+++++) :: String -> String -> String
-a +++ b = a ++ " " ++ b
-a ++- "" = a
-a ++- b = a +++ b
-a ++++ b = a ++ "\n" ++ b
-a +++++ b = a ++ "\n\n" ++ b
-
-prUpper :: String -> String
-prUpper s = s1 ++ s2' where
- (s1,s2) = span isSpace s
- s2' = case s2 of
- c:t -> toUpper c : t
- _ -> s2
-
-prReplicate :: Int -> String -> String
-prReplicate n s = concat (replicate n s)
-
-prTList :: String -> [String] -> String
-prTList t ss = case ss of
- [] -> ""
- [s] -> s
- s:ss -> s ++ t ++ prTList t ss
-
-prQuotedString :: String -> String
-prQuotedString x = "\"" ++ restoreEscapes x ++ "\""
-
-prParenth :: String -> String
-prParenth s = if s == "" then "" else "(" ++ s ++ ")"
-
-prCurly, prBracket :: String -> String
-prCurly s = "{" ++ s ++ "}"
-prBracket s = "[" ++ s ++ "]"
-
-prArgList, prSemicList, prCurlyList :: [String] -> String
-prArgList = prParenth . prTList ","
-prSemicList = prTList " ; "
-prCurlyList = prCurly . prSemicList
-
-restoreEscapes :: String -> String
-restoreEscapes s =
- case s of
- [] -> []
- '"' : t -> '\\' : '"' : restoreEscapes t
- '\\': t -> '\\' : '\\' : restoreEscapes t
- c : t -> c : restoreEscapes t
-
-numberedParagraphs :: [[String]] -> [String]
-numberedParagraphs t = case t of
- [] -> []
- p:[] -> p
- _ -> concat [(show n ++ ".") : s | (n,s) <- zip [1..] t]
-
-prConjList :: String -> [String] -> String
-prConjList c [] = ""
-prConjList c [s] = s
-prConjList c [s,t] = s +++ c +++ t
-prConjList c (s:tt) = s ++ "," +++ prConjList c tt
-
-prIfEmpty :: String -> String -> String -> String -> String
-prIfEmpty em _ _ [] = em
-prIfEmpty em nem1 nem2 s = nem1 ++ s ++ nem2
-
--- | Thomas Hallgren's wrap lines
-wrapLines :: Int -> String -> String
-wrapLines n "" = ""
-wrapLines n s@(c:cs) =
- if isSpace c
- then c:wrapLines (n+1) cs
- else case lex s of
- [(w,rest)] -> if n'>=76
- then '\n':w++wrapLines l rest
- else w++wrapLines n' rest
- where n' = n+l
- l = length w
- _ -> s -- give up!!
-
---- optWrapLines = if argFlag "wraplines" True then wrapLines 0 else id
-
--- LaTeX code producing functions
-dollar, mbox, ital, boldf, verbat :: String -> String
-dollar s = '$' : s ++ "$"
-mbox s = "\\mbox{" ++ s ++ "}"
-ital s = "{\\em" +++ s ++ "}"
-boldf s = "{\\bf" +++ s ++ "}"
-verbat s = "\\verbat!" ++ s ++ "!"
-
-mkLatexFile :: String -> String
-mkLatexFile s = begindocument +++++ s +++++ enddocument
-
-begindocument, enddocument :: String
-begindocument =
- "\\documentclass[a4paper,11pt]{article}" ++++ -- M.F. 25/01-02
- "\\setlength{\\parskip}{2mm}" ++++
- "\\setlength{\\parindent}{0mm}" ++++
- "\\setlength{\\oddsidemargin}{0mm}" ++++
- ("\\setlength{\\evensidemargin}{"++"-2mm}") ++++ -- peb 27/5-04: to prevent hugs-mode
- ("\\setlength{\\topmargin}{"++"-8mm}") ++++ -- from treating the rest as comments
- "\\setlength{\\textheight}{240mm}" ++++
- "\\setlength{\\textwidth}{158mm}" ++++
- "\\begin{document}\n"
-enddocument =
- "\n\\end{document}\n"
-
-
-sortByLongest :: [[a]] -> [[a]]
-sortByLongest = sortBy longer where
- longer x y
- | x' > y' = LT
- | x' < y' = GT
- | True = EQ
- where
- x' = length x
- y' = length y
-
--- | 'combinations' is the same as @sequence@!!!
--- peb 30\/5-04
-combinations :: [[a]] -> [[a]]
-combinations t = case t of
- [] -> [[]]
- aa:uu -> [a:u | a <- aa, u <- combinations uu]
-
-
-mkTextFile :: String -> IO ()
-mkTextFile name = do
- s <- readFile name
- let s' = prelude name ++ "\n\n" ++ heading name ++ "\n" ++ object s
- writeFile (name ++ ".hs") s'
- where
- prelude name = "module " ++ name ++ " where"
- heading name = "txt" ++ name ++ " ="
- object s = mk s ++ " \"\""
- mk s = unlines [" \"" ++ escs line ++ "\" ++ \"\\n\" ++" | line <- lines s]
- escs s = case s of
- c:cs | elem c "\"\\" -> '\\' : c : escs cs
- c:cs -> c : escs cs
- _ -> s
-
-initFilePath :: FilePath -> FilePath
-initFilePath f = reverse (dropWhile (/='/') (reverse f))
-
--- | topological sorting with test of cyclicity
-topoTest :: Eq a => [(a,[a])] -> Either [a] [[a]]
-topoTest g = if length g' == length g then Left g' else Right (cyclesIn g ++[[]])
- where
- g' = topoSort g
-
-cyclesIn :: Eq a => [(a,[a])] -> [[a]]
-cyclesIn deps = nubb $ clean $ filt $ iterFix findDep immediate where
- immediate = [[y,x] | (x,xs) <- deps, y <- xs]
- findDep chains = [y:x:chain |
- x:chain <- chains, (x',xs) <- deps, x' == x, y <- xs,
- notElem y (init chain)]
-
- clean = map remdup
- nubb = nubBy (\x y -> y == reverse x)
- filt = filter (\xs -> last xs == head xs)
- remdup (x:xs) = x : remdup xs' where xs' = dropWhile (==x) xs
- remdup [] = []
-
-
--- | topological sorting
-topoSort :: Eq a => [(a,[a])] -> [a]
-topoSort g = reverse $ tsort 0 [ffs | ffs@(f,_) <- g, inDeg f == 0] [] where
- tsort _ [] r = r
- tsort k (ffs@(f,fs) : cs) r
- | elem f r = tsort k cs r
- | k > lx = r
- | otherwise = tsort (k+1) cs (f : tsort (k+1) (info fs) r)
- info hs = [(f,fs) | (f,fs) <- g, elem f hs]
- inDeg f = length [t | (h,hs) <- g, t <- hs, t == f]
- lx = length g
-
--- | the generic fix point iterator
-iterFix :: Eq a => ([a] -> [a]) -> [a] -> [a]
-iterFix more start = iter start start
- where
- iter old new = if (null new')
- then old
- else iter (new' ++ old) new'
- where
- new' = filter (`notElem` old) (more new)
-
--- association lists
-
-updateAssoc :: Eq a => (a,b) -> [(a,b)] -> [(a,b)]
-updateAssoc ab@(a,b) as = case as of
- (x,y): xs | x == a -> (a,b):xs
- xy : xs -> xy : updateAssoc ab xs
- [] -> [ab]
-
-removeAssoc :: Eq a => a -> [(a,b)] -> [(a,b)]
-removeAssoc a = filter ((/=a) . fst)
-
--- | chop into separator-separated parts
-chunks :: Eq a => a -> [a] -> [[a]]
-chunks sep ws = case span (/= sep) ws of
- (a,_:b) -> a : bs where bs = chunks sep b
- (a, []) -> if null a then [] else [a]
-
-readIntArg :: String -> Int
-readIntArg n = if (not (null n) && all isDigit n) then read n else 0
-
-
--- state monad with error; from Agda 6/11/2001
-
-newtype STM s a = STM (s -> Err (a,s))
-
-appSTM :: STM s a -> s -> Err (a,s)
-appSTM (STM f) s = f s
-
-stm :: (s -> Err (a,s)) -> STM s a
-stm = STM
-
-stmr :: (s -> (a,s)) -> STM s a
-stmr f = stm (\s -> return (f s))
-
-instance Monad (STM s) where
- return a = STM (\s -> return (a,s))
- STM c >>= f = STM (\s -> do
- (x,s') <- c s
- let STM f' = f x
- f' s')
-
-readSTM :: STM s s
-readSTM = stmr (\s -> (s,s))
-
-updateSTM :: (s -> s) -> STM s ()
-updateSTM f = stmr (\s -> ((),f s))
-
-writeSTM :: s -> STM s ()
-writeSTM s = stmr (const ((),s))
-
-done :: Monad m => m ()
-done = return ()
-
-class Monad m => ErrorMonad m where
- raise :: String -> m a
- handle :: m a -> (String -> m a) -> m a
- handle_ :: m a -> m a -> m a
- handle_ a b = a `handle` (\_ -> b)
-
-instance ErrorMonad Err where
- raise = Bad
- handle a@(Ok _) _ = a
- handle (Bad i) f = f i
-
-instance ErrorMonad (STM s) where
- raise msg = STM (\s -> raise msg)
- handle (STM f) g = STM (\s -> (f s)
- `handle` (\e -> let STM g' = (g e) in
- g' s))
-
--- error recovery with multiple reporting AR 30/5/2008
-mapsErr :: (a -> Err b) -> [a] -> Err [b]
-
-mapsErr f = seqs . map f where
- seqs es = case es of
- Ok v : ms -> case seqs ms of
- Ok vs -> return (v : vs)
- b -> b
- Bad s : ms -> case seqs ms of
- Ok vs -> Bad s
- Bad ss -> Bad (s +++++ ss)
- [] -> return []
-
-mapsErrTree :: (Ord a) => ((a,b) -> Err (a,c)) -> BinTree a b -> Err (BinTree a c)
-mapsErrTree f t = mapsErr f (tree2list t) >>= return . sorted2tree
-
-
--- | if the first check fails try another one
-checkAgain :: ErrorMonad m => m a -> m a -> m a
-checkAgain c1 c2 = handle_ c1 c2
-
-checks :: ErrorMonad m => [m a] -> m a
-checks [] = raise "no chance to pass"
-checks cs = foldr1 checkAgain cs
-
-allChecks :: ErrorMonad m => [m a] -> m [a]
-allChecks ms = case ms of
- (m: ms) -> let rs = allChecks ms in handle_ (liftM2 (:) m rs) rs
- _ -> return []
-
-doUntil :: ErrorMonad m => (a -> Bool) -> [m a] -> m a
-doUntil cond ms = case ms of
- a:as -> do
- v <- a
- if cond v then return v else doUntil cond as
- _ -> raise "no result"
-
--- subsequences sorted from longest to shortest ; their number is 2^n
-subSequences :: [a] -> [[a]]
-subSequences = sortBy (\x y -> compare (length y) (length x)) . subs where
- subs xs = case xs of
- [] -> [[]]
- x:xs -> let xss = subs xs in [x:y | y <- xss] ++ xss
diff --git a/src-3.0/GF/Data/SortedList.hs b/src-3.0/GF/Data/SortedList.hs
deleted file mode 100644
index d77ff68d4..000000000
--- a/src-3.0/GF/Data/SortedList.hs
+++ /dev/null
@@ -1,127 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Maintainer : Peter Ljunglöf
--- Stability : stable
--- Portability : portable
---
--- > CVS $Date: 2005/04/21 16:22:08 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.3 $
---
--- Sets as sorted lists
---
--- * /O(n)/ union, difference and intersection
---
--- * /O(n log n)/ creating a set from a list (=sorting)
---
--- * /O(n^2)/ fixed point iteration
------------------------------------------------------------------------------
-
-module GF.Data.SortedList
- ( -- * type declarations
- SList, SMap,
- -- * set operations
- nubsort, union,
- (<++>), (<\\>), (<**>),
- limit,
- hasCommonElements, subset,
- -- * map operations
- groupPairs, groupUnion,
- unionMap, mergeMap
- ) where
-
-import Data.List (groupBy)
-import GF.Data.Utilities (split, foldMerge)
-
--- | The list must be sorted and contain no duplicates.
-type SList a = [a]
-
--- | A sorted map also has unique keys,
--- i.e. 'map fst m :: SList a', if 'm :: SMap a b'
-type SMap a b = SList (a, b)
-
--- | Group a set of key-value pairs into a sorted map
-groupPairs :: Ord a => SList (a, b) -> SMap a (SList b)
-groupPairs = map mapFst . groupBy eqFst
- where mapFst as = (fst (head as), map snd as)
- eqFst a b = fst a == fst b
-
--- | Group a set of key-(sets-of-values) pairs into a sorted map
-groupUnion :: (Ord a, Ord b) => SList (a, SList b) -> SMap a (SList b)
-groupUnion = map unionSnd . groupPairs
- where unionSnd (a, bs) = (a, union bs)
-
--- | True is the two sets has common elements
-hasCommonElements :: Ord a => SList a -> SList a -> Bool
-hasCommonElements as bs = not (null (as <**> bs))
-
--- | True if the first argument is a subset of the second argument
-subset :: Ord a => SList a -> SList a -> Bool
-xs `subset` ys = null (xs <\\> ys)
-
--- | Create a set from any list.
--- This function can also be used as an alternative to @nub@ in @List.hs@
-nubsort :: Ord a => [a] -> SList a
-nubsort = union . map return
-
--- | the union of a list of sorted maps
-unionMap :: Ord a => (b -> b -> b)
- -> [SMap a b] -> SMap a b
-unionMap plus = foldMerge (mergeMap plus) []
-
--- | merging two sorted maps
-mergeMap :: Ord a => (b -> b -> b)
- -> SMap a b -> SMap a b -> SMap a b
-mergeMap plus [] abs = abs
-mergeMap plus abs [] = abs
-mergeMap plus abs@(ab@(a,bs):abs') cds@(cd@(c,ds):cds')
- = case compare a c of
- EQ -> (a, plus bs ds) : mergeMap plus abs' cds'
- LT -> ab : mergeMap plus abs' cds
- GT -> cd : mergeMap plus abs cds'
-
--- | The union of a list of sets
-union :: Ord a => [SList a] -> SList a
-union = foldMerge (<++>) []
-
--- | The union of two sets
-(<++>) :: Ord a => SList a -> SList a -> SList a
-[] <++> bs = bs
-as <++> [] = as
-as@(a:as') <++> bs@(b:bs') = case compare a b of
- LT -> a : (as' <++> bs)
- GT -> b : (as <++> bs')
- EQ -> a : (as' <++> bs')
-
--- | The difference of two sets
-(<\\>) :: Ord a => SList a -> SList a -> SList a
-[] <\\> bs = []
-as <\\> [] = as
-as@(a:as') <\\> bs@(b:bs') = case compare a b of
- LT -> a : (as' <\\> bs)
- GT -> (as <\\> bs')
- EQ -> (as' <\\> bs')
-
--- | The intersection of two sets
-(<**>) :: Ord a => SList a -> SList a -> SList a
-[] <**> bs = []
-as <**> [] = []
-as@(a:as') <**> bs@(b:bs') = case compare a b of
- LT -> (as' <**> bs)
- GT -> (as <**> bs')
- EQ -> a : (as' <**> bs')
-
--- | A fixed point iteration
-limit :: Ord a => (a -> SList a) -- ^ The iterator function
- -> SList a -- ^ The initial set
- -> SList a -- ^ The result of the iteration
-limit more start = limit' start start
- where limit' chart agenda | null new' = chart
- | otherwise = limit' (chart <++> new') new'
- where new = union (map more agenda)
- new'= new <\\> chart
-
-
-
-
-
diff --git a/src-3.0/GF/Data/Str.hs b/src-3.0/GF/Data/Str.hs
deleted file mode 100644
index 6f65764c7..000000000
--- a/src-3.0/GF/Data/Str.hs
+++ /dev/null
@@ -1,134 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : Str
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/04/21 16:22:09 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.8 $
---
--- (Description of the module)
------------------------------------------------------------------------------
-
-module GF.Data.Str (
- Str (..), Tok (..), --- constructors needed in PrGrammar
- str2strings, str2allStrings, str, sstr, sstrV,
- isZeroTok, prStr, plusStr, glueStr,
- strTok,
- allItems
-) where
-
-import GF.Data.Operations
-import Data.List (isPrefixOf, isSuffixOf, intersperse)
-
--- | abstract token list type. AR 2001, revised and simplified 20\/4\/2003
-newtype Str = Str [Tok] deriving (Read, Show, Eq, Ord)
-
--- | notice that having both pre and post would leave to inconsistent situations:
---
--- > pre {"x" ; "y" / "a"} ++ post {"b" ; "a" / "x"}
---
--- always violates a condition expressed by the one or the other
-data Tok =
- TK String
- | TN Ss [(Ss, [String])] -- ^ variants depending on next string
---- | TP Ss [(Ss, [String])] -- variants depending on previous string
- deriving (Eq, Ord, Show, Read)
-
-
--- | a variant can itself be a token list, but for simplicity only a list of strings
--- i.e. not itself containing variants
-type Ss = [String]
-
--- matching functions in both ways
-
-matchPrefix :: Ss -> [(Ss,[String])] -> [String] -> Ss
-matchPrefix s vs t =
- head $ [u |
- (u,as) <- vs,
- any (\c -> isPrefixOf c (concat (unmarkup t))) as
- ] ++ [s]
-
-matchSuffix :: String -> Ss -> [(Ss,[String])] -> Ss
-matchSuffix t s vs =
- head ([u | (u,as) <- vs, any (\c -> isSuffixOf c t) as] ++ [s])
-
-unmarkup :: [String] -> [String]
-unmarkup = filter (not . isXMLtag) where
- isXMLtag s = case s of
- '<':cs@(_:_) -> last cs == '>'
- _ -> False
-
-str2strings :: Str -> Ss
-str2strings (Str st) = alls st where
- alls st = case st of
- TK s : ts -> s : alls ts
- TN ds vs : ts -> matchPrefix ds vs t ++ t where t = alls ts
----- u :TP ds vs: ts -> [u] ++ matchSuffix u ds vs ++ alls ts
- [] -> []
-
-str2allStrings :: Str -> [Ss]
-str2allStrings (Str st) = alls st where
- alls st = case st of
- TK s : ts -> [s : t | t <- alls ts]
- TN ds vs : [] -> [ds ++ v | v <- map fst vs]
- TN ds vs : ts -> [matchPrefix ds vs t ++ t | t <- alls ts]
- [] -> [[]]
-
-sstr :: Str -> String
-sstr = unwords . str2strings
-
--- | to handle a list of variants
-sstrV :: [Str] -> String
-sstrV ss = case ss of
- [] -> "*"
- _ -> unwords $ intersperse "/" $ map (unwords . str2strings) ss
-
-str :: String -> Str
-str s = if null s then Str [] else Str [itS s]
-
-itS :: String -> Tok
-itS s = TK s
-
-isZeroTok :: Str -> Bool
-isZeroTok t = case t of
- Str [] -> True
- Str [TK []] -> True
- _ -> False
-
-strTok :: Ss -> [(Ss,[String])] -> Str
-strTok ds vs = Str [TN ds vs]
-
-prStr :: Str -> String
-prStr = prQuotedString . sstr
-
-plusStr :: Str -> Str -> Str
-plusStr (Str ss) (Str tt) = Str (ss ++ tt)
-
-glueStr :: Str -> Str -> Str
-glueStr (Str ss) (Str tt) = Str $ case (ss,tt) of
- ([],_) -> tt
- (_,[]) -> ss
- _ -> init ss ++ glueIt (last ss) (head tt) ++ tail tt
- where
- glueIt t u = case (t,u) of
- (TK s, TK s') -> return $ TK $ s ++ s'
- (TN ds vs, TN es ws) -> return $ TN (glues (matchPrefix ds vs es) es)
- [(glues (matchPrefix ds vs w) w,cs) | (w,cs) <- ws]
- (TN ds vs, TK s) -> map TK $ glues (matchPrefix ds vs [s]) [s]
- (TK s, TN es ws) -> return $ TN (glues [s] es) [(glues [s] w, c) | (w,c) <- ws]
-
-glues :: [[a]] -> [[a]] -> [[a]]
-glues ss tt = case (ss,tt) of
- ([],_) -> tt
- (_,[]) -> ss
- _ -> init ss ++ [last ss ++ head tt] ++ tail tt
-
--- | to create the list of all lexical items
-allItems :: Str -> [String]
-allItems (Str s) = concatMap allOne s where
- allOne t = case t of
- TK s -> [s]
- TN ds vs -> ds ++ concatMap fst vs
diff --git a/src-3.0/GF/Data/Utilities.hs b/src-3.0/GF/Data/Utilities.hs
deleted file mode 100644
index 74d3ef81e..000000000
--- a/src-3.0/GF/Data/Utilities.hs
+++ /dev/null
@@ -1,190 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Maintainer : PL
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/10/26 18:47:16 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.6 $
---
--- Basic functions not in the standard libraries
------------------------------------------------------------------------------
-
-
-module GF.Data.Utilities where
-
-import Data.Maybe
-import Data.List
-import Control.Monad (MonadPlus(..),liftM)
-
--- * functions on lists
-
-sameLength :: [a] -> [a] -> Bool
-sameLength [] [] = True
-sameLength (_:xs) (_:ys) = sameLength xs ys
-sameLength _ _ = False
-
-notLongerThan, longerThan :: Int -> [a] -> Bool
-notLongerThan n = null . snd . splitAt n
-longerThan n = not . notLongerThan n
-
-lookupList :: Eq a => a -> [(a, b)] -> [b]
-lookupList a [] = []
-lookupList a (p:ps) | a == fst p = snd p : lookupList a ps
- | otherwise = lookupList a ps
-
-split :: [a] -> ([a], [a])
-split (x : y : as) = (x:xs, y:ys)
- where (xs, ys) = split as
-split as = (as, [])
-
-splitBy :: (a -> Bool) -> [a] -> ([a], [a])
-splitBy p [] = ([], [])
-splitBy p (a : as) = if p a then (a:xs, ys) else (xs, a:ys)
- where (xs, ys) = splitBy p as
-
-foldMerge :: (a -> a -> a) -> a -> [a] -> a
-foldMerge merge zero = fm
- where fm [] = zero
- fm [a] = a
- fm abs = let (as, bs) = split abs in fm as `merge` fm bs
-
-select :: [a] -> [(a, [a])]
-select [] = []
-select (x:xs) = (x,xs) : [ (y,x:ys) | (y,ys) <- select xs ]
-
-updateNth :: (a -> a) -> Int -> [a] -> [a]
-updateNth update 0 (a : as) = update a : as
-updateNth update n (a : as) = a : updateNth update (n-1) as
-
-updateNthM :: Monad m => (a -> m a) -> Int -> [a] -> m [a]
-updateNthM update 0 (a : as) = liftM (:as) (update a)
-updateNthM update n (a : as) = liftM (a:) (updateNthM update (n-1) as)
-
--- | Like 'init', but returns the empty list when the input is empty.
-safeInit :: [a] -> [a]
-safeInit [] = []
-safeInit xs = init xs
-
--- | Like 'nub', but more efficient as it uses sorting internally.
-sortNub :: Ord a => [a] -> [a]
-sortNub = map head . group . sort
-
--- | Like 'nubBy', but more efficient as it uses sorting internally.
-sortNubBy :: (a -> a -> Ordering) -> [a] -> [a]
-sortNubBy f = map head . sortGroupBy f
-
--- | Sorts and then groups elements given and ordering of the
--- elements.
-sortGroupBy :: (a -> a -> Ordering) -> [a] -> [[a]]
-sortGroupBy f = groupBy (compareEq f) . sortBy f
-
--- | Take the union of a list of lists.
-unionAll :: Eq a => [[a]] -> [a]
-unionAll = nub . concat
-
--- | Like 'lookup', but fails if the argument is not found,
--- instead of returning Nothing.
-lookup' :: (Show a, Eq a) => a -> [(a,b)] -> b
-lookup' x = fromMaybe (error $ "Not found: " ++ show x) . lookup x
-
--- | Like 'find', but fails if nothing is found.
-find' :: (a -> Bool) -> [a] -> a
-find' p = fromJust . find p
-
--- | Set a value in a lookup table.
-tableSet :: Eq a => a -> b -> [(a,b)] -> [(a,b)]
-tableSet x y [] = [(x,y)]
-tableSet x y (p@(x',_):xs) | x' == x = (x,y):xs
- | otherwise = p:tableSet x y xs
-
--- | Group tuples by their first elements.
-buildMultiMap :: Ord a => [(a,b)] -> [(a,[b])]
-buildMultiMap = map (\g -> (fst (head g), map snd g) )
- . sortGroupBy (compareBy fst)
-
--- | Replace all occurences of an element by another element.
-replace :: Eq a => a -> a -> [a] -> [a]
-replace x y = map (\z -> if z == x then y else z)
-
--- * equality functions
-
--- | Use an ordering function as an equality predicate.
-compareEq :: (a -> a -> Ordering) -> a -> a -> Bool
-compareEq f x y = case f x y of
- EQ -> True
- _ -> False
-
--- * ordering functions
-
-compareBy :: Ord b => (a -> b) -> a -> a -> Ordering
-compareBy f = both f compare
-
-both :: (a -> b) -> (b -> b -> c) -> a -> a -> c
-both f g x y = g (f x) (f y)
-
--- * functions on pairs
-
-mapFst :: (a -> a') -> (a, b) -> (a', b)
-mapFst f (a, b) = (f a, b)
-
-mapSnd :: (b -> b') -> (a, b) -> (a, b')
-mapSnd f (a, b) = (a, f b)
-
--- * functions on monads
-
--- | Return the given value if the boolean is true, els return 'mzero'.
-whenMP :: MonadPlus m => Bool -> a -> m a
-whenMP b x = if b then return x else mzero
-
--- * functions on Maybes
-
--- | Returns true if the argument is Nothing or Just []
-nothingOrNull :: Maybe [a] -> Bool
-nothingOrNull = maybe True null
-
--- * functions on functions
-
--- | Apply all the functions in the list to the argument.
-foldFuns :: [a -> a] -> a -> a
-foldFuns fs x = foldl (flip ($)) x fs
-
--- | Fixpoint iteration.
-fix :: Eq a => (a -> a) -> a -> a
-fix f x = let x' = f x in if x' == x then x else fix f x'
-
--- * functions on strings
-
--- | Join a number of lists by using the given glue
--- between the lists.
-join :: [a] -- ^ glue
- -> [[a]] -- ^ lists to join
- -> [a]
-join g = concat . intersperse g
-
--- * ShowS-functions
-
-nl :: ShowS
-nl = showChar '\n'
-
-sp :: ShowS
-sp = showChar ' '
-
-wrap :: String -> ShowS -> String -> ShowS
-wrap o s c = showString o . s . showString c
-
-concatS :: [ShowS] -> ShowS
-concatS = foldr (.) id
-
-unwordsS :: [ShowS] -> ShowS
-unwordsS = joinS " "
-
-unlinesS :: [ShowS] -> ShowS
-unlinesS = joinS "\n"
-
-joinS :: String -> [ShowS] -> ShowS
-joinS glue = concatS . intersperse (showString glue)
-
-
-
diff --git a/src-3.0/GF/Data/XML.hs b/src-3.0/GF/Data/XML.hs
deleted file mode 100644
index 0c2efb7dc..000000000
--- a/src-3.0/GF/Data/XML.hs
+++ /dev/null
@@ -1,53 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : XML
---
--- Utilities for creating XML documents.
-----------------------------------------------------------------------
-module GF.Data.XML (XML(..), Attr, comments, showXMLDoc, showsXMLDoc, showsXML, bottomUpXML) where
-
-import GF.Data.Utilities
-
-data XML = Data String | CData String | Tag String [Attr] [XML] | ETag String [Attr] | Comment String | Empty
- deriving (Ord,Eq,Show)
-
-type Attr = (String,String)
-
-comments :: [String] -> [XML]
-comments = map Comment
-
-showXMLDoc :: XML -> String
-showXMLDoc xml = showsXMLDoc xml ""
-
-showsXMLDoc :: XML -> ShowS
-showsXMLDoc xml = showString header . showsXML xml
- where header = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"
-
-showsXML :: XML -> ShowS
-showsXML (Data s) = showString s
-showsXML (CData s) = showString "<![CDATA[" . showString s .showString "]]>"
-showsXML (ETag t as) = showChar '<' . showString t . showsAttrs as . showString "/>"
-showsXML (Tag t as cs) =
- showChar '<' . showString t . showsAttrs as . showChar '>'
- . concatS (map showsXML cs) . showString "</" . showString t . showChar '>'
-showsXML (Comment c) = showString "<!-- " . showString c . showString " -->"
-showsXML (Empty) = id
-
-showsAttrs :: [Attr] -> ShowS
-showsAttrs = concatS . map (showChar ' ' .) . map showsAttr
-
-showsAttr :: Attr -> ShowS
-showsAttr (n,v) = showString n . showString "=\"" . showString (escape v) . showString "\""
-
-escape :: String -> String
-escape = concatMap escChar
- where
- escChar '<' = "&lt;"
- escChar '>' = "&gt;"
- escChar '&' = "&amp;"
- escChar '"' = "&quot;"
- escChar c = [c]
-
-bottomUpXML :: (XML -> XML) -> XML -> XML
-bottomUpXML f (Tag n attrs cs) = f (Tag n attrs (map (bottomUpXML f) cs))
-bottomUpXML f x = f x
diff --git a/src-3.0/GF/Data/Zipper.hs b/src-3.0/GF/Data/Zipper.hs
deleted file mode 100644
index a4491f76e..000000000
--- a/src-3.0/GF/Data/Zipper.hs
+++ /dev/null
@@ -1,257 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : Zipper
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/06/11 20:27:05 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.9 $
---
--- Gérard Huet's zipper (JFP 7 (1997)). AR 10\/8\/2001
------------------------------------------------------------------------------
-
-module GF.Data.Zipper (-- * types
- Tr(..),
- Path(..),
- Loc(..),
- -- * basic (original) functions
- leaf,
- goLeft, goRight, goUp, goDown,
- changeLoc,
- changeNode,
- forgetNode,
- -- * added sequential representation
- goAhead,
- goBack,
- -- ** n-ary versions
- goAheadN,
- goBackN,
- -- * added mappings between locations and trees
- loc2tree,
- loc2treeMarked,
- tree2loc,
- goRoot,
- goLast,
- goPosition,
- getPosition,
- keepPosition,
- -- * added some utilities
- traverseCollect,
- scanTree,
- mapTr,
- mapTrM,
- mapPath,
- mapPathM,
- mapLoc,
- mapLocM,
- foldTr,
- foldTrM,
- mapSubtrees,
- mapSubtreesM,
- changeRoot,
- nthSubtree,
- arityTree
- ) where
-
-import GF.Data.Operations
-
-newtype Tr a = Tr (a,[Tr a]) deriving (Show,Eq)
-
-data Path a =
- Top
- | Node ([Tr a], (Path a, a), [Tr a])
- deriving Show
-
-leaf :: a -> Tr a
-leaf a = Tr (a,[])
-
-newtype Loc a = Loc (Tr a, Path a) deriving Show
-
-goLeft, goRight, goUp, goDown :: Loc a -> Err (Loc a)
-goLeft (Loc (t,p)) = case p of
- Top -> Bad "left of top"
- Node (l:left, upv, right) -> return $ Loc (l, Node (left,upv,t:right))
- Node _ -> Bad "left of first"
-goRight (Loc (t,p)) = case p of
- Top -> Bad "right of top"
- Node (left, upv, r:right) -> return $ Loc (r, Node (t:left,upv,right))
- Node _ -> Bad "right of first"
-goUp (Loc (t,p)) = case p of
- Top -> Bad "up of top"
- Node (left, (up,v), right) ->
- return $ Loc (Tr (v, reverse left ++ (t:right)), up)
-goDown (Loc (t,p)) = case t of
- Tr (v,(t1:trees)) -> return $ Loc (t1,Node ([],(p,v),trees))
- _ -> Bad "down of empty"
-
-changeLoc :: Loc a -> Tr a -> Err (Loc a)
-changeLoc (Loc (_,p)) t = return $ Loc (t,p)
-
-changeNode :: (a -> a) -> Loc a -> Loc a
-changeNode f (Loc (Tr (n,ts),p)) = Loc (Tr (f n, ts),p)
-
-forgetNode :: Loc a -> Err (Loc a)
-forgetNode (Loc (Tr (n,[t]),p)) = return $ Loc (t,p)
-forgetNode _ = Bad $ "not a one-branch tree"
-
--- added sequential representation
-
--- | a successor function
-goAhead :: Loc a -> Err (Loc a)
-goAhead s@(Loc (t,p)) = case (t,p) of
- (Tr (_,_:_),Node (_,_,_:_)) -> goDown s
- (Tr (_,[]), _) -> upsRight s
- (_, _) -> goDown s
- where
- upsRight t = case goRight t of
- Ok t' -> return t'
- Bad _ -> goUp t >>= upsRight
-
--- | a predecessor function
-goBack :: Loc a -> Err (Loc a)
-goBack s@(Loc (t,p)) = case goLeft s of
- Ok s' -> downRight s'
- _ -> goUp s
- where
- downRight s = case goDown s of
- Ok s' -> case goRight s' of
- Ok s'' -> downRight s''
- _ -> downRight s'
- _ -> return s
-
--- n-ary versions
-
-goAheadN :: Int -> Loc a -> Err (Loc a)
-goAheadN i st
- | i < 1 = return st
- | otherwise = goAhead st >>= goAheadN (i-1)
-
-goBackN :: Int -> Loc a -> Err (Loc a)
-goBackN i st
- | i < 1 = return st
- | otherwise = goBack st >>= goBackN (i-1)
-
--- added mappings between locations and trees
-
-loc2tree :: Loc a -> Tr a
-loc2tree (Loc (t,p)) = case p of
- Top -> t
- Node (left,(p',v),right) ->
- loc2tree (Loc (Tr (v, reverse left ++ (t : right)),p'))
-
-loc2treeMarked :: Loc a -> Tr (a, Bool)
-loc2treeMarked (Loc (Tr (a,ts),p)) =
- loc2tree (Loc (Tr (mark a, map (mapTr nomark) ts), mapPath nomark p))
- where
- (mark, nomark) = (\a -> (a,True), \a -> (a, False))
-
-tree2loc :: Tr a -> Loc a
-tree2loc t = Loc (t,Top)
-
-goRoot :: Loc a -> Loc a
-goRoot = tree2loc . loc2tree
-
-goLast :: Loc a -> Err (Loc a)
-goLast = rep goAhead where
- rep f s = err (const (return s)) (rep f) (f s)
-
-goPosition :: [Int] -> Loc a -> Err (Loc a)
-goPosition p = go p . goRoot where
- go [] s = return s
- go (p:ps) s = goDown s >>= apply p goRight >>= go ps
-
-getPosition :: Loc a -> [Int]
-getPosition = reverse . getp where
- getp (Loc (t,p)) = case p of
- Top -> []
- Node (left,(p',v),_) -> length left : getp (Loc (Tr (v, []),p'))
-
-keepPosition :: (Loc a -> Err (Loc a)) -> (Loc a -> Err (Loc a))
-keepPosition f s = do
- let p = getPosition s
- s' <- f s
- goPosition p s'
-
-apply :: Monad m => Int -> (a -> m a) -> a -> m a
-apply n f a = case n of
- 0 -> return a
- _ -> f a >>= apply (n-1) f
-
--- added some utilities
-
-traverseCollect :: Path a -> [a]
-traverseCollect p = reverse $ case p of
- Top -> []
- Node (_, (p',v), _) -> v : traverseCollect p'
-
-scanTree :: Tr a -> [a]
-scanTree (Tr (a,ts)) = a : concatMap scanTree ts
-
-mapTr :: (a -> b) -> Tr a -> Tr b
-mapTr f (Tr (x,ts)) = Tr (f x, map (mapTr f) ts)
-
-mapTrM :: Monad m => (a -> m b) -> Tr a -> m (Tr b)
-mapTrM f (Tr (x,ts)) = do
- fx <- f x
- fts <- mapM (mapTrM f) ts
- return $ Tr (fx,fts)
-
-mapPath :: (a -> b) -> Path a -> Path b
-mapPath f p = case p of
- Node (ts1, (p,v), ts2) ->
- Node (map (mapTr f) ts1, (mapPath f p, f v), map (mapTr f) ts2)
- Top -> Top
-
-mapPathM :: Monad m => (a -> m b) -> Path a -> m (Path b)
-mapPathM f p = case p of
- Node (ts1, (p,v), ts2) -> do
- ts1' <- mapM (mapTrM f) ts1
- p' <- mapPathM f p
- v' <- f v
- ts2' <- mapM (mapTrM f) ts2
- return $ Node (ts1', (p',v'), ts2')
- Top -> return Top
-
-mapLoc :: (a -> b) -> Loc a -> Loc b
-mapLoc f (Loc (t,p)) = Loc (mapTr f t, mapPath f p)
-
-mapLocM :: Monad m => (a -> m b) -> Loc a -> m (Loc b)
-mapLocM f (Loc (t,p)) = do
- t' <- mapTrM f t
- p' <- mapPathM f p
- return $ (Loc (t',p'))
-
-foldTr :: (a -> [b] -> b) -> Tr a -> b
-foldTr f (Tr (x,ts)) = f x (map (foldTr f) ts)
-
-foldTrM :: Monad m => (a -> [b] -> m b) -> Tr a -> m b
-foldTrM f (Tr (x,ts)) = do
- fts <- mapM (foldTrM f) ts
- f x fts
-
-mapSubtrees :: (Tr a -> Tr a) -> Tr a -> Tr a
-mapSubtrees f t = let Tr (x,ts) = f t in Tr (x, map (mapSubtrees f) ts)
-
-mapSubtreesM :: Monad m => (Tr a -> m (Tr a)) -> Tr a -> m (Tr a)
-mapSubtreesM f t = do
- Tr (x,ts) <- f t
- ts' <- mapM (mapSubtreesM f) ts
- return $ Tr (x, ts')
-
--- | change the root without moving the pointer
-changeRoot :: (a -> a) -> Loc a -> Loc a
-changeRoot f loc = case loc of
- Loc (Tr (a,ts),Top) -> Loc (Tr (f a,ts),Top)
- Loc (t, Node (left,pv,right)) -> Loc (t, Node (left,chPath pv,right))
- where
- chPath pv = case pv of
- (Top,a) -> (Top, f a)
- (Node (left,pv,right),v) -> (Node (left, chPath pv,right),v)
-
-nthSubtree :: Int -> Tr a -> Err (Tr a)
-nthSubtree n (Tr (a,ts)) = ts !? n
-
-arityTree :: Tr a -> Int
-arityTree (Tr (_,ts)) = length ts
diff --git a/src-3.0/GF/Devel/README-testgf3 b/src-3.0/GF/Devel/README-testgf3
deleted file mode 100644
index 0d1b6e80a..000000000
--- a/src-3.0/GF/Devel/README-testgf3
+++ /dev/null
@@ -1,49 +0,0 @@
-GF3, the next version of GF
-Aarne Ranta
-
-
-Version 1: 20/2/2008
-
-To compile:
-
- make testgf3
-
-To run:
-
- testgf3 <options>
-
-Options:
-
- -src -- read from source
- -doemit -- emit gfn files
-
-More options (debugging flags):
-
- -show_gf -- show compiled source module after parsing
- -show_extend -- ... after extension
- -show_rename -- ... after renaming
- -show_typecheck -- ... after type checking
- -show_refreshing -- ... after refreshing variables
- -show_optimize -- ... after partial evaluation
- -show_factorize -- ... after factoring optimization
- -show_all -- show all phases
-
- -1 -- stop after parsing
- -2 -- ... extending
- -3 -- ... renaming
- -4 -- ... type checking
- -5 -- ... refreshing
-
-==Compiler Phases==
-
-LexGF
-ParGF
-SourceToGF
-Extend
-Rename
-CheckGrammar
-Refresh
-Optimize
-Factorize
-GFtoGFCC
-
diff --git a/src-3.0/GF/Devel/gf-code.txt b/src-3.0/GF/Devel/gf-code.txt
deleted file mode 100644
index e8954bedf..000000000
--- a/src-3.0/GF/Devel/gf-code.txt
+++ /dev/null
@@ -1,66 +0,0 @@
-Guide to GF Implementation Code
-Aarne Ranta
-
-
-
-This document describes the code in GF grammar compiler and interactive
-environment. It is aimed to cover well the implementation of the forthcoming
-GF3. In comparison to GF 2.8, this implementation uses
-- the same source language, GF (only slightly modified)
-- a different run-time target language, GFCC (instead of GFCM)
-- a different separate compilation target language (a fragment GF itself,
- instead of GFC)
-- a different internal representation of source code
-
-
-Apart from GFCC, the goal of GF3 is simplification and consolidation, rather
-than innovation. This is shown in particular in the abolition of GFC, and in
-the streamlined internal source code format. The insight needed to achieve
-these simplifications would not have been possible (at least for us) without
-years of experimenting with the more messy formats; those formats moreover
-grew organically when features were added to the GF language, and the old
-implementation was thus a result of evolution rather than careful planning.
-
-GF3 is planned to be released in an Alpha version in the end of 2007, its
-sources forming a part of GF release 2.9.
-
-There are currently two versions of GF3, as regards executables and ``make``
-items:
-- ``gf3``, using the old internal representation of source language, and
- integrating a compiler from GF to GFCC and an interpreter of GFCC
-- ``testgf3``, using the new formats everywhere but implementing the compiler
- only; this program does not yet yield reasonable output
-
-
-The descriptions below will target the newest ideas, that is, ``textgf3``
-whenever it differs from ``gf3``.
-
-
-==The structure of the code==
-
-Code that is not shared with GF 2.8 is located in subdirectories of
-``GF/Devel/``. Those subdirectories will, however, be moved one level
-up. Currently they include
-- ``GF/Devel/Grammar``: the datatypes and basic operations of source code
-- ``GF/Devel/Compile``: the phases of compiling GF to GFCC
-
-
-The other directories involved are
-- ``GF/GFCC``: data types and functionalities of GFCC
-- ``GF/Infra``: infrastructure utilities for the implementation
-- ``GF/Data``: datastructures belonging to infrastructure
-
-
-==The source code implementation==
-
-==The compiler==
-
-==The GFCC interpreter==
-
-==The GF command interpreter==
-
-
-
-
-
-
diff --git a/src-3.0/GF/Devel/gf3.txt b/src-3.0/GF/Devel/gf3.txt
deleted file mode 100644
index 56feeba2a..000000000
--- a/src-3.0/GF/Devel/gf3.txt
+++ /dev/null
@@ -1,84 +0,0 @@
-GF Version 3.0
-Aarne Ranta
-7 November 2007
-
-
-This document summarizes the goals and status of the forthcoming
-GF version 3.0.
-
-==Overview==
-
-GF 3 results from the following needs:
-- refactor GF to make it more maintainable
-- provide a simple command-line batch compiler
-- replace gfc by the much simpler gfcc format for embedded grammars
-
-
-The current implementation of GF 3 has three binaries:
-- gfc, batch compiler, for building grammar applications
-- gfi, interpreter for gfcc grammars, for using grammars
-- gf, interactive compiler with interpreter, for developing grammars
-
-
-Thus, roughly, gf = gfc + gfi.
-
-Question: should we have, like current GF, just one binary, gf, and
-implement the others by shell scripts calling gf with suitable options?
-- +: one binary is less code altogether
-- +: one binary is easier to distribute and update
-- -: each of the components is less code by itself
-- -: many users might only need either the compiler or the interpreter
-- -: those users could avoid installation problems such as readline
-
-
-There are some analogies in other languages:
-
- || GF | Haskell | Java ||
- | gfc | ghc | javac |
- | gfi | ghci* | java |
- | gf | ghci* | - |
-
-In Haskell, ghci makes more than gfi since it reads source files, but
-less than gf since it does not compile them to externally usable target
-code.
-
-
-
-
-==Status of code and functionalities==
-
-GF executable v. 2.8
-- gf: 263 modules, executable 7+ MB (on MacOS i386)
-
-
-Current status of GF 3.0 alpha:
-- gf3: 94 modules, executable 4+ MB
-- gfc: 71 modules, executable 3+ MB
-- gfi: 35 modules, executable 1+ MB
-
-
-Missing functionalities
-- in gfc:
- - input formats: cf, ebnf, gfe, old gf
- - output formats: speech grammars, bnfc
- - integrating options for input, output, and debugging information
- (as described in Devel/GFC/Options.hs)
-
-
-- in gfi:
- - command cc (computing with resource)
- - morphological analysis, linearization with tables
- - quizzes, treebanks
- - syntax editor
- - readline
-
-
-==Additional feature options==
-
-Native Haskell readline
-
-Binary formats for gfo and gfcc
-
-Parallel compilation on multicore machines
-
-
diff --git a/src-3.0/GF/Grammar/API.hs b/src-3.0/GF/Grammar/API.hs
deleted file mode 100644
index 182b5e94e..000000000
--- a/src-3.0/GF/Grammar/API.hs
+++ /dev/null
@@ -1,75 +0,0 @@
-module GF.Grammar.API (
- Grammar,
- emptyGrammar,
- pTerm,
- prTerm,
- checkTerm,
- computeTerm,
- showTerm,
- TermPrintStyle(..),
- pTermPrintStyle
- ) where
-
-import GF.Source.ParGF
-import GF.Source.SourceToGrammar (transExp)
-import GF.Grammar.Grammar
-import GF.Infra.Ident
-import GF.Infra.Modules (greatestResource)
-import GF.Compile.GetGrammar
-import GF.Grammar.Macros
-import GF.Grammar.PrGrammar
-
-import GF.Compile.Rename (renameSourceTerm)
-import GF.Compile.CheckGrammar (justCheckLTerm)
-import GF.Compile.Compute (computeConcrete)
-
-import GF.Data.Operations
-import GF.Infra.Option
-
-import qualified Data.ByteString.Char8 as BS
-
-type Grammar = SourceGrammar
-
-emptyGrammar :: Grammar
-emptyGrammar = emptySourceGrammar
-
-pTerm :: String -> Err Term
-pTerm s = do
- e <- pExp $ myLexer (BS.pack s)
- transExp e
-
-prTerm :: Term -> String
-prTerm = prt
-
-checkTerm :: Grammar -> Term -> Err Term
-checkTerm gr t = do
- mo <- maybe (Bad "no source grammar in scope") return $ greatestResource gr
- checkTermAny gr mo t
-
-checkTermAny :: Grammar -> Ident -> Term -> Err Term
-checkTermAny gr m t = do
- t1 <- renameSourceTerm gr m t
- justCheckLTerm gr t1
-
-computeTerm :: Grammar -> Term -> Err Term
-computeTerm = computeConcrete
-
-showTerm :: TermPrintStyle -> Term -> String
-showTerm style t =
- case style of
- TermPrintTable -> unlines [p +++ s | (p,s) <- prTermTabular t]
- TermPrintAll -> unlines [ s | (p,s) <- prTermTabular t]
- TermPrintUnqual -> prt_ t
- TermPrintDefault -> prt t
-
-
-data TermPrintStyle = TermPrintTable | TermPrintAll | TermPrintUnqual | TermPrintDefault
- deriving (Show,Eq)
-
-pTermPrintStyle s = case s of
- "table" -> TermPrintTable
- "all" -> TermPrintAll
- "unqual" -> TermPrintUnqual
- _ -> TermPrintDefault
-
-
diff --git a/src-3.0/GF/Grammar/Abstract.hs b/src-3.0/GF/Grammar/Abstract.hs
deleted file mode 100644
index c03783a52..000000000
--- a/src-3.0/GF/Grammar/Abstract.hs
+++ /dev/null
@@ -1,38 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : Abstract
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/04/21 16:22:18 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.4 $
---
--- (Description of the module)
------------------------------------------------------------------------------
-
-module GF.Grammar.Abstract (
-
-module GF.Grammar.Grammar,
-module GF.Grammar.Values,
-module GF.Grammar.Macros,
-module GF.Infra.Ident,
-module GF.Grammar.MMacros,
-module GF.Grammar.PrGrammar,
-
-Grammar
-
- ) where
-
-import GF.Grammar.Grammar
-import GF.Grammar.Values
-import GF.Grammar.Macros
-import GF.Infra.Ident
-import GF.Grammar.MMacros
-import GF.Grammar.PrGrammar
-
-type Grammar = SourceGrammar ---
-
-
-
diff --git a/src-3.0/GF/Grammar/AppPredefined.hs b/src-3.0/GF/Grammar/AppPredefined.hs
deleted file mode 100644
index cfb6baf1d..000000000
--- a/src-3.0/GF/Grammar/AppPredefined.hs
+++ /dev/null
@@ -1,158 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : AppPredefined
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/10/06 14:21:34 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.13 $
---
--- Predefined function type signatures and definitions.
------------------------------------------------------------------------------
-
-module GF.Grammar.AppPredefined (isInPredefined, typPredefined, appPredefined
- ) where
-
-import GF.Infra.Ident
-import GF.Data.Operations
-import GF.Grammar.Predef
-import GF.Grammar.Grammar
-import GF.Grammar.Macros
-import GF.Grammar.PrGrammar (prt,prt_,prtBad)
-import qualified Data.ByteString.Char8 as BS
-
--- predefined function type signatures and definitions. AR 12/3/2003.
-
-isInPredefined :: Ident -> Bool
-isInPredefined = err (const True) (const False) . typPredefined
-
-typPredefined :: Ident -> Err Type
-typPredefined f
- | f == cInt = return typePType
- | f == cFloat = return typePType
- | f == cErrorType = return typeType
- | f == cInts = return $ mkFunType [typeInt] typePType
- | f == cPBool = return typePType
- | f == cError = return $ mkFunType [typeStr] typeError -- non-can. of empty set
- | f == cPFalse = return $ typePBool
- | f == cPTrue = return $ typePBool
- | f == cDp = return $ mkFunType [typeInt,typeTok] typeTok
- | f == cDrop = return $ mkFunType [typeInt,typeTok] typeTok
- | f == cEqInt = return $ mkFunType [typeInt,typeInt] typePBool
- | f == cLessInt = return $ mkFunType [typeInt,typeInt] typePBool
- | f == cEqStr = return $ mkFunType [typeTok,typeTok] typePBool
- | f == cLength = return $ mkFunType [typeTok] typeInt
- | f == cOccur = return $ mkFunType [typeTok,typeTok] typePBool
- | f == cOccurs = return $ mkFunType [typeTok,typeTok] typePBool
- | f == cPlus = return $ mkFunType [typeInt,typeInt] (typeInt)
----- "read" -> (P : Type) -> Tok -> P
- | f == cShow = return $ mkProd -- (P : PType) -> P -> Tok
- ([(varP,typePType),(identW,Vr varP)],typeStr,[])
- | f == cToStr = return $ mkProd -- (L : Type) -> L -> Str
- ([(varL,typeType),(identW,Vr varL)],typeStr,[])
- | f == cMapStr = return $ mkProd -- (L : Type) -> (Str -> Str) -> L -> L
- ([(varL,typeType),(identW,mkFunType [typeStr] typeStr),(identW,Vr varL)],Vr varL,[])
- | f == cTake = return $ mkFunType [typeInt,typeTok] typeTok
- | f == cTk = return $ mkFunType [typeInt,typeTok] typeTok
- | otherwise = prtBad "unknown in Predef:" f
-
-varL :: Ident
-varL = identC (BS.pack "L")
-
-varP :: Ident
-varP = identC (BS.pack "P")
-
-appPredefined :: Term -> Err (Term,Bool)
-appPredefined t = case t of
- App f x0 -> do
- (x,_) <- appPredefined x0
- case f of
- -- one-place functions
- Q mod f | mod == cPredef ->
- case x of
- (K s) | f == cLength -> retb $ EInt $ toInteger $ length s
- _ -> retb t
-
- -- two-place functions
- App (Q mod f) z0 | mod == cPredef -> do
- (z,_) <- appPredefined z0
- case (norm z, norm x) of
- (EInt i, K s) | f == cDrop -> retb $ K (drop (fi i) s)
- (EInt i, K s) | f == cTake -> retb $ K (take (fi i) s)
- (EInt i, K s) | f == cTk -> retb $ K (take (max 0 (length s - fi i)) s)
- (EInt i, K s) | f == cDp -> retb $ K (drop (max 0 (length s - fi i)) s)
- (K s, K t) | f == cEqStr -> retb $ if s == t then predefTrue else predefFalse
- (K s, K t) | f == cOccur -> retb $ if substring s t then predefTrue else predefFalse
- (K s, K t) | f == cOccurs -> retb $ if any (flip elem t) s then predefTrue else predefFalse
- (EInt i, EInt j) | f == cEqInt -> retb $ if i==j then predefTrue else predefFalse
- (EInt i, EInt j) | f == cLessInt -> retb $ if i<j then predefTrue else predefFalse
- (EInt i, EInt j) | f == cPlus -> retb $ EInt $ i+j
- (_, t) | f == cShow -> retb $ foldr C Empty $ map K $ words $ prt t
- (_, K s) | f == cRead -> retb $ Cn (identC (BS.pack s)) --- because of K, only works for atomic tags
- (_, t) | f == cToStr -> trm2str t >>= retb
- _ -> retb t ---- prtBad "cannot compute predefined" t
-
- -- three-place functions
- App (App (Q mod f) z0) y0 | mod == cPredef -> do
- (y,_) <- appPredefined y0
- (z,_) <- appPredefined z0
- case (z, y, x) of
- (ty,op,t) | f == cMapStr -> retf $ mapStr ty op t
- _ -> retb t ---- prtBad "cannot compute predefined" t
-
- _ -> retb t ---- prtBad "cannot compute predefined" t
- _ -> retb t
- ---- should really check the absence of arg variables
- where
- retb t = return (retc t,True) -- no further computing needed
- retf t = return (retc t,False) -- must be computed further
- retc t = case t of
- K [] -> t
- K s -> foldr1 C (map K (words s))
- _ -> t
- norm t = case t of
- Empty -> K []
- C u v -> case (norm u,norm v) of
- (K x,K y) -> K (x +++ y)
- _ -> t
- _ -> t
- fi = fromInteger
-
--- read makes variables into constants
-
-predefTrue = Q cPredef cPTrue
-predefFalse = Q cPredef cPFalse
-
-substring :: String -> String -> Bool
-substring s t = case (s,t) of
- (c:cs, d:ds) -> (c == d && substring cs ds) || substring s ds
- ([],_) -> True
- _ -> False
-
-trm2str :: Term -> Err Term
-trm2str t = case t of
- R ((_,(_,s)):_) -> trm2str s
- T _ ((_,s):_) -> trm2str s
- TSh _ ((_,s):_) -> trm2str s
- V _ (s:_) -> trm2str s
- C _ _ -> return $ t
- K _ -> return $ t
- S c _ -> trm2str c
- Empty -> return $ t
- _ -> prtBad "cannot get Str from term" t
-
--- simultaneous recursion on type and term: type arg is essential!
--- But simplify the task by assuming records are type-annotated
--- (this has been done in type checking)
-mapStr :: Type -> Term -> Term -> Term
-mapStr ty f t = case (ty,t) of
- _ | elem ty [typeStr,typeTok] -> App f t
- (_, R ts) -> R [(l,mapField v) | (l,v) <- ts]
- (Table a b,T ti cs) -> T ti [(p,mapStr b f v) | (p,v) <- cs]
- _ -> t
- where
- mapField (mty,te) = case mty of
- Just ty -> (mty,mapStr ty f te)
- _ -> (mty,te)
diff --git a/src-3.0/GF/Grammar/Grammar.hs b/src-3.0/GF/Grammar/Grammar.hs
deleted file mode 100644
index 4210358f1..000000000
--- a/src-3.0/GF/Grammar/Grammar.hs
+++ /dev/null
@@ -1,264 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : Grammar
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/04/21 16:22:20 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.8 $
---
--- GF source abstract syntax used internally in compilation.
---
--- AR 23\/1\/2000 -- 30\/5\/2001 -- 4\/5\/2003
------------------------------------------------------------------------------
-
-module GF.Grammar.Grammar (SourceGrammar,
- emptySourceGrammar,
- SourceModInfo,
- SourceModule,
- SourceAbs,
- SourceRes,
- SourceCnc,
- Info(..),
- PValues,
- Perh,
- MPr,
- Type,
- Cat,
- Fun,
- QIdent,
- Term(..),
- Patt(..),
- TInfo(..),
- Label(..),
- MetaSymb(..),
- Decl,
- Context,
- Equation,
- Labelling,
- Assign,
- Case,
- Cases,
- LocalDef,
- Param,
- Altern,
- Substitution,
- Branch(..),
- Con,
- Trm,
- wildPatt,
- varLabel, tupleLabel, linLabel, theLinLabel,
- ident2label, label2ident
- ) where
-
-import GF.Data.Str
-import GF.Infra.Ident
-import GF.Infra.Option ---
-import GF.Infra.Modules
-
-import GF.Data.Operations
-
-import qualified Data.ByteString.Char8 as BS
-
--- | grammar as presented to the compiler
-type SourceGrammar = MGrammar Ident Info
-
-emptySourceGrammar = MGrammar []
-
-type SourceModInfo = ModInfo Ident Info
-
-type SourceModule = (Ident, SourceModInfo)
-
-type SourceAbs = Module Ident Info
-type SourceRes = Module Ident Info
-type SourceCnc = Module Ident Info
-
--- this is created in CheckGrammar, and so are Val and PVal
-type PValues = [Term]
-
--- | the constructors are judgements in
---
--- - abstract syntax (/ABS/)
---
--- - resource (/RES/)
---
--- - concrete syntax (/CNC/)
---
--- and indirection to module (/INDIR/)
-data Info =
--- judgements in abstract syntax
- AbsCat (Perh Context) (Perh [Term]) -- ^ (/ABS/) constructors; must be 'Id' or 'QId'
- | AbsFun (Perh Type) (Perh Term) -- ^ (/ABS/) 'Yes f' = canonical
- | AbsTrans Term -- ^ (/ABS/)
-
--- judgements in resource
- | ResParam (Perh ([Param],Maybe PValues)) -- ^ (/RES/)
- | ResValue (Perh (Type,Maybe Int)) -- ^ (/RES/) to mark parameter constructors for lookup
- | ResOper (Perh Type) (Perh Term) -- ^ (/RES/)
-
- | ResOverload [Ident] [(Type,Term)] -- ^ (/RES/) idents: modules inherited
-
--- judgements in concrete syntax
- | CncCat (Perh Type) (Perh Term) MPr -- ^ (/CNC/) lindef ini'zed,
- | CncFun (Maybe (Ident,(Context,Type))) (Perh Term) MPr -- (/CNC/) type info added at 'TC'
-
--- indirection to module Ident
- | AnyInd Bool Ident -- ^ (/INDIR/) the 'Bool' says if canonical
- deriving (Read, Show)
-
--- | to express indirection to other module
-type Perh a = Perhaps a Ident
-
--- | printname
-type MPr = Perhaps Term Ident
-
-type Type = Term
-type Cat = QIdent
-type Fun = QIdent
-
-type QIdent = (Ident,Ident)
-
-data Term =
- Vr Ident -- ^ variable
- | Cn Ident -- ^ constant
- | Con Ident -- ^ constructor
- | EData -- ^ to mark in definition that a fun is a constructor
- | Sort Ident -- ^ basic type
- | EInt Integer -- ^ integer literal
- | EFloat Double -- ^ floating point literal
- | K String -- ^ string literal or token: @\"foo\"@
- | Empty -- ^ the empty string @[]@
-
- | App Term Term -- ^ application: @f a@
- | Abs Ident Term -- ^ abstraction: @\x -> b@
- | Meta MetaSymb -- ^ metavariable: @?i@ (only parsable: ? = ?0)
- | Prod Ident Term Term -- ^ function type: @(x : A) -> B@
- | Eqs [Equation] -- ^ abstraction by cases: @fn {x y -> b ; z u -> c}@
- -- only used in internal representation
- | Typed Term Term -- ^ type-annotated term
---
--- /below this, the constructors are only for concrete syntax/
- | Example Term String -- ^ example-based term: @in M.C "foo"
- | RecType [Labelling] -- ^ record type: @{ p : A ; ...}@
- | R [Assign] -- ^ record: @{ p = a ; ...}@
- | P Term Label -- ^ projection: @r.p@
- | PI Term Label Int -- ^ index-annotated projection
- | ExtR Term Term -- ^ extension: @R ** {x : A}@ (both types and terms)
-
- | Table Term Term -- ^ table type: @P => A@
- | T TInfo [Case] -- ^ table: @table {p => c ; ...}@
- | TSh TInfo [Cases] -- ^ table with disjunctive patters (only back end opt)
- | V Type [Term] -- ^ table given as course of values: @table T [c1 ; ... ; cn]@
- | S Term Term -- ^ selection: @t ! p@
- | Val Type Int -- ^ parameter value number: @T # i#
-
- | Let LocalDef Term -- ^ local definition: @let {t : T = a} in b@
-
- | Alias Ident Type Term -- ^ constant and its definition, used in inlining
-
- | Q Ident Ident -- ^ qualified constant from a package
- | QC Ident Ident -- ^ qualified constructor from a package
-
- | C Term Term -- ^ concatenation: @s ++ t@
- | Glue Term Term -- ^ agglutination: @s + t@
-
- | EPatt Patt -- ^ pattern (in macro definition): # p
- | EPattType Term -- ^ pattern type: pattern T
-
- | FV [Term] -- ^ alternatives in free variation: @variants { s ; ... }@
-
- | Alts (Term, [(Term, Term)]) -- ^ alternatives by prefix: @pre {t ; s\/c ; ...}@
- | Strs [Term] -- ^ conditioning prefix strings: @strs {s ; ...}@
---
--- /below this, the last three constructors are obsolete/
- | LiT Ident -- ^ linearization type
- | Ready Str -- ^ result of compiling; not to be parsed ...
- | Computed Term -- ^ result of computing: not to be reopened nor parsed
-
- deriving (Read, Show, Eq, Ord)
-
-data Patt =
- PC Ident [Patt] -- ^ constructor pattern: @C p1 ... pn@ @C@
- | PP Ident Ident [Patt] -- ^ package constructor pattern: @P.C p1 ... pn@ @P.C@
- | PV Ident -- ^ variable pattern: @x@
- | PW -- ^ wild card pattern: @_@
- | PR [(Label,Patt)] -- ^ record pattern: @{r = p ; ...}@ -- only concrete
- | PString String -- ^ string literal pattern: @\"foo\"@ -- only abstract
- | PInt Integer -- ^ integer literal pattern: @12@ -- only abstract
- | PFloat Double -- ^ float literal pattern: @1.2@ -- only abstract
- | PT Type Patt -- ^ type-annotated pattern
-
- | PVal Type Int -- ^ parameter value number: @T # i#
-
- | PAs Ident Patt -- ^ as-pattern: x@p
-
- -- regular expression patterns
- | PNeg Patt -- ^ negated pattern: -p
- | PAlt Patt Patt -- ^ disjunctive pattern: p1 | p2
- | PSeq Patt Patt -- ^ sequence of token parts: p + q
- | PRep Patt -- ^ repetition of token part: p*
- | PChar -- ^ string of length one: ?
- | PChars [Char] -- ^ character list: ["aeiou"]
- | PMacro Ident -- #p
- | PM Ident Ident -- #m.p
-
- deriving (Read, Show, Eq, Ord)
-
--- | to guide computation and type checking of tables
-data TInfo =
- TRaw -- ^ received from parser; can be anything
- | TTyped Type -- ^ type annontated, but can be anything
- | TComp Type -- ^ expanded
- | TWild Type -- ^ just one wild card pattern, no need to expand
- deriving (Read, Show, Eq, Ord)
-
--- | record label
-data Label =
- LIdent BS.ByteString
- | LVar Int
- deriving (Read, Show, Eq, Ord)
-
-newtype MetaSymb = MetaSymb Int deriving (Read, Show, Eq, Ord)
-
-type Decl = (Ident,Term) -- (x:A) (_:A) A
-type Context = [Decl] -- (x:A)(y:B) (x,y:A) (_,_:A)
-type Equation = ([Patt],Term)
-
-type Labelling = (Label, Term)
-type Assign = (Label, (Maybe Type, Term))
-type Case = (Patt, Term)
-type Cases = ([Patt], Term)
-type LocalDef = (Ident, (Maybe Type, Term))
-
-type Param = (Ident, Context)
-type Altern = (Term, [(Term, Term)])
-
-type Substitution = [(Ident, Term)]
-
--- | branches à la Alfa
-newtype Branch = Branch (Con,([Ident],Term)) deriving (Eq, Ord,Show,Read)
-type Con = Ident ---
-
-varLabel :: Int -> Label
-varLabel = LVar
-
-tupleLabel, linLabel :: Int -> Label
-tupleLabel i = LIdent $! BS.pack ('p':show i)
-linLabel i = LIdent $! BS.pack ('s':show i)
-
-theLinLabel :: Label
-theLinLabel = LIdent (BS.singleton 's')
-
-ident2label :: Ident -> Label
-ident2label c = LIdent (ident2bs c)
-
-label2ident :: Label -> Ident
-label2ident (LIdent s) = identC s
-label2ident (LVar i) = identC (BS.pack ('$':show i))
-
-wildPatt :: Patt
-wildPatt = PV identW
-
-type Trm = Term
diff --git a/src-3.0/GF/Grammar/Lockfield.hs b/src-3.0/GF/Grammar/Lockfield.hs
deleted file mode 100644
index 12b78ab9b..000000000
--- a/src-3.0/GF/Grammar/Lockfield.hs
+++ /dev/null
@@ -1,51 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : Lockfield
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/11/11 23:24:34 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.7 $
---
--- Creating and using lock fields in reused resource grammars.
---
--- AR 8\/2\/2005 detached from 'compile/MkResource'
------------------------------------------------------------------------------
-
-module GF.Grammar.Lockfield (lockRecType, unlockRecord, lockLabel, isLockLabel) where
-
-import qualified Data.ByteString.Char8 as BS
-
-import GF.Infra.Ident
-import GF.Grammar.Grammar
-import GF.Grammar.Macros
-import GF.Grammar.PrGrammar
-
-import GF.Data.Operations
-
-lockRecType :: Ident -> Type -> Err Type
-lockRecType c t@(RecType rs) =
- let lab = lockLabel c in
- return $ if elem lab (map fst rs) || elem (prt c) ["String","Int"]
- then t --- don't add an extra copy of lock field, nor predef cats
- else RecType (rs ++ [(lockLabel c, RecType [])])
-lockRecType c t = plusRecType t $ RecType [(lockLabel c, RecType [])]
-
-unlockRecord :: Ident -> Term -> Err Term
-unlockRecord c ft = do
- let (xs,t) = termFormCnc ft
- t' <- plusRecord t $ R [(lockLabel c, (Just (RecType []),R []))]
- return $ mkAbs xs t'
-
-lockLabel :: Ident -> Label
-lockLabel c = LIdent $! BS.append lockPrefix (ident2bs c)
-
-isLockLabel :: Label -> Bool
-isLockLabel l = case l of
- LIdent c -> BS.isPrefixOf lockPrefix c
- _ -> False
-
-
-lockPrefix = BS.pack "lock_"
diff --git a/src-3.0/GF/Grammar/LookAbs.hs b/src-3.0/GF/Grammar/LookAbs.hs
deleted file mode 100644
index f9a251eb1..000000000
--- a/src-3.0/GF/Grammar/LookAbs.hs
+++ /dev/null
@@ -1,53 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : LookAbs
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/04/28 16:42:48 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.14 $
---
--- (Description of the module)
------------------------------------------------------------------------------
-
-module GF.Grammar.LookAbs (
- lookupFunType,
- lookupCatContext
- ) where
-
-import GF.Data.Operations
-import GF.Grammar.Abstract
-import GF.Infra.Ident
-
-import GF.Infra.Modules
-
-import Data.List (nub)
-import Control.Monad
-
--- | this is needed at compile time
-lookupFunType :: Grammar -> Ident -> Ident -> Err Type
-lookupFunType gr m c = do
- mi <- lookupModule gr m
- case mi of
- ModMod mo -> do
- info <- lookupIdentInfo mo c
- case info of
- AbsFun (Yes t) _ -> return t
- AnyInd _ n -> lookupFunType gr n c
- _ -> prtBad "cannot find type of" c
- _ -> Bad $ prt m +++ "is not an abstract module"
-
--- | this is needed at compile time
-lookupCatContext :: Grammar -> Ident -> Ident -> Err Context
-lookupCatContext gr m c = do
- mi <- lookupModule gr m
- case mi of
- ModMod mo -> do
- info <- lookupIdentInfo mo c
- case info of
- AbsCat (Yes co) _ -> return co
- AnyInd _ n -> lookupCatContext gr n c
- _ -> prtBad "unknown category" c
- _ -> Bad $ prt m +++ "is not an abstract module"
diff --git a/src-3.0/GF/Grammar/Lookup.hs b/src-3.0/GF/Grammar/Lookup.hs
deleted file mode 100644
index a4208b21b..000000000
--- a/src-3.0/GF/Grammar/Lookup.hs
+++ /dev/null
@@ -1,269 +0,0 @@
-{-# LANGUAGE PatternGuards #-}
-----------------------------------------------------------------------
--- |
--- Module : Lookup
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/10/27 13:21:53 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.15 $
---
--- Lookup in source (concrete and resource) when compiling.
---
--- lookup in resource and concrete in compiling; for abstract, use 'Look'
------------------------------------------------------------------------------
-
-module GF.Grammar.Lookup (
- lookupResDef,
- lookupResDefKind,
- lookupResType,
- lookupOverload,
- lookupParams,
- lookupParamValues,
- lookupFirstTag,
- lookupValueIndex,
- lookupIndexValue,
- allOrigInfos,
- allParamValues,
- lookupAbsDef,
- lookupLincat,
- opersForType
- ) where
-
-import GF.Data.Operations
-import GF.Grammar.Abstract
-import GF.Infra.Modules
-import GF.Grammar.Predef
-import GF.Grammar.Lockfield
-
-import Data.List (nub,sortBy)
-import Control.Monad
-
--- whether lock fields are added in reuse
-lock c = lockRecType c -- return
-unlock c = unlockRecord c -- return
-
-lookupResDef :: SourceGrammar -> Ident -> Ident -> Err Term
-lookupResDef gr m c = liftM fst $ lookupResDefKind gr m c
-
--- 0 = oper, 1 = lin, 2 = canonical. v > 0 means: no need to be recomputed
-lookupResDefKind :: SourceGrammar -> Ident -> Ident -> Err (Term,Int)
-lookupResDefKind gr m c
- | isPredefCat c = return (Q cPredefAbs c,2) --- need this in gf3 12/6/2008
- | otherwise = look True m c where
- look isTop m c = do
- mi <- lookupModule gr m
- case mi of
- ModMod mo -> do
- info <- lookupIdentInfoIn mo m c
- case info of
- ResOper _ (Yes t) -> return (qualifAnnot m t, 0)
- ResOper _ Nope -> return (Q m c, 0) ---- if isTop then lookExt m c
- ---- else prtBad "cannot find in exts" c
-
- CncCat (Yes ty) _ _ -> liftM (flip (,) 1) $ lock c ty
- CncCat _ _ _ -> liftM (flip (,) 1) $ lock c defLinType
- CncFun (Just (cat,_)) (Yes tr) _ -> liftM (flip (,) 1) $ unlock cat tr
-
- CncFun _ (Yes tr) _ -> liftM (flip (,) 1) (return tr) ---- $ unlock c tr
-
- AnyInd _ n -> look False n c
- ResParam _ -> return (QC m c,2)
- ResValue _ -> return (QC m c,2)
- _ -> Bad $ prt c +++ "is not defined in resource" +++ prt m
- _ -> Bad $ prt m +++ "is not a resource"
- lookExt m c =
- checks ([look False n c | n <- allExtensions gr m] ++ [return (Q m c,3)])
-
-lookupResType :: SourceGrammar -> Ident -> Ident -> Err Type
-lookupResType gr m c = do
- mi <- lookupModule gr m
- case mi of
- ModMod mo -> do
- info <- lookupIdentInfo mo c
- case info of
- ResOper (Yes t) _ -> return $ qualifAnnot m t
- ResOper (May n) _ -> lookupResType gr n c
-
- -- used in reused concrete
- CncCat _ _ _ -> return typeType
- CncFun (Just (cat,(cont@(_:_),val))) _ _ -> do
- val' <- lock cat val
- return $ mkProd (cont, val', [])
- CncFun _ _ _ -> lookFunType m m c
- AnyInd _ n -> lookupResType gr n c
- ResParam _ -> return $ typePType
- ResValue (Yes (t,_)) -> return $ qualifAnnotPar m t
- _ -> Bad $ prt c +++ "has no type defined in resource" +++ prt m
- _ -> Bad $ prt m +++ "is not a resource"
- where
- lookFunType e m c = do
- a <- abstractOfConcrete gr m
- lookFun e m c a
- lookFun e m c a = do
- mu <- lookupModMod gr a
- info <- lookupIdentInfo mu c
- case info of
- AbsFun (Yes ty) _ -> return $ redirectTerm e ty
- AbsCat _ _ -> return typeType
- AnyInd _ n -> lookFun e m c n
- _ -> prtBad "cannot find type of reused function" c
-
-lookupOverload :: SourceGrammar -> Ident -> Ident -> Err [([Type],(Type,Term))]
-lookupOverload gr m c = do
- mi <- lookupModule gr m
- case mi of
- ModMod mo -> do
- info <- lookupIdentInfo mo c
- case info of
- ResOverload os tysts -> do
- tss <- mapM (\x -> lookupOverload gr x c) os
- return $ [(map snd args,(val,tr)) |
- (ty,tr) <- tysts, Ok (args,val) <- [typeFormCnc ty]] ++
- concat tss
-
- AnyInd _ n -> lookupOverload gr n c
- _ -> Bad $ prt c +++ "is not an overloaded operation"
- _ -> Bad $ prt m +++ "is not a resource"
-
-lookupOrigInfo :: SourceGrammar -> Ident -> Ident -> Err Info
-lookupOrigInfo gr m c = do
- mi <- lookupModule gr m
- case mi of
- ModMod mo -> do
- info <- lookupIdentInfo mo c
- case info of
- AnyInd _ n -> lookupOrigInfo gr n c
- i -> return i
- _ -> Bad $ prt m +++ "is not run-time module"
-
-lookupParams :: SourceGrammar -> Ident -> Ident -> Err ([Param],Maybe PValues)
-lookupParams gr = look True where
- look isTop m c = do
- mi <- lookupModule gr m
- case mi of
- ModMod mo -> do
- info <- lookupIdentInfo mo c
- case info of
- ResParam (Yes psm) -> return psm
- AnyInd _ n -> look False n c
- _ -> Bad $ prt c +++ "has no parameters defined in resource" +++ prt m
- _ -> Bad $ prt m +++ "is not a resource"
- lookExt m c =
- checks [look False n c | n <- allExtensions gr m]
-
-lookupParamValues :: SourceGrammar -> Ident -> Ident -> Err [Term]
-lookupParamValues gr m c = do
- (ps,mpv) <- lookupParams gr m c
- case mpv of
- Just ts -> return ts
- _ -> liftM concat $ mapM mkPar ps
- where
- mkPar (f,co) = do
- vs <- liftM combinations $ mapM (\ (_,ty) -> allParamValues gr ty) co
- return $ map (mkApp (QC m f)) vs
-
-lookupFirstTag :: SourceGrammar -> Ident -> Ident -> Err Term
-lookupFirstTag gr m c = do
- vs <- lookupParamValues gr m c
- case vs of
- v:_ -> return v
- _ -> prtBad "no parameter values given to type" c
-
-lookupValueIndex :: SourceGrammar -> Type -> Term -> Err Term
-lookupValueIndex gr ty tr = do
- ts <- allParamValues gr ty
- case lookup tr $ zip ts [0..] of
- Just i -> return $ Val ty i
- _ -> Bad $ "no index for" +++ prt tr +++ "in" +++ prt ty
-
-lookupIndexValue :: SourceGrammar -> Type -> Int -> Err Term
-lookupIndexValue gr ty i = do
- ts <- allParamValues gr ty
- if i < length ts
- then return $ ts !! i
- else Bad $ "no value for index" +++ show i +++ "in" +++ prt ty
-
-allOrigInfos :: SourceGrammar -> Ident -> [(Ident,Info)]
-allOrigInfos gr m = errVal [] $ do
- mi <- lookupModule gr m
- case mi of
- ModMod mo -> return [(c,i) | (c,_) <- tree2list (jments mo), Ok i <- [look c]]
- where
- look = lookupOrigInfo gr m
-
-allParamValues :: SourceGrammar -> Type -> Err [Term]
-allParamValues cnc ptyp = case ptyp of
- _ | Just n <- isTypeInts ptyp -> return [EInt i | i <- [0..n]]
- QC p c -> lookupParamValues cnc p c
- Q p c -> lookupResDef cnc p c >>= allParamValues cnc
- RecType r -> do
- let (ls,tys) = unzip $ sortByFst r
- tss <- mapM allPV tys
- return [R (zipAssign ls ts) | ts <- combinations tss]
- _ -> prtBad "cannot find parameter values for" ptyp
- where
- allPV = allParamValues cnc
- -- to normalize records and record types
- sortByFst = sortBy (\ x y -> compare (fst x) (fst y))
-
-qualifAnnot :: Ident -> Term -> Term
-qualifAnnot _ = id
--- Using this we wouldn't have to annotate constants defined in a module itself.
--- But things are simpler if we do (cf. Zinc).
--- Change Rename.self2status to change this behaviour.
-
--- we need this for lookup in ResVal
-qualifAnnotPar m t = case t of
- Cn c -> Q m c
- Con c -> QC m c
- _ -> composSafeOp (qualifAnnotPar m) t
-
-lookupAbsDef :: SourceGrammar -> Ident -> Ident -> Err (Maybe Term)
-lookupAbsDef gr m c = errIn ("looking up absdef of" +++ prt c) $ do
- mi <- lookupModule gr m
- case mi of
- ModMod mo -> do
- info <- lookupIdentInfo mo c
- case info of
- AbsFun _ (Yes t) -> return $ return t
- AnyInd _ n -> lookupAbsDef gr n c
- _ -> return Nothing
- _ -> Bad $ prt m +++ "is not an abstract module"
-
-lookupLincat :: SourceGrammar -> Ident -> Ident -> Err Type
-lookupLincat gr m c | isPredefCat c = return defLinType --- ad hoc; not needed?
-lookupLincat gr m c = do
- mi <- lookupModule gr m
- case mi of
- ModMod mo -> do
- info <- lookupIdentInfo mo c
- case info of
- CncCat (Yes t) _ _ -> return t
- AnyInd _ n -> lookupLincat gr n c
- _ -> Bad $ prt c +++ "has no linearization type in" +++ prt m
- _ -> Bad $ prt m +++ "is not concrete"
-
-
--- The first type argument is uncomputed, usually a category symbol.
--- This is a hack to find implicit (= reused) opers.
-
-opersForType :: SourceGrammar -> Type -> Type -> [(QIdent,Term)]
-opersForType gr orig val =
- [((i,f),ty) | (i,m) <- allModMod gr, (f,ty) <- opers i m val] where
- opers i m val =
- [(f,ty) |
- (f,ResOper (Yes ty) _) <- tree2list $ jments m,
- Ok valt <- [valTypeCnc ty],
- elem valt [val,orig]
- ] ++
- let cat = err error snd (valCat orig) in --- ignore module
- [(f,ty) |
- Ok a <- [abstractOfConcrete gr i >>= lookupModMod gr],
- (f, AbsFun (Yes ty0) _) <- tree2list $ jments a,
- let ty = redirectTerm i ty0,
- Ok valt <- [valCat ty],
- cat == snd valt ---
- ]
diff --git a/src-3.0/GF/Grammar/MMacros.hs b/src-3.0/GF/Grammar/MMacros.hs
deleted file mode 100644
index f2a0f2cb2..000000000
--- a/src-3.0/GF/Grammar/MMacros.hs
+++ /dev/null
@@ -1,339 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : MMacros
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/05/10 12:49:13 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.9 $
---
--- some more abstractions on grammars, esp. for Edit
------------------------------------------------------------------------------
-
-module GF.Grammar.MMacros where
-
-import GF.Data.Operations
-import GF.Data.Zipper
-
-import GF.Grammar.Grammar
-import GF.Grammar.PrGrammar
-import GF.Infra.Ident
-import GF.Compile.Refresh
-import GF.Grammar.Values
-----import GrammarST
-import GF.Grammar.Macros
-
-import Control.Monad
-import qualified Data.ByteString.Char8 as BS
-
-nodeTree :: Tree -> TrNode
-argsTree :: Tree -> [Tree]
-
-nodeTree (Tr (n,_)) = n
-argsTree (Tr (_,ts)) = ts
-
-isFocusNode :: TrNode -> Bool
-bindsNode :: TrNode -> Binds
-atomNode :: TrNode -> Atom
-valNode :: TrNode -> Val
-constrsNode :: TrNode -> Constraints
-metaSubstsNode :: TrNode -> MetaSubst
-
-isFocusNode (N (_,_,_,_,b)) = b
-bindsNode (N (b,_,_,_,_)) = b
-atomNode (N (_,a,_,_,_)) = a
-valNode (N (_,_,v,_,_)) = v
-constrsNode (N (_,_,_,(c,_),_)) = c
-metaSubstsNode (N (_,_,_,(_,m),_)) = m
-
-atomTree :: Tree -> Atom
-valTree :: Tree -> Val
-
-atomTree = atomNode . nodeTree
-valTree = valNode . nodeTree
-
-mkNode :: Binds -> Atom -> Val -> (Constraints, MetaSubst) -> TrNode
-mkNode binds atom vtyp cs = N (binds,atom,vtyp,cs,False)
-
-type Var = Ident
-type Meta = MetaSymb
-
-metasTree :: Tree -> [Meta]
-metasTree = concatMap metasNode . scanTree where
- metasNode n = [m | AtM m <- [atomNode n]] ++ map fst (metaSubstsNode n)
-
-varsTree :: Tree -> [(Var,Val)]
-varsTree t = [(x,v) | N (_,AtV x,v,_,_) <- scanTree t]
-
-constrsTree :: Tree -> Constraints
-constrsTree = constrsNode . nodeTree
-
-allConstrsTree :: Tree -> Constraints
-allConstrsTree = concatMap constrsNode . scanTree
-
-changeConstrs :: (Constraints -> Constraints) -> TrNode -> TrNode
-changeConstrs f (N (b,a,v,(c,m),x)) = N (b,a,v,(f c, m),x)
-
-changeMetaSubst :: (MetaSubst -> MetaSubst) -> TrNode -> TrNode
-changeMetaSubst f (N (b,a,v,(c,m),x)) = N (b,a,v,(c, f m),x)
-
-changeAtom :: (Atom -> Atom) -> TrNode -> TrNode
-changeAtom f (N (b,a,v,(c,m),x)) = N (b,f a,v,(c, m),x)
-
--- * on the way to Edit
-
-uTree :: Tree
-uTree = Tr (uNode, []) -- unknown tree
-
-uNode :: TrNode
-uNode = mkNode [] uAtom uVal ([],[])
-
-
-uAtom :: Atom
-uAtom = AtM meta0
-
-mAtom :: Atom
-mAtom = AtM meta0
-
-uVal :: Val
-uVal = vClos uExp
-
-vClos :: Exp -> Val
-vClos = VClos []
-
-uExp :: Exp
-uExp = Meta meta0
-
-mExp, mExp0 :: Exp
-mExp = Meta meta0
-mExp0 = mExp
-
-meta2exp :: MetaSymb -> Exp
-meta2exp = Meta
-
-atomC :: Fun -> Atom
-atomC = AtC
-
-funAtom :: Atom -> Err Fun
-funAtom a = case a of
- AtC f -> return f
- _ -> prtBad "not function head" a
-
-atomIsMeta :: Atom -> Bool
-atomIsMeta atom = case atom of
- AtM _ -> True
- _ -> False
-
-getMetaAtom :: Atom -> Err Meta
-getMetaAtom a = case a of
- AtM m -> return m
- _ -> Bad "the active node is not meta"
-
-cat2val :: Context -> Cat -> Val
-cat2val cont cat = vClos $ mkApp (qq cat) [mkMeta i | i <- [1..length cont]]
-
-val2cat :: Val -> Err Cat
-val2cat v = val2exp v >>= valCat
-
-substTerm :: [Ident] -> Substitution -> Term -> Term
-substTerm ss g c = case c of
- Vr x -> maybe c id $ lookup x g
- App f a -> App (substTerm ss g f) (substTerm ss g a)
- Abs x b -> let y = mkFreshVarX ss x in
- Abs y (substTerm (y:ss) ((x, Vr y):g) b)
- Prod x a b -> let y = mkFreshVarX ss x in
- Prod y (substTerm ss g a) (substTerm (y:ss) ((x,Vr y):g) b)
- _ -> c
-
-metaSubstExp :: MetaSubst -> [(Meta,Exp)]
-metaSubstExp msubst = [(m, errVal (meta2exp m) (val2expSafe v)) | (m,v) <- msubst]
-
--- * belong here rather than to computation
-
-substitute :: [Var] -> Substitution -> Exp -> Err Exp
-substitute v s = return . substTerm v s
-
-alphaConv :: [Var] -> (Var,Var) -> Exp -> Err Exp ---
-alphaConv oldvars (x,x') = substitute (x:x':oldvars) [(x,Vr x')]
-
-alphaFresh :: [Var] -> Exp -> Err Exp
-alphaFresh vs = refreshTermN $ maxVarIndex vs
-
--- | done in a state monad
-alphaFreshAll :: [Var] -> [Exp] -> Err [Exp]
-alphaFreshAll vs = mapM $ alphaFresh vs
-
--- | for display
-val2exp :: Val -> Err Exp
-val2exp = val2expP False
-
--- | for type checking
-val2expSafe :: Val -> Err Exp
-val2expSafe = val2expP True
-
-val2expP :: Bool -> Val -> Err Exp
-val2expP safe v = case v of
-
- VClos g@(_:_) e@(Meta _) -> if safe
- then prtBad "unsafe value substitution" v
- else substVal g e
- VClos g e -> substVal g e
- VApp f c -> liftM2 App (val2expP safe f) (val2expP safe c)
- VCn c -> return $ qq c
- VGen i x -> if safe
- then prtBad "unsafe val2exp" v
- else return $ Vr $ x --- in editing, no alpha conversions presentv
- where
- substVal g e = mapPairsM (val2expP safe) g >>= return . (\s -> substTerm [] s e)
-
-isConstVal :: Val -> Bool
-isConstVal v = case v of
- VApp f c -> isConstVal f && isConstVal c
- VCn _ -> True
- VClos [] e -> null $ freeVarsExp e
- _ -> False --- could be more liberal
-
-mkProdVal :: Binds -> Val -> Err Val ---
-mkProdVal bs v = do
- bs' <- mapPairsM val2exp bs
- v' <- val2exp v
- return $ vClos $ foldr (uncurry Prod) v' bs'
-
-freeVarsExp :: Exp -> [Ident]
-freeVarsExp e = case e of
- Vr x -> [x]
- App f c -> freeVarsExp f ++ freeVarsExp c
- Abs x b -> filter (/=x) (freeVarsExp b)
- Prod x a b -> freeVarsExp a ++ filter (/=x) (freeVarsExp b)
- _ -> [] --- thus applies to abstract syntax only
-
-ident2string :: Ident -> String
-ident2string = prIdent
-
-tree :: (TrNode,[Tree]) -> Tree
-tree = Tr
-
-eqCat :: Cat -> Cat -> Bool
-eqCat = (==)
-
-addBinds :: Binds -> Tree -> Tree
-addBinds b (Tr (N (b0,at,t,c,x),ts)) = Tr (N (b ++ b0,at,t,c,x),ts)
-
-bodyTree :: Tree -> Tree
-bodyTree (Tr (N (_,a,t,c,x),ts)) = Tr (N ([],a,t,c,x),ts)
-
-refreshMetas :: [Meta] -> Exp -> Exp
-refreshMetas metas = fst . rms minMeta where
- rms meta trm = case trm of
- Meta m -> (Meta meta, nextMeta meta)
- App f a -> let (f',msf) = rms meta f
- (a',msa) = rms msf a
- in (App f' a', msa)
- Prod x a b ->
- let (a',msa) = rms meta a
- (b',msb) = rms msa b
- in (Prod x a' b', msb)
- Abs x b -> let (b',msb) = rms meta b in (Abs x b', msb)
- _ -> (trm,meta)
- minMeta = int2meta $
- if null metas then 0 else (maximum (map metaSymbInt metas) + 1)
-
-ref2exp :: [Var] -> Type -> Ref -> Err Exp
-ref2exp bounds typ ref = do
- cont <- contextOfType typ
- xx0 <- mapM (typeSkeleton . snd) cont
- let (xxs,cs) = unzip [(length hs, c) | (hs,c) <- xx0]
- args = [mkAbs xs mExp | i <- xxs, let xs = mkFreshVars i bounds]
- return $ mkApp ref args
- -- no refreshment of metas
-
--- | invariant: only 'Con' or 'Var'
-type Ref = Exp
-
-fun2wrap :: [Var] -> ((Fun,Int),Type) -> Exp -> Err Exp
-fun2wrap oldvars ((fun,i),typ) exp = do
- cont <- contextOfType typ
- args <- mapM mkArg (zip [0..] (map snd cont))
- return $ mkApp (qq fun) args
- where
- mkArg (n,c) = do
- cont <- contextOfType c
- let vars = mkFreshVars (length cont) oldvars
- return $ mkAbs vars $ if n==i then exp else mExp
-
--- | weak heuristics: sameness of value category
-compatType :: Val -> Type -> Bool
-compatType v t = errVal True $ do
- cat1 <- val2cat v
- cat2 <- valCat t
- return $ cat1 == cat2
-
----
-
-mkJustProd :: Context -> Term -> Term
-mkJustProd cont typ = mkProd (cont,typ,[])
-
-int2var :: Int -> Ident
-int2var = identC . BS.pack . ('$':) . show
-
-meta0 :: Meta
-meta0 = int2meta 0
-
-termMeta0 :: Term
-termMeta0 = Meta meta0
-
-identVar :: Term -> Err Ident
-identVar (Vr x) = return x
-identVar _ = Bad "not a variable"
-
-
--- | light-weight rename for user interaction; also change names of internal vars
-qualifTerm :: Ident -> Term -> Term
-qualifTerm m = qualif [] where
- qualif xs t = case t of
- Abs x b -> let x' = chV x in Abs x' $ qualif (x':xs) b
- Prod x a b -> Prod x (qualif xs a) $ qualif (x:xs) b
- Vr x -> let x' = chV x in if (elem x' xs) then (Vr x') else (Q m x)
- Cn c -> Q m c
- Con c -> QC m c
- _ -> composSafeOp (qualif xs) t
- chV x = string2var $ ident2bs x
-
-string2var :: BS.ByteString -> Ident
-string2var s = case BS.unpack s of
- c:'_':i -> identV (BS.singleton c) (readIntArg i) ---
- _ -> identC s
-
--- | reindex variables so that they tell nesting depth level
-reindexTerm :: Term -> Term
-reindexTerm = qualif (0,[]) where
- qualif dg@(d,g) t = case t of
- Abs x b -> let x' = ind x d in Abs x' $ qualif (d+1, (x,x'):g) b
- Prod x a b -> let x' = ind x d in Prod x' (qualif dg a) $ qualif (d+1, (x,x'):g) b
- Vr x -> Vr $ look x g
- _ -> composSafeOp (qualif dg) t
- look x = maybe x id . lookup x --- if x is not in scope it is unchanged
- ind x d = identC $ ident2bs x `BS.append` BS.singleton '_' `BS.append` BS.pack (show d)
-
-
--- this method works for context-free abstract syntax
--- and is meant to be used in simple embedded GF applications
-
-exp2tree :: Exp -> Err Tree
-exp2tree e = do
- (bs,f,xs) <- termForm e
- cont <- case bs of
- [] -> return []
- _ -> prtBad "cannot convert bindings in" e
- at <- case f of
- Q m c -> return $ AtC (m,c)
- QC m c -> return $ AtC (m,c)
- Meta m -> return $ AtM m
- K s -> return $ AtL s
- EInt n -> return $ AtI n
- EFloat n -> return $ AtF n
- _ -> prtBad "cannot convert to atom" f
- ts <- mapM exp2tree xs
- return $ Tr (N (cont,at,uVal,([],[]),True),ts)
diff --git a/src-3.0/GF/Grammar/Macros.hs b/src-3.0/GF/Grammar/Macros.hs
deleted file mode 100644
index be03c02a7..000000000
--- a/src-3.0/GF/Grammar/Macros.hs
+++ /dev/null
@@ -1,733 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : Macros
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/11/11 16:38:00 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.24 $
---
--- Macros for constructing and analysing source code terms.
---
--- operations on terms and types not involving lookup in or reference to grammars
---
--- AR 7\/12\/1999 - 9\/5\/2000 -- 4\/6\/2001
------------------------------------------------------------------------------
-
-module GF.Grammar.Macros where
-
-import GF.Data.Operations
-import GF.Data.Str
-import GF.Infra.Ident
-import GF.Grammar.Grammar
-import GF.Grammar.Values
-import GF.Grammar.Predef
-import GF.Grammar.PrGrammar
-
-import Control.Monad (liftM, liftM2)
-import Data.Char (isDigit)
-import Data.List (sortBy)
-
-firstTypeForm :: Type -> Err (Context, Type)
-firstTypeForm t = case t of
- Prod x a b -> do
- (x', val) <- firstTypeForm b
- return ((x,a):x',val)
- _ -> return ([],t)
-
-qTypeForm :: Type -> Err (Context, Cat, [Term])
-qTypeForm t = case t of
- Prod x a b -> do
- (x', cat, args) <- qTypeForm b
- return ((x,a):x', cat, args)
- App c a -> do
- (_,cat, args) <- qTypeForm c
- return ([],cat,args ++ [a])
- Q m c ->
- return ([],(m,c),[])
- QC m c ->
- return ([],(m,c),[])
- _ ->
- prtBad "no normal form of type" t
-
-qq :: QIdent -> Term
-qq (m,c) = Q m c
-
-typeForm :: Type -> Err (Context, Cat, [Term])
-typeForm = qTypeForm ---- no need to distinguish any more
-
-typeFormCnc :: Type -> Err (Context, Type)
-typeFormCnc t = case t of
- Prod x a b -> do
- (x', v) <- typeFormCnc b
- return ((x,a):x',v)
- _ -> return ([],t)
-
-valCat :: Type -> Err Cat
-valCat typ =
- do (_,cat,_) <- typeForm typ
- return cat
-
-valType :: Type -> Err Type
-valType typ =
- do (_,cat,xx) <- typeForm typ --- not optimal to do in this way
- return $ mkApp (qq cat) xx
-
-valTypeCnc :: Type -> Err Type
-valTypeCnc typ =
- do (_,ty) <- typeFormCnc typ
- return ty
-
-typeRawSkeleton :: Type -> Err ([(Int,Type)],Type)
-typeRawSkeleton typ =
- do (cont,typ) <- typeFormCnc typ
- args <- mapM (typeRawSkeleton . snd) cont
- return ([(length c, v) | (c,v) <- args], typ)
-
-type MCat = (Ident,Ident)
-
-getMCat :: Term -> Err MCat
-getMCat t = case t of
- Q m c -> return (m,c)
- QC m c -> return (m,c)
- Sort c -> return (identW, c)
- App f _ -> getMCat f
- _ -> prtBad "no qualified constant" t
-
-typeSkeleton :: Type -> Err ([(Int,MCat)],MCat)
-typeSkeleton typ = do
- (cont,val) <- typeRawSkeleton typ
- cont' <- mapPairsM getMCat cont
- val' <- getMCat val
- return (cont',val')
-
-catSkeleton :: Type -> Err ([MCat],MCat)
-catSkeleton typ =
- do (args,val) <- typeSkeleton typ
- return (map snd args, val)
-
-funsToAndFrom :: Type -> (MCat, [(MCat,[Int])])
-funsToAndFrom t = errVal undefined $ do ---
- (cs,v) <- catSkeleton t
- let cis = zip cs [0..]
- return $ (v, [(c,[i | (c',i) <- cis, c' == c]) | c <- cs])
-
-typeFormConcrete :: Type -> Err (Context, Type)
-typeFormConcrete t = case t of
- Prod x a b -> do
- (x', typ) <- typeFormConcrete b
- return ((x,a):x', typ)
- _ -> return ([],t)
-
-isRecursiveType :: Type -> Bool
-isRecursiveType t = errVal False $ do
- (cc,c) <- catSkeleton t -- thus recursivity on Cat level
- return $ any (== c) cc
-
-isHigherOrderType :: Type -> Bool
-isHigherOrderType t = errVal True $ do -- pessimistic choice
- co <- contextOfType t
- return $ not $ null [x | (x,Prod _ _ _) <- co]
-
-contextOfType :: Type -> Err Context
-contextOfType typ = case typ of
- Prod x a b -> liftM ((x,a):) $ contextOfType b
- _ -> return []
-
-unComputed :: Term -> Term
-unComputed t = case t of
- Computed v -> unComputed v
- _ -> t --- composSafeOp unComputed t
-
-
-{-
---- defined (better) in compile/PrOld
-
-stripTerm :: Term -> Term
-stripTerm t = case t of
- Q _ c -> Cn c
- QC _ c -> Cn c
- T ti psts -> T ti [(stripPatt p, stripTerm v) | (p,v) <- psts]
- _ -> composSafeOp stripTerm t
- where
- stripPatt p = errVal p $ term2patt $ stripTerm $ patt2term p
--}
-
-computed :: Term -> Term
-computed = Computed
-
-termForm :: Term -> Err ([(Ident)], Term, [Term])
-termForm t = case t of
- Abs x b ->
- do (x', fun, args) <- termForm b
- return (x:x', fun, args)
- App c a ->
- do (_,fun, args) <- termForm c
- return ([],fun,args ++ [a])
- _ ->
- return ([],t,[])
-
-termFormCnc :: Term -> ([(Ident)], Term)
-termFormCnc t = case t of
- Abs x b -> (x:xs, t') where (xs,t') = termFormCnc b
- _ -> ([],t)
-
-appForm :: Term -> (Term, [Term])
-appForm t = case t of
- App c a -> (fun, args ++ [a]) where (fun, args) = appForm c
- _ -> (t,[])
-
-varsOfType :: Type -> [Ident]
-varsOfType t = case t of
- Prod x _ b -> x : varsOfType b
- _ -> []
-
-mkProdSimple :: Context -> Term -> Term
-mkProdSimple c t = mkProd (c,t,[])
-
-mkProd :: (Context, Term, [Term]) -> Term
-mkProd ([],typ,args) = mkApp typ args
-mkProd ((x,a):dd, typ, args) = Prod x a (mkProd (dd, typ, args))
-
-mkTerm :: ([(Ident)], Term, [Term]) -> Term
-mkTerm (xx,t,aa) = mkAbs xx (mkApp t aa)
-
-mkApp :: Term -> [Term] -> Term
-mkApp = foldl App
-
-mkAbs :: [Ident] -> Term -> Term
-mkAbs xx t = foldr Abs t xx
-
-appCons :: Ident -> [Term] -> Term
-appCons = mkApp . Cn
-
-mkLet :: [LocalDef] -> Term -> Term
-mkLet defs t = foldr Let t defs
-
-mkLetUntyped :: Context -> Term -> Term
-mkLetUntyped defs = mkLet [(x,(Nothing,t)) | (x,t) <- defs]
-
-isVariable :: Term -> Bool
-isVariable (Vr _ ) = True
-isVariable _ = False
-
-eqIdent :: Ident -> Ident -> Bool
-eqIdent = (==)
-
-uType :: Type
-uType = Cn cUndefinedType
-
-assign :: Label -> Term -> Assign
-assign l t = (l,(Nothing,t))
-
-assignT :: Label -> Type -> Term -> Assign
-assignT l a t = (l,(Just a,t))
-
-unzipR :: [Assign] -> ([Label],[Term])
-unzipR r = (ls, map snd ts) where (ls,ts) = unzip r
-
-mkAssign :: [(Label,Term)] -> [Assign]
-mkAssign lts = [assign l t | (l,t) <- lts]
-
-zipAssign :: [Label] -> [Term] -> [Assign]
-zipAssign ls ts = [assign l t | (l,t) <- zip ls ts]
-
-mapAssignM :: Monad m => (Term -> m c) -> [Assign] -> m [(Label,(Maybe c,c))]
-mapAssignM f = mapM (\ (ls,tv) -> liftM ((,) ls) (g tv))
- where g (t,v) = liftM2 (,) (maybe (return Nothing) (liftM Just . f) t) (f v)
-
-mkRecordN :: Int -> (Int -> Label) -> [Term] -> Term
-mkRecordN int lab typs = R [ assign (lab i) t | (i,t) <- zip [int..] typs]
-
-mkRecord :: (Int -> Label) -> [Term] -> Term
-mkRecord = mkRecordN 0
-
-mkRecTypeN :: Int -> (Int -> Label) -> [Type] -> Type
-mkRecTypeN int lab typs = RecType [ (lab i, t) | (i,t) <- zip [int..] typs]
-
-mkRecType :: (Int -> Label) -> [Type] -> Type
-mkRecType = mkRecTypeN 0
-
-record2subst :: Term -> Err Substitution
-record2subst t = case t of
- R fs -> return [(identC x, t) | (LIdent x,(_,t)) <- fs]
- _ -> prtBad "record expected, found" t
-
-typeType, typePType, typeStr, typeTok, typeStrs :: Term
-
-typeType = Sort cType
-typePType = Sort cPType
-typeStr = Sort cStr
-typeTok = Sort cTok
-typeStrs = Sort cStrs
-
-typeString, typeFloat, typeInt :: Term
-typeInts :: Integer -> Term
-typePBool :: Term
-typeError :: Term
-
-typeString = cnPredef cString
-typeInt = cnPredef cInt
-typeFloat = cnPredef cFloat
-typeInts i = App (cnPredef cInts) (EInt i)
-typePBool = cnPredef cPBool
-typeError = cnPredef cErrorType
-
-isTypeInts :: Term -> Maybe Integer
-isTypeInts (App c (EInt i)) | c == cnPredef cInts = Just i
-isTypeInts _ = Nothing
-
-isPredefConstant :: Term -> Bool
-isPredefConstant t = case t of
- Q mod _ | mod == cPredef || mod == cPredefAbs -> True
- _ -> False
-
-cnPredef :: Ident -> Term
-cnPredef f = Q cPredef f
-
-mkSelects :: Term -> [Term] -> Term
-mkSelects t tt = foldl S t tt
-
-mkTable :: [Term] -> Term -> Term
-mkTable tt t = foldr Table t tt
-
-mkCTable :: [Ident] -> Term -> Term
-mkCTable ids v = foldr ccase v ids where
- ccase x t = T TRaw [(PV x,t)]
-
-mkDecl :: Term -> Decl
-mkDecl typ = (identW, typ)
-
-eqStrIdent :: Ident -> Ident -> Bool
-eqStrIdent = (==)
-
-tuple2record :: [Term] -> [Assign]
-tuple2record ts = [assign (tupleLabel i) t | (i,t) <- zip [1..] ts]
-
-tuple2recordType :: [Term] -> [Labelling]
-tuple2recordType ts = [(tupleLabel i, t) | (i,t) <- zip [1..] ts]
-
-tuple2recordPatt :: [Patt] -> [(Label,Patt)]
-tuple2recordPatt ts = [(tupleLabel i, t) | (i,t) <- zip [1..] ts]
-
-mkCases :: Ident -> Term -> Term
-mkCases x t = T TRaw [(PV x, t)]
-
-mkWildCases :: Term -> Term
-mkWildCases = mkCases identW
-
-mkFunType :: [Type] -> Type -> Type
-mkFunType tt t = mkProd ([(identW, ty) | ty <- tt], t, []) -- nondep prod
-
-plusRecType :: Type -> Type -> Err Type
-plusRecType t1 t2 = case (unComputed t1, unComputed t2) of
- (RecType r1, RecType r2) -> case
- filter (`elem` (map fst r1)) (map fst r2) of
- [] -> return (RecType (r1 ++ r2))
- ls -> Bad $ "clashing labels" +++ unwords (map prt ls)
- _ -> Bad ("cannot add record types" +++ prt t1 +++ "and" +++ prt t2)
-
-plusRecord :: Term -> Term -> Err Term
-plusRecord t1 t2 =
- case (t1,t2) of
- (R r1, R r2 ) -> return (R ([(l,v) | -- overshadowing of old fields
- (l,v) <- r1, not (elem l (map fst r2)) ] ++ r2))
- (_, FV rs) -> mapM (plusRecord t1) rs >>= return . FV
- (FV rs,_ ) -> mapM (`plusRecord` t2) rs >>= return . FV
- _ -> Bad ("cannot add records" +++ prt t1 +++ "and" +++ prt t2)
-
--- | default linearization type
-defLinType :: Type
-defLinType = RecType [(theLinLabel, typeStr)]
-
--- | refreshing variables
-mkFreshVar :: [Ident] -> Ident
-mkFreshVar olds = varX (maxVarIndex olds + 1)
-
--- | trying to preserve a given symbol
-mkFreshVarX :: [Ident] -> Ident -> Ident
-mkFreshVarX olds x = if (elem x olds) then (varX (maxVarIndex olds + 1)) else x
-
-maxVarIndex :: [Ident] -> Int
-maxVarIndex = maximum . ((-1):) . map varIndex
-
-mkFreshVars :: Int -> [Ident] -> [Ident]
-mkFreshVars n olds = [varX (maxVarIndex olds + i) | i <- [1..n]]
-
--- | quick hack for refining with var in editor
-freshAsTerm :: String -> Term
-freshAsTerm s = Vr (varX (readIntArg s))
-
--- | create a terminal for concrete syntax
-string2term :: String -> Term
-string2term = K
-
-int2term :: Integer -> Term
-int2term = EInt
-
-float2term :: Double -> Term
-float2term = EFloat
-
--- | create a terminal from identifier
-ident2terminal :: Ident -> Term
-ident2terminal = K . prIdent
-
-symbolOfIdent :: Ident -> String
-symbolOfIdent = prIdent
-
-symid :: Ident -> String
-symid = symbolOfIdent
-
-justIdentOf :: Term -> Maybe Ident
-justIdentOf (Vr x) = Just x
-justIdentOf (Cn x) = Just x
-justIdentOf _ = Nothing
-
-isMeta :: Term -> Bool
-isMeta (Meta _) = True
-isMeta _ = False
-
-mkMeta :: Int -> Term
-mkMeta = Meta . MetaSymb
-
-nextMeta :: MetaSymb -> MetaSymb
-nextMeta = int2meta . succ . metaSymbInt
-
-int2meta :: Int -> MetaSymb
-int2meta = MetaSymb
-
-metaSymbInt :: MetaSymb -> Int
-metaSymbInt (MetaSymb k) = k
-
-freshMeta :: [MetaSymb] -> MetaSymb
-freshMeta ms = MetaSymb (minimum [n | n <- [0..length ms],
- notElem n (map metaSymbInt ms)])
-
-mkFreshMetasInTrm :: [MetaSymb] -> Trm -> Trm
-mkFreshMetasInTrm metas = fst . rms minMeta where
- rms meta trm = case trm of
- Meta m -> (Meta (MetaSymb meta), meta + 1)
- App f a -> let (f',msf) = rms meta f
- (a',msa) = rms msf a
- in (App f' a', msa)
- Prod x a b ->
- let (a',msa) = rms meta a
- (b',msb) = rms msa b
- in (Prod x a' b', msb)
- Abs x b -> let (b',msb) = rms meta b in (Abs x b', msb)
- _ -> (trm,meta)
- minMeta = if null metas then 0 else (maximum (map metaSymbInt metas) + 1)
-
--- | decides that a term has no metavariables
-isCompleteTerm :: Term -> Bool
-isCompleteTerm t = case t of
- Meta _ -> False
- Abs _ b -> isCompleteTerm b
- App f a -> isCompleteTerm f && isCompleteTerm a
- _ -> True
-
-linTypeStr :: Type
-linTypeStr = mkRecType linLabel [typeStr] -- default lintype {s :: Str}
-
-linAsStr :: String -> Term
-linAsStr s = mkRecord linLabel [K s] -- default linearization {s = s}
-
-term2patt :: Term -> Err Patt
-term2patt trm = case termForm trm of
- Ok ([], Vr x, []) -> return (PV x)
- Ok ([], Val ty x, []) -> return (PVal ty x)
- Ok ([], Con c, aa) -> do
- aa' <- mapM term2patt aa
- return (PC c aa')
- Ok ([], QC p c, aa) -> do
- aa' <- mapM term2patt aa
- return (PP p c aa')
-
- Ok ([], Q p c, []) -> do
- return (PM p c)
-
- Ok ([], R r, []) -> do
- let (ll,aa) = unzipR r
- aa' <- mapM term2patt aa
- return (PR (zip ll aa'))
- Ok ([],EInt i,[]) -> return $ PInt i
- Ok ([],EFloat i,[]) -> return $ PFloat i
- Ok ([],K s, []) -> return $ PString s
-
---- encodings due to excessive use of term-patt convs. AR 7/1/2005
- Ok ([], Cn id, [Vr a,b]) | id == cAs -> do
- b' <- term2patt b
- return (PAs a b')
- Ok ([], Cn id, [a]) | id == cNeg -> do
- a' <- term2patt a
- return (PNeg a')
- Ok ([], Cn id, [a]) | id == cRep -> do
- a' <- term2patt a
- return (PRep a')
- Ok ([], Cn id, []) | id == cRep -> do
- return PChar
- Ok ([], Cn id,[K s]) | id == cChars -> do
- return $ PChars s
- Ok ([], Cn id, [a,b]) | id == cSeq -> do
- a' <- term2patt a
- b' <- term2patt b
- return (PSeq a' b')
- Ok ([], Cn id, [a,b]) | id == cAlt -> do
- a' <- term2patt a
- b' <- term2patt b
- return (PAlt a' b')
-
- Ok ([], Cn c, []) -> do
- return (PMacro c)
-
- _ -> prtBad "no pattern corresponds to term" trm
-
-patt2term :: Patt -> Term
-patt2term pt = case pt of
- PV x -> Vr x
- PW -> Vr identW --- not parsable, should not occur
- PVal t i -> Val t i
- PMacro c -> Cn c
- PM p c -> Q p c
-
- PC c pp -> mkApp (Con c) (map patt2term pp)
- PP p c pp -> mkApp (QC p c) (map patt2term pp)
-
- PR r -> R [assign l (patt2term p) | (l,p) <- r]
- PT _ p -> patt2term p
- PInt i -> EInt i
- PFloat i -> EFloat i
- PString s -> K s
-
- PAs x p -> appCons cAs [Vr x, patt2term p] --- an encoding
- PChar -> appCons cChar [] --- an encoding
- PChars s -> appCons cChars [K s] --- an encoding
- PSeq a b -> appCons cSeq [(patt2term a), (patt2term b)] --- an encoding
- PAlt a b -> appCons cAlt [(patt2term a), (patt2term b)] --- an encoding
- PRep a -> appCons cRep [(patt2term a)] --- an encoding
- PNeg a -> appCons cNeg [(patt2term a)] --- an encoding
-
-
-redirectTerm :: Ident -> Term -> Term
-redirectTerm n t = case t of
- QC _ f -> QC n f
- Q _ f -> Q n f
- _ -> composSafeOp (redirectTerm n) t
-
--- | to gather ultimate cases in a table; preserves pattern list
-allCaseValues :: Term -> [([Patt],Term)]
-allCaseValues trm = case unComputed trm of
- T _ cs -> [(p:ps, t) | (p,t0) <- cs, (ps,t) <- allCaseValues t0]
- _ -> [([],trm)]
-
--- | to get a string from a term that represents a sequence of terminals
-strsFromTerm :: Term -> Err [Str]
-strsFromTerm t = case unComputed t of
- K s -> return [str s]
- Empty -> return [str []]
- C s t -> do
- s' <- strsFromTerm s
- t' <- strsFromTerm t
- return [plusStr x y | x <- s', y <- t']
- Glue s t -> do
- s' <- strsFromTerm s
- t' <- strsFromTerm t
- return [glueStr x y | x <- s', y <- t']
- Alts (d,vs) -> do
- d0 <- strsFromTerm d
- v0 <- mapM (strsFromTerm . fst) vs
- c0 <- mapM (strsFromTerm . snd) vs
- let vs' = zip v0 c0
- return [strTok (str2strings def) vars |
- def <- d0,
- vars <- [[(str2strings v, map sstr c) | (v,c) <- zip vv c0] |
- vv <- combinations v0]
- ]
- FV ts -> mapM strsFromTerm ts >>= return . concat
- Strs ts -> mapM strsFromTerm ts >>= return . concat
- Ready ss -> return [ss]
- Alias _ _ d -> strsFromTerm d --- should not be needed...
- _ -> prtBad "cannot get Str from term" t
-
--- | to print an Str-denoting term as a string; if the term is of wrong type, the error msg
-stringFromTerm :: Term -> String
-stringFromTerm = err id (ifNull "" (sstr . head)) . strsFromTerm
-
-
--- | to define compositional term functions
-composSafeOp :: (Term -> Term) -> Term -> Term
-composSafeOp op trm = case composOp (mkMonadic op) trm of
- Ok t -> t
- _ -> error "the operation is safe isn't it ?"
- where
- mkMonadic f = return . f
-
--- | to define compositional term functions
-composOp :: Monad m => (Term -> m Term) -> Term -> m Term
-composOp co trm =
- case trm of
- App c a ->
- do c' <- co c
- a' <- co a
- return (App c' a')
- Abs x b ->
- do b' <- co b
- return (Abs x b')
- Prod x a b ->
- do a' <- co a
- b' <- co b
- return (Prod x a' b')
- S c a ->
- do c' <- co c
- a' <- co a
- return (S c' a')
- Table a c ->
- do a' <- co a
- c' <- co c
- return (Table a' c')
- R r ->
- do r' <- mapAssignM co r
- return (R r')
- RecType r ->
- do r' <- mapPairListM (co . snd) r
- return (RecType r')
- P t i ->
- do t' <- co t
- return (P t' i)
- PI t i j ->
- do t' <- co t
- return (PI t' i j)
- ExtR a c ->
- do a' <- co a
- c' <- co c
- return (ExtR a' c')
-
- T i cc ->
- do cc' <- mapPairListM (co . snd) cc
- i' <- changeTableType co i
- return (T i' cc')
-
- TSh i cc ->
- do cc' <- mapPairListM (co . snd) cc
- i' <- changeTableType co i
- return (TSh i' cc')
-
- Eqs cc ->
- do cc' <- mapPairListM (co . snd) cc
- return (Eqs cc')
-
- V ty vs ->
- do ty' <- co ty
- vs' <- mapM co vs
- return (V ty' vs')
-
- Val ty i ->
- do ty' <- co ty
- return (Val ty' i)
-
- Let (x,(mt,a)) b ->
- do a' <- co a
- mt' <- case mt of
- Just t -> co t >>= (return . Just)
- _ -> return mt
- b' <- co b
- return (Let (x,(mt',a')) b')
- Alias c ty d ->
- do v <- co d
- ty' <- co ty
- return $ Alias c ty' v
- C s1 s2 ->
- do v1 <- co s1
- v2 <- co s2
- return (C v1 v2)
- Glue s1 s2 ->
- do v1 <- co s1
- v2 <- co s2
- return (Glue v1 v2)
- Alts (t,aa) ->
- do t' <- co t
- aa' <- mapM (pairM co) aa
- return (Alts (t',aa'))
- FV ts -> mapM co ts >>= return . FV
- Strs tt -> mapM co tt >>= return . Strs
-
- EPattType ty ->
- do ty' <- co ty
- return (EPattType ty')
-
- _ -> return trm -- covers K, Vr, Cn, Sort, EPatt
-
-getTableType :: TInfo -> Err Type
-getTableType i = case i of
- TTyped ty -> return ty
- TComp ty -> return ty
- TWild ty -> return ty
- _ -> Bad "the table is untyped"
-
-changeTableType :: Monad m => (Type -> m Type) -> TInfo -> m TInfo
-changeTableType co i = case i of
- TTyped ty -> co ty >>= return . TTyped
- TComp ty -> co ty >>= return . TComp
- TWild ty -> co ty >>= return . TWild
- _ -> return i
-
-collectOp :: (Term -> [a]) -> Term -> [a]
-collectOp co trm = case trm of
- App c a -> co c ++ co a
- Abs _ b -> co b
- Prod _ a b -> co a ++ co b
- S c a -> co c ++ co a
- Table a c -> co a ++ co c
- ExtR a c -> co a ++ co c
- R r -> concatMap (\ (_,(mt,a)) -> maybe [] co mt ++ co a) r
- RecType r -> concatMap (co . snd) r
- P t i -> co t
- T _ cc -> concatMap (co . snd) cc -- not from patterns --- nor from type annot
- TSh _ cc -> concatMap (co . snd) cc -- not from patterns --- nor from type annot
- V _ cc -> concatMap co cc --- nor from type annot
- Let (x,(mt,a)) b -> maybe [] co mt ++ co a ++ co b
- C s1 s2 -> co s1 ++ co s2
- Glue s1 s2 -> co s1 ++ co s2
- Alts (t,aa) -> let (x,y) = unzip aa in co t ++ concatMap co (x ++ y)
- FV ts -> concatMap co ts
- Strs tt -> concatMap co tt
- _ -> [] -- covers K, Vr, Cn, Sort, Ready
-
--- | to find the word items in a term
-wordsInTerm :: Term -> [String]
-wordsInTerm trm = filter (not . null) $ case trm of
- K s -> [s]
- S c _ -> wo c
- Alts (t,aa) -> wo t ++ concatMap (wo . fst) aa
- Ready s -> allItems s
- _ -> collectOp wo trm
- where wo = wordsInTerm
-
-noExist :: Term
-noExist = FV []
-
-defaultLinType :: Type
-defaultLinType = mkRecType linLabel [typeStr]
-
-metaTerms :: [Term]
-metaTerms = map (Meta . MetaSymb) [0..]
-
--- | from GF1, 20\/9\/2003
-isInOneType :: Type -> Bool
-isInOneType t = case t of
- Prod _ a b -> a == b
- _ -> False
-
--- normalize records and record types; put s first
-
-sortRec :: [(Label,a)] -> [(Label,a)]
-sortRec = sortBy ordLabel where
- ordLabel (r1,_) (r2,_) = case (prt r1, prt r2) of
- ("s",_) -> LT
- (_,"s") -> GT
- (s1,s2) -> compare s1 s2
-
-
-
diff --git a/src-3.0/GF/Grammar/PatternMatch.hs b/src-3.0/GF/Grammar/PatternMatch.hs
deleted file mode 100644
index b96d35b93..000000000
--- a/src-3.0/GF/Grammar/PatternMatch.hs
+++ /dev/null
@@ -1,155 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : PatternMatch
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/10/12 12:38:29 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.7 $
---
--- pattern matching for both concrete and abstract syntax. AR -- 16\/6\/2003
------------------------------------------------------------------------------
-
-module GF.Grammar.PatternMatch (matchPattern,
- testOvershadow,
- findMatch
- ) where
-
-import GF.Data.Operations
-import GF.Grammar.Grammar
-import GF.Infra.Ident
-import GF.Grammar.Macros
-import GF.Grammar.PrGrammar
-
-import Data.List
-import Control.Monad
-
-
-matchPattern :: [(Patt,Term)] -> Term -> Err (Term, Substitution)
-matchPattern pts term =
- if not (isInConstantForm term)
- then prtBad "variables occur in" term
- else
- errIn ("trying patterns" +++ unwords (intersperse "," (map (prt . fst) pts))) $
- findMatch [([p],t) | (p,t) <- pts] [term]
-
-testOvershadow :: [Patt] -> [Term] -> Err [Patt]
-testOvershadow pts vs = do
- let numpts = zip pts [0..]
- let cases = [(p,EInt i) | (p,i) <- numpts]
- ts <- mapM (liftM fst . matchPattern cases) vs
- return $ [p | (p,i) <- numpts, notElem i [i | EInt i <- ts] ]
-
-findMatch :: [([Patt],Term)] -> [Term] -> Err (Term, Substitution)
-findMatch cases terms = case cases of
- [] -> Bad $"no applicable case for" +++ unwords (intersperse "," (map prt terms))
- (patts,_):_ | length patts /= length terms ->
- Bad ("wrong number of args for patterns :" +++
- unwords (map prt patts) +++ "cannot take" +++ unwords (map prt terms))
- (patts,val):cc -> case mapM tryMatch (zip patts terms) of
- Ok substs -> return (val, concat substs)
- _ -> findMatch cc terms
-
-tryMatch :: (Patt, Term) -> Err [(Ident, Term)]
-tryMatch (p,t) = do
- t' <- termForm t
- trym p t'
- where
- isInConstantFormt = True -- tested already
- trym p t' =
- case (p,t') of
- (PVal _ i, (_,Val _ j,_))
- | i == j -> return []
- | otherwise -> Bad $ "no match of values"
- (_,(x,Empty,y)) -> trym p (x,K [],y) -- because "" = [""] = []
- (PV IW, _) | isInConstantFormt -> return [] -- optimization with wildcard
- (PV x, _) | isInConstantFormt -> return [(x,t)]
- (PString s, ([],K i,[])) | s==i -> return []
- (PInt s, ([],EInt i,[])) | s==i -> return []
- (PFloat s,([],EFloat i,[])) | s==i -> return [] --- rounding?
- (PC p pp, ([], Con f, tt)) |
- p `eqStrIdent` f && length pp == length tt ->
- do matches <- mapM tryMatch (zip pp tt)
- return (concat matches)
-
- (PP q p pp, ([], QC r f, tt)) |
- -- q `eqStrIdent` r && --- not for inherited AR 10/10/2005
- p `eqStrIdent` f && length pp == length tt ->
- do matches <- mapM tryMatch (zip pp tt)
- return (concat matches)
- ---- hack for AppPredef bug
- (PP q p pp, ([], Q r f, tt)) |
- -- q `eqStrIdent` r && ---
- p `eqStrIdent` f && length pp == length tt ->
- do matches <- mapM tryMatch (zip pp tt)
- return (concat matches)
-
- (PR r, ([],R r',[])) |
- all (`elem` map fst r') (map fst r) ->
- do matches <- mapM tryMatch
- [(p,snd a) | (l,p) <- r, let Just a = lookup l r']
- return (concat matches)
- (PT _ p',_) -> trym p' t'
- (_, ([],Alias _ _ d,[])) -> tryMatch (p,d)
-
--- (PP (IC "Predef") (IC "CC") [p1,p2], ([],K s, [])) -> do
-
- (PAs x p',_) -> do
- subst <- trym p' t'
- return $ (x,t) : subst
-
- (PAlt p1 p2,_) -> checks [trym p1 t', trym p2 t']
-
- (PNeg p',_) -> case tryMatch (p',t) of
- Bad _ -> return []
- _ -> prtBad "no match with negative pattern" p
-
- (PSeq p1 p2, ([],K s, [])) -> do
- let cuts = [splitAt n s | n <- [0 .. length s]]
- matches <- checks [mapM tryMatch [(p1,K s1),(p2,K s2)] | (s1,s2) <- cuts]
- return (concat matches)
-
- (PRep p1, ([],K s, [])) -> checks [
- trym (foldr (const (PSeq p1)) (PString "")
- [1..n]) t' | n <- [0 .. length s]
- ] >>
- return []
-
- (PChar, ([],K [_], [])) -> return []
- (PChars cs, ([],K [c], [])) | elem c cs -> return []
-
- _ -> prtBad "no match in case expr for" t
-
-isInConstantForm :: Term -> Bool
-isInConstantForm trm = case trm of
- Cn _ -> True
- Con _ -> True
- Q _ _ -> True
- QC _ _ -> True
- Abs _ _ -> True
- App c a -> isInConstantForm c && isInConstantForm a
- R r -> all (isInConstantForm . snd . snd) r
- K _ -> True
- Empty -> True
- Alias _ _ t -> isInConstantForm t
- EInt _ -> True
- _ -> False ---- isInArgVarForm trm
-
-varsOfPatt :: Patt -> [Ident]
-varsOfPatt p = case p of
- PV x -> [x | not (isWildIdent x)]
- PC _ ps -> concat $ map varsOfPatt ps
- PP _ _ ps -> concat $ map varsOfPatt ps
- PR r -> concat $ map (varsOfPatt . snd) r
- PT _ q -> varsOfPatt q
- _ -> []
-
--- | to search matching parameter combinations in tables
-isMatchingForms :: [Patt] -> [Term] -> Bool
-isMatchingForms ps ts = all match (zip ps ts') where
- match (PC c cs, (Cn d, ds)) = c == d && isMatchingForms cs ds
- match _ = True
- ts' = map appForm ts
-
diff --git a/src-3.0/GF/Grammar/PrGrammar.hs b/src-3.0/GF/Grammar/PrGrammar.hs
deleted file mode 100644
index c1593dd63..000000000
--- a/src-3.0/GF/Grammar/PrGrammar.hs
+++ /dev/null
@@ -1,279 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : PrGrammar
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/09/04 11:45:38 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.16 $
---
--- AR 7\/12\/1999 - 1\/4\/2000 - 10\/5\/2003
---
--- printing and prettyprinting class
---
--- 8\/1\/2004:
--- Usually followed principle: 'prt_' for displaying in the editor, 'prt'
--- in writing grammars to a file. For some constructs, e.g. 'prMarkedTree',
--- only the former is ever needed.
------------------------------------------------------------------------------
-
-module GF.Grammar.PrGrammar (Print(..),
- prtBad,
- prGrammar, prModule,
- prContext, prParam,
- prQIdent, prQIdent_,
- prRefinement, prTermOpt,
- prt_Tree, prMarkedTree, prTree,
- tree2string, prprTree,
- prConstrs, prConstraints,
- prMetaSubst, prEnv, prMSubst,
- prExp, prOperSignature,
- lookupIdent, lookupIdentInfo, lookupIdentInfoIn,
- prTermTabular
- ) where
-
-import GF.Data.Operations
-import GF.Data.Zipper
-import GF.Grammar.Grammar
-import GF.Infra.Modules
-import qualified GF.Source.PrintGF as P
-import GF.Grammar.Values
-import GF.Source.GrammarToSource
---- import GFC (CanonGrammar) --- cycle of modules
-
-import GF.Infra.Option
-import GF.Infra.Ident
-import GF.Data.Str
-
-import GF.Infra.CompactPrint
-
-import Data.List (intersperse)
-
-class Print a where
- prt :: a -> String
- -- | printing with parentheses, if needed
- prt2 :: a -> String
- -- | pretty printing
- prpr :: a -> [String]
- -- | printing without ident qualifications
- prt_ :: a -> String
- prt2 = prt
- prt_ = prt
- prpr = return . prt
-
--- 8/1/2004
---- Usually followed principle: prt_ for displaying in the editor, prt
---- in writing grammars to a file. For some constructs, e.g. prMarkedTree,
---- only the former is ever needed.
-
--- | to show terms etc in error messages
-prtBad :: Print a => String -> a -> Err b
-prtBad s a = Bad (s +++ prt a)
-
-pprintTree :: P.Print a => a -> String
-pprintTree = compactPrint . P.printTree
-
-prGrammar :: SourceGrammar -> String
-prGrammar = pprintTree . trGrammar
-
-prModule :: (Ident, SourceModInfo) -> String
-prModule = pprintTree . trModule
-
-instance Print Term where
- prt = pprintTree . trt
- prt_ = prExp
-
-instance Print Ident where
- prt = pprintTree . tri
-
-instance Print Patt where
- prt = pprintTree . trp
- prt_ = prt . unqual where
- unqual p = case p of
- PP _ c [] -> PV c --- to remove curlies
- PP _ c ps -> PC c (map unqual ps)
- PC c ps -> PC c (map unqual ps)
- _ -> p ---- records
-
-instance Print Label where
- prt = pprintTree . trLabel
-
-instance Print MetaSymb where
- prt (MetaSymb i) = "?" ++ show i
-
-prParam :: Param -> String
-prParam (c,co) = prt c +++ prContext co
-
-prContext :: Context -> String
-prContext co = unwords $ map prParenth [prt x +++ ":" +++ prt t | (x,t) <- co]
-
--- some GFC notions
-
-instance Print a => Print (Tr a) where
- prt (Tr (n, trees)) = prt n +++ unwords (map prt2 trees)
- prt2 t@(Tr (_,args)) = if null args then prt t else prParenth (prt t)
-
--- | we cannot define the method prt_ in this way
-prt_Tree :: Tree -> String
-prt_Tree = prt_ . tree2exp
-
-instance Print TrNode where
- prt (N (bi,at,vt,(cs,ms),_)) =
- prBinds bi ++
- prt at +++ ":" +++ prt vt
- +++ prConstraints cs +++ prMetaSubst ms
- prt_ (N (bi,at,vt,(cs,ms),_)) =
- prBinds bi ++
- prt_ at +++ ":" +++ prt_ vt
- +++ prConstraints cs +++ prMetaSubst ms
-
-prMarkedTree :: Tr (TrNode,Bool) -> [String]
-prMarkedTree = prf 1 where
- prf ind t@(Tr (node, trees)) =
- prNode ind node : concatMap (prf (ind + 2)) trees
- prNode ind node = case node of
- (n, False) -> indent ind (prt_ n)
- (n, _) -> '*' : indent (ind - 1) (prt_ n)
-
-prTree :: Tree -> [String]
-prTree = prMarkedTree . mapTr (\n -> (n,False))
-
--- | a pretty-printer for parsable output
-tree2string :: Tree -> String
-tree2string = unlines . prprTree
-
-prprTree :: Tree -> [String]
-prprTree = prf False where
- prf par t@(Tr (node, trees)) =
- parIf par (prn node : concat [prf (ifPar t) t | t <- trees])
- prn (N (bi,at,_,_,_)) = prb bi ++ prt_ at
- prb [] = ""
- prb bi = "\\" ++ concat (intersperse "," (map (prt_ . fst) bi)) ++ " -> "
- parIf par (s:ss) = map (indent 2) $
- if par
- then ('(':s) : ss ++ [")"]
- else s:ss
- ifPar (Tr (N ([],_,_,_,_), [])) = False
- ifPar _ = True
-
-
--- auxiliaries
-
-prConstraints :: Constraints -> String
-prConstraints = concat . prConstrs
-
-prMetaSubst :: MetaSubst -> String
-prMetaSubst = concat . prMSubst
-
-prEnv :: Env -> String
----- prEnv [] = prCurly "" ---- for debugging
-prEnv e = concatMap (\ (x,t) -> prCurly (prt x ++ ":=" ++ prt t)) e
-
-prConstrs :: Constraints -> [String]
-prConstrs = map (\ (v,w) -> prCurly (prt v ++ "<>" ++ prt w))
-
-prMSubst :: MetaSubst -> [String]
-prMSubst = map (\ (m,e) -> prCurly ("?" ++ show m ++ "=" ++ prt e))
-
-prBinds bi = if null bi
- then []
- else "\\" ++ concat (intersperse "," (map prValDecl bi)) +++ "-> "
- where
- prValDecl (x,t) = prParenth (prt_ x +++ ":" +++ prt_ t)
-
-instance Print Val where
- prt (VGen i x) = prt x ++ "{-" ++ show i ++ "-}" ---- latter part for debugging
- prt (VApp u v) = prt u +++ prv1 v
- prt (VCn mc) = prQIdent_ mc
- prt (VClos env e) = case e of
- Meta _ -> prt_ e ++ prEnv env
- _ -> prt_ e ---- ++ prEnv env ---- for debugging
- prt VType = "Type"
-
-prv1 v = case v of
- VApp _ _ -> prParenth $ prt v
- VClos _ _ -> prParenth $ prt v
- _ -> prt v
-
-instance Print Atom where
- prt (AtC f) = prQIdent f
- prt (AtM i) = prt i
- prt (AtV i) = prt i
- prt (AtL s) = prQuotedString s
- prt (AtI i) = show i
- prt (AtF i) = show i
- prt_ (AtC (_,f)) = prt f
- prt_ a = prt a
-
-prQIdent :: QIdent -> String
-prQIdent (m,f) = prt m ++ "." ++ prt f
-
-prQIdent_ :: QIdent -> String
-prQIdent_ (_,f) = prt f
-
--- | print terms without qualifications
-prExp :: Term -> String
-prExp e = case e of
- App f a -> pr1 f +++ pr2 a
- Abs x b -> "\\" ++ prt x +++ "->" +++ prExp b
- Prod x a b -> "(\\" ++ prt x +++ ":" +++ prExp a ++ ")" +++ "->" +++ prExp b
- Q _ c -> prt c
- QC _ c -> prt c
- _ -> prt e
- where
- pr1 e = case e of
- Abs _ _ -> prParenth $ prExp e
- Prod _ _ _ -> prParenth $ prExp e
- _ -> prExp e
- pr2 e = case e of
- App _ _ -> prParenth $ prExp e
- _ -> pr1 e
-
--- | option @-strip@ strips qualifications
-prTermOpt :: Options -> Term -> String
-prTermOpt opts = if PrinterStrip `elem` flag optPrinter opts then prt else prExp
-
--- | to get rid of brackets in the editor
-prRefinement :: Term -> String
-prRefinement t = case t of
- Q m c -> prQIdent (m,c)
- QC m c -> prQIdent (m,c)
- _ -> prt t
-
-prOperSignature :: (QIdent,Type) -> String
-prOperSignature (f, t) = prQIdent f +++ ":" +++ prt t
-
--- to look up a constant etc in a search tree --- why here? AR 29/5/2008
-
-lookupIdent :: Ident -> BinTree Ident b -> Err b
-lookupIdent c t = case lookupTree prt c t of
- Ok v -> return v
- _ -> prtBad "unknown identifier" c
-
-lookupIdentInfo :: Module Ident a -> Ident -> Err a
-lookupIdentInfo mo i = lookupIdent i (jments mo)
-
-lookupIdentInfoIn :: Module Ident a -> Ident -> Ident -> Err a
-lookupIdentInfoIn mo m i =
- err (\s -> Bad (s +++ "in module" +++ prt m)) return $ lookupIdentInfo mo i
-
-
---- printing cc command output AR 26/5/2008
-
-prTermTabular :: Term -> [(String,String)]
-prTermTabular = pr where
- pr t = case t of
- R rs ->
- [(prt_ lab +++ "." +++ path, str) | (lab,(_,val)) <- rs, (path,str) <- pr val]
- T _ cs ->
- [(prt_ lab +++"=>" +++ path, str) | (lab, val) <- cs, (path,str) <- pr val]
- V _ cs ->
- [("#" ++ show i +++"=>" +++ path, str) | (i,val) <- zip [0..] cs, (path,str) <- pr val]
- _ -> [([],ps t)]
- ps t = case t of
- K s -> s
- C s u -> ps s +++ ps u
- FV ts -> unwords (intersperse "/" (map ps ts))
- _ -> prt_ t
diff --git a/src-3.0/GF/Grammar/Predef.hs b/src-3.0/GF/Grammar/Predef.hs
deleted file mode 100644
index 71f152f92..000000000
--- a/src-3.0/GF/Grammar/Predef.hs
+++ /dev/null
@@ -1,177 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : GF.Grammar.Predef
--- Maintainer : kr.angelov
--- Stability : (stable)
--- Portability : (portable)
---
--- Predefined identifiers and labels which the compiler knows
-----------------------------------------------------------------------
-
-
-module GF.Grammar.Predef
- ( cType
- , cPType
- , cTok
- , cStr
- , cStrs
- , cPredefAbs, cPredef
- , cInt
- , cFloat
- , cString
- , cInts
- , cPBool
- , cErrorType
- , cOverload
- , cUndefinedType
- , isPredefCat
-
- , cPTrue, cPFalse
-
- , cLength, cDrop, cTake, cTk, cDp, cEqStr, cOccur
- , cOccurs, cEqInt, cLessInt, cPlus, cShow, cRead
- , cToStr, cMapStr, cError
-
- -- hacks
- , cMeta, cAs, cChar, cChars, cSeq, cAlt, cRep
- , cNeg, cCNC, cConflict
- ) where
-
-import GF.Infra.Ident
-import qualified Data.ByteString.Char8 as BS
-
-cType :: Ident
-cType = identC (BS.pack "Type")
-
-cPType :: Ident
-cPType = identC (BS.pack "PType")
-
-cTok :: Ident
-cTok = identC (BS.pack "Tok")
-
-cStr :: Ident
-cStr = identC (BS.pack "Str")
-
-cStrs :: Ident
-cStrs = identC (BS.pack "Strs")
-
-cPredefAbs :: Ident
-cPredefAbs = identC (BS.pack "PredefAbs")
-
-cPredef :: Ident
-cPredef = identC (BS.pack "Predef")
-
-cInt :: Ident
-cInt = identC (BS.pack "Int")
-
-cFloat :: Ident
-cFloat = identC (BS.pack "Float")
-
-cString :: Ident
-cString = identC (BS.pack "String")
-
-cInts :: Ident
-cInts = identC (BS.pack "Ints")
-
-cPBool :: Ident
-cPBool = identC (BS.pack "PBool")
-
-cErrorType :: Ident
-cErrorType = identC (BS.pack "Error")
-
-cOverload :: Ident
-cOverload = identC (BS.pack "overload")
-
-cUndefinedType :: Ident
-cUndefinedType = identC (BS.pack "UndefinedType")
-
-isPredefCat :: Ident -> Bool
-isPredefCat c = elem c [cInt,cString,cFloat]
-
-cPTrue :: Ident
-cPTrue = identC (BS.pack "PTrue")
-
-cPFalse :: Ident
-cPFalse = identC (BS.pack "PFalse")
-
-cLength :: Ident
-cLength = identC (BS.pack "length")
-
-cDrop :: Ident
-cDrop = identC (BS.pack "drop")
-
-cTake :: Ident
-cTake = identC (BS.pack "take")
-
-cTk :: Ident
-cTk = identC (BS.pack "tk")
-
-cDp :: Ident
-cDp = identC (BS.pack "dp")
-
-cEqStr :: Ident
-cEqStr = identC (BS.pack "eqStr")
-
-cOccur :: Ident
-cOccur = identC (BS.pack "occur")
-
-cOccurs :: Ident
-cOccurs = identC (BS.pack "occurs")
-
-cEqInt :: Ident
-cEqInt = identC (BS.pack "eqInt")
-
-cLessInt :: Ident
-cLessInt = identC (BS.pack "lessInt")
-
-cPlus :: Ident
-cPlus = identC (BS.pack "plus")
-
-cShow :: Ident
-cShow = identC (BS.pack "show")
-
-cRead :: Ident
-cRead = identC (BS.pack "read")
-
-cToStr :: Ident
-cToStr = identC (BS.pack "toStr")
-
-cMapStr :: Ident
-cMapStr = identC (BS.pack "mapStr")
-
-cError :: Ident
-cError = identC (BS.pack "error")
-
-
---- hacks: dummy identifiers used in various places
---- Not very nice!
-
-cMeta :: Ident
-cMeta = identC (BS.singleton '?')
-
-cAs :: Ident
-cAs = identC (BS.singleton '@')
-
-cChar :: Ident
-cChar = identC (BS.singleton '?')
-
-cChars :: Ident
-cChars = identC (BS.pack "[]")
-
-cSeq :: Ident
-cSeq = identC (BS.pack "+")
-
-cAlt :: Ident
-cAlt = identC (BS.pack "|")
-
-cRep :: Ident
-cRep = identC (BS.pack "*")
-
-cNeg :: Ident
-cNeg = identC (BS.pack "-")
-
-cCNC :: Ident
-cCNC = identC (BS.pack "CNC")
-
-cConflict :: Ident
-cConflict = IC (BS.pack "#conflict")
diff --git a/src-3.0/GF/Grammar/ReservedWords.hs b/src-3.0/GF/Grammar/ReservedWords.hs
deleted file mode 100644
index b440141d6..000000000
--- a/src-3.0/GF/Grammar/ReservedWords.hs
+++ /dev/null
@@ -1,44 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : ReservedWords
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/04/21 16:22:28 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.5 $
---
--- reserved words of GF. (c) Aarne Ranta 19\/3\/2002 under Gnu GPL.
--- modified by Markus Forsberg 9\/4.
--- modified by AR 12\/6\/2003 for GF2 and GFC
------------------------------------------------------------------------------
-
-module GF.Grammar.ReservedWords (isResWord, isResWordGFC) where
-
-import Data.List
-
-
-isResWord :: String -> Bool
-isResWord s = isInTree s resWordTree
-
-resWordTree :: BTree
-resWordTree =
--- mapTree fst $ sorted2tree $ flip zip (repeat ()) $ sort allReservedWords
--- nowadays obtained from LexGF.hs
- B "let" (B "data" (B "Type" (B "Str" (B "PType" (B "Lin" N N) N) (B "Tok" (B "Strs" N N) N)) (B "cat" (B "case" (B "abstract" N N) N) (B "concrete" N N))) (B "in" (B "fn" (B "flags" (B "def" N N) N) (B "grammar" (B "fun" N N) N)) (B "instance" (B "incomplete" (B "include" N N) N) (B "interface" N N)))) (B "pre" (B "open" (B "lindef" (B "lincat" (B "lin" N N) N) (B "of" (B "lintype" N N) N)) (B "param" (B "out" (B "oper" N N) N) (B "pattern" N N))) (B "transfer" (B "reuse" (B "resource" (B "printname" N N) N) (B "table" (B "strs" N N) N)) (B "where" (B "variants" (B "union" N N) N) (B "with" N N))))
-
-isResWordGFC :: String -> Bool
-isResWordGFC s = isInTree s $
- B "of" (B "fun" (B "concrete" (B "cat" (B "abstract" N N) N) (B "flags" N N)) (B "lin" (B "in" N N) (B "lincat" N N))) (B "resource" (B "param" (B "oper" (B "open" N N) N) (B "pre" N N)) (B "table" (B "strs" N N) (B "variants" N N)))
-
-data BTree = N | B String BTree BTree deriving (Show)
-
-isInTree :: String -> BTree -> Bool
-isInTree x tree = case tree of
- N -> False
- B a left right
- | x < a -> isInTree x left
- | x > a -> isInTree x right
- | x == a -> True
-
diff --git a/src-3.0/GF/Grammar/Unify.hs b/src-3.0/GF/Grammar/Unify.hs
deleted file mode 100644
index 588c1b306..000000000
--- a/src-3.0/GF/Grammar/Unify.hs
+++ /dev/null
@@ -1,96 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : Unify
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/04/21 16:22:31 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.4 $
---
--- (c) Petri Mäenpää & Aarne Ranta, 1998--2001
---
--- brute-force adaptation of the old-GF program AR 21\/12\/2001 ---
--- the only use is in 'TypeCheck.splitConstraints'
------------------------------------------------------------------------------
-
-module GF.Grammar.Unify (unifyVal) where
-
-import GF.Grammar.Abstract
-
-import GF.Data.Operations
-
-import Data.List (partition)
-
-unifyVal :: Constraints -> Err (Constraints,MetaSubst)
-unifyVal cs0 = do
- let (cs1,cs2) = partition notSolvable cs0
- let (us,vs) = unzip cs1
- us' <- mapM val2exp us
- vs' <- mapM val2exp vs
- let (ms,cs) = unifyAll (zip us' vs') []
- return (cs1 ++ [(VClos [] t, VClos [] u) | (t,u) <- cs],
- [(m, VClos [] t) | (m,t) <- ms])
- where
- notSolvable (v,w) = case (v,w) of -- don't consider nonempty closures
- (VClos (_:_) _,_) -> True
- (_,VClos (_:_) _) -> True
- _ -> False
-
-type Unifier = [(MetaSymb, Trm)]
-type Constrs = [(Trm, Trm)]
-
-unifyAll :: Constrs -> Unifier -> (Unifier,Constrs)
-unifyAll [] g = (g, [])
-unifyAll ((a@(s, t)) : l) g =
- let (g1, c) = unifyAll l g
- in case unify s t g1 of
- Ok g2 -> (g2, c)
- _ -> (g1, a : c)
-
-unify :: Trm -> Trm -> Unifier -> Err Unifier
-unify e1 e2 g =
- case (e1, e2) of
- (Meta s, t) -> do
- tg <- subst_all g t
- let sg = maybe e1 id (lookup s g)
- if (sg == Meta s) then extend g s tg else unify sg tg g
- (t, Meta s) -> unify e2 e1 g
- (Q _ a, Q _ b) | (a == b) -> return g ---- qualif?
- (QC _ a, QC _ b) | (a == b) -> return g ----
- (Vr x, Vr y) | (x == y) -> return g
- (Abs x b, Abs y c) -> do let c' = substTerm [x] [(y,Vr x)] c
- unify b c' g
- (App c a, App d b) -> case unify c d g of
- Ok g1 -> unify a b g1
- _ -> prtBad "fail unify" e1
- _ -> prtBad "fail unify" e1
-
-extend :: Unifier -> MetaSymb -> Trm -> Err Unifier
-extend g s t | (t == Meta s) = return g
- | occCheck s t = prtBad "occurs check" t
- | True = return ((s, t) : g)
-
-subst_all :: Unifier -> Trm -> Err Trm
-subst_all s u =
- case (s,u) of
- ([], t) -> return t
- (a : l, t) -> do
- t' <- (subst_all l t) --- successive substs - why ?
- return $ substMetas [a] t'
-
-substMetas :: [(MetaSymb,Trm)] -> Trm -> Trm
-substMetas subst trm = case trm of
- Meta x -> case lookup x subst of
- Just t -> t
- _ -> trm
- _ -> composSafeOp (substMetas subst) trm
-
-occCheck :: MetaSymb -> Trm -> Bool
-occCheck s u = case u of
- Meta v -> s == v
- App c a -> occCheck s c || occCheck s a
- Abs x b -> occCheck s b
- _ -> False
-
diff --git a/src-3.0/GF/Grammar/Values.hs b/src-3.0/GF/Grammar/Values.hs
deleted file mode 100644
index ab7d874da..000000000
--- a/src-3.0/GF/Grammar/Values.hs
+++ /dev/null
@@ -1,91 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : Values
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/04/21 16:22:32 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.7 $
---
--- (Description of the module)
------------------------------------------------------------------------------
-
-module GF.Grammar.Values (-- * values used in TC type checking
- Exp, Val(..), Env,
- -- * annotated tree used in editing
- Tree, TrNode(..), Atom(..), Binds, Constraints, MetaSubst,
- -- * for TC
- valAbsInt, valAbsFloat, valAbsString, vType,
- isPredefCat,
- eType, tree2exp, loc2treeFocus
- ) where
-
-import GF.Data.Operations
-import GF.Data.Zipper
-
-import GF.Infra.Ident
-import GF.Grammar.Grammar
-import GF.Grammar.Predef
-
--- values used in TC type checking
-
-type Exp = Term
-
-data Val = VGen Int Ident | VApp Val Val | VCn QIdent | VType | VClos Env Exp
- deriving (Eq,Show)
-
-type Env = [(Ident,Val)]
-
--- annotated tree used in editing
-
-type Tree = Tr TrNode
-
-newtype TrNode = N (Binds,Atom,Val,(Constraints,MetaSubst),Bool)
- deriving (Eq,Show)
-
-data Atom =
- AtC Fun | AtM MetaSymb | AtV Ident | AtL String | AtI Integer | AtF Double
- deriving (Eq,Show)
-
-type Binds = [(Ident,Val)]
-type Constraints = [(Val,Val)]
-type MetaSubst = [(MetaSymb,Val)]
-
--- for TC
-
-valAbsInt :: Val
-valAbsInt = VCn (cPredefAbs, cInt)
-
-valAbsFloat :: Val
-valAbsFloat = VCn (cPredefAbs, cFloat)
-
-valAbsString :: Val
-valAbsString = VCn (cPredefAbs, cString)
-
-vType :: Val
-vType = VType
-
-eType :: Exp
-eType = Sort cType
-
-tree2exp :: Tree -> Exp
-tree2exp (Tr (N (bi,at,_,_,_),ts)) = foldr Abs (foldl App at' ts') bi' where
- at' = case at of
- AtC (m,c) -> Q m c
- AtV i -> Vr i
- AtM m -> Meta m
- AtL s -> K s
- AtI s -> EInt s
- AtF s -> EFloat s
- bi' = map fst bi
- ts' = map tree2exp ts
-
-loc2treeFocus :: Loc TrNode -> Tree
-loc2treeFocus (Loc (Tr (a,ts),p)) =
- loc2tree (Loc (Tr (mark a, map (mapTr nomark) ts), mapPath nomark p))
- where
- (mark, nomark) = (\(N (a,b,c,d,_)) -> N(a,b,c,d,True),
- \(N (a,b,c,d,_)) -> N(a,b,c,d,False))
-
diff --git a/src-3.0/GF/Infra/CheckM.hs b/src-3.0/GF/Infra/CheckM.hs
deleted file mode 100644
index 251ed2b8b..000000000
--- a/src-3.0/GF/Infra/CheckM.hs
+++ /dev/null
@@ -1,89 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : CheckM
--- Maintainer : (Maintainer)
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/04/21 16:22:33 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.5 $
---
--- (Description of the module)
------------------------------------------------------------------------------
-
-module GF.Infra.CheckM (Check,
- checkError, checkCond, checkWarn, checkUpdate, checkInContext,
- checkUpdates, checkReset, checkResets, checkGetContext,
- checkLookup, checkStart, checkErr, checkVal, checkIn,
- prtFail
- ) where
-
-import GF.Data.Operations
-import GF.Grammar.Grammar
-import GF.Infra.Ident
-import GF.Grammar.PrGrammar
-
--- | the strings are non-fatal warnings
-type Check a = STM (Context,[String]) a
-
-checkError :: String -> Check a
-checkError = raise
-
-checkCond :: String -> Bool -> Check ()
-checkCond s b = if b then return () else checkError s
-
--- | warnings should be reversed in the end
-checkWarn :: String -> Check ()
-checkWarn s = updateSTM (\ (cont,msg) -> (cont, s:msg))
-
-checkUpdate :: Decl -> Check ()
-checkUpdate d = updateSTM (\ (cont,msg) -> (d:cont, msg))
-
-checkInContext :: [Decl] -> Check r -> Check r
-checkInContext g ch = do
- i <- checkUpdates g
- r <- ch
- checkResets i
- return r
-
-checkUpdates :: [Decl] -> Check Int
-checkUpdates ds = mapM checkUpdate ds >> return (length ds)
-
-checkReset :: Check ()
-checkReset = checkResets 1
-
-checkResets :: Int -> Check ()
-checkResets i = updateSTM (\ (cont,msg) -> (drop i cont, msg))
-
-checkGetContext :: Check Context
-checkGetContext = do
- (co,_) <- readSTM
- return co
-
-checkLookup :: Ident -> Check Type
-checkLookup x = do
- co <- checkGetContext
- checkErr $ maybe (prtBad "unknown variable" x) return $ lookup x co
-
-checkStart :: Check a -> Err (a,(Context,[String]))
-checkStart c = appSTM c ([],[])
-
-checkErr :: Err a -> Check a
-checkErr e = stm (\s -> do
- v <- e
- return (v,s)
- )
-
-checkVal :: a -> Check a
-checkVal v = return v
-
-prtFail :: Print a => String -> a -> Check b
-prtFail s t = checkErr $ prtBad s t
-
-checkIn :: String -> Check a -> Check a
-checkIn msg c = stm $ \s@(g,ws) -> case appSTM c s of
- Bad e -> Bad $ msg ++++ e
- Ok (v,(g',ws')) -> Ok (v,(g',ws2)) where
- new = take (length ws' - length ws) ws'
- ws2 = [msg ++++ w | w <- new] ++ ws
diff --git a/src-3.0/GF/Infra/CompactPrint.hs b/src-3.0/GF/Infra/CompactPrint.hs
deleted file mode 100644
index 486c9e183..000000000
--- a/src-3.0/GF/Infra/CompactPrint.hs
+++ /dev/null
@@ -1,22 +0,0 @@
-module GF.Infra.CompactPrint where
-import Data.Char
-
-compactPrint = compactPrintCustom keywordGF (const False)
-
-compactPrintGFCC = compactPrintCustom (const False) keywordGFCC
-
-compactPrintCustom pre post = dps . concat . map (spaceIf pre post) . words
-
-dps = dropWhile isSpace
-
-spaceIf pre post w = case w of
- _ | pre w -> "\n" ++ w
- _ | post w -> w ++ "\n"
- c:_ | isAlpha c || isDigit c -> " " ++ w
- '_':_ -> " " ++ w
- _ -> w
-
-keywordGF w = elem w ["cat","fun","lin","lincat","lindef","oper","param"]
-keywordGFCC w =
- last w == ';' ||
- elem w ["flags","fun","cat","lin","oper","lincat","lindef","printname","param"]
diff --git a/src-3.0/GF/Infra/GetOpt.hs b/src-3.0/GF/Infra/GetOpt.hs
deleted file mode 100644
index ede561c90..000000000
--- a/src-3.0/GF/Infra/GetOpt.hs
+++ /dev/null
@@ -1,381 +0,0 @@
--- This is a version of System.Console.GetOpt which has been hacked to
--- support long options with a single dash. Since we don't want the annoying
--- clash with short options that start with the same character as a long
--- one, we don't allow short options to be given together (e.g. -zxf),
--- nor do we allow options to be given as any unique prefix.
-
------------------------------------------------------------------------------
--- |
--- Module : System.Console.GetOpt
--- Copyright : (c) Sven Panne 2002-2005
--- License : BSD-style (see the file libraries/base/LICENSE)
---
--- Maintainer : libraries@haskell.org
--- Stability : experimental
--- Portability : portable
---
--- This library provides facilities for parsing the command-line options
--- in a standalone program. It is essentially a Haskell port of the GNU
--- @getopt@ library.
---
------------------------------------------------------------------------------
-
-{-
-Sven Panne <Sven.Panne@informatik.uni-muenchen.de> Oct. 1996 (small
-changes Dec. 1997)
-
-Two rather obscure features are missing: The Bash 2.0 non-option hack
-(if you don't already know it, you probably don't want to hear about
-it...) and the recognition of long options with a single dash
-(e.g. '-help' is recognised as '--help', as long as there is no short
-option 'h').
-
-Other differences between GNU's getopt and this implementation:
-
-* To enforce a coherent description of options and arguments, there
- are explanation fields in the option/argument descriptor.
-
-* Error messages are now more informative, but no longer POSIX
- compliant... :-(
-
-And a final Haskell advertisement: The GNU C implementation uses well
-over 1100 lines, we need only 195 here, including a 46 line example!
-:-)
--}
-
---module System.Console.GetOpt (
-module GF.Infra.GetOpt (
- -- * GetOpt
- getOpt, getOpt',
- usageInfo,
- ArgOrder(..),
- OptDescr(..),
- ArgDescr(..),
-
- -- * Examples
-
- -- |To hopefully illuminate the role of the different data structures,
- -- here are the command-line options for a (very simple) compiler,
- -- done in two different ways.
- -- The difference arises because the type of 'getOpt' is
- -- parameterized by the type of values derived from flags.
-
- -- ** Interpreting flags as concrete values
- -- $example1
-
- -- ** Interpreting flags as transformations of an options record
- -- $example2
-) where
-
-import Prelude -- necessary to get dependencies right
-
-import Data.List ( isPrefixOf, find )
-
--- |What to do with options following non-options
-data ArgOrder a
- = RequireOrder -- ^ no option processing after first non-option
- | Permute -- ^ freely intersperse options and non-options
- | ReturnInOrder (String -> a) -- ^ wrap non-options into options
-
-{-|
-Each 'OptDescr' describes a single option.
-
-The arguments to 'Option' are:
-
-* list of short option characters
-
-* list of long option strings (without \"--\")
-
-* argument descriptor
-
-* explanation of option for user
--}
-data OptDescr a = -- description of a single options:
- Option [Char] -- list of short option characters
- [String] -- list of long option strings (without "--")
- (ArgDescr a) -- argument descriptor
- String -- explanation of option for user
-
--- |Describes whether an option takes an argument or not, and if so
--- how the argument is injected into a value of type @a@.
-data ArgDescr a
- = NoArg a -- ^ no argument expected
- | ReqArg (String -> a) String -- ^ option requires argument
- | OptArg (Maybe String -> a) String -- ^ optional argument
-
-data OptKind a -- kind of cmd line arg (internal use only):
- = Opt a -- an option
- | UnreqOpt String -- an un-recognized option
- | NonOpt String -- a non-option
- | EndOfOpts -- end-of-options marker (i.e. "--")
- | OptErr String -- something went wrong...
-
--- | Return a string describing the usage of a command, derived from
--- the header (first argument) and the options described by the
--- second argument.
-usageInfo :: String -- header
- -> [OptDescr a] -- option descriptors
- -> String -- nicely formatted decription of options
-usageInfo header optDescr = unlines (header:table)
- where (ss,ls,ds) = (unzip3 . concatMap fmtOpt) optDescr
- table = zipWith3 paste (sameLen ss) (sameLen ls) ds
- paste x y z = " " ++ x ++ " " ++ y ++ " " ++ z
- sameLen xs = flushLeft ((maximum . map length) xs) xs
- flushLeft n xs = [ take n (x ++ repeat ' ') | x <- xs ]
-
-fmtOpt :: OptDescr a -> [(String,String,String)]
-fmtOpt (Option sos los ad descr) =
- case lines descr of
- [] -> [(sosFmt,losFmt,"")]
- (d:ds) -> (sosFmt,losFmt,d) : [ ("","",d') | d' <- ds ]
- where sepBy _ [] = ""
- sepBy _ [x] = x
- sepBy ch (x:xs) = x ++ ch:' ':sepBy ch xs
- sosFmt = sepBy ',' (map (fmtShort ad) sos)
- losFmt = sepBy ',' (map (fmtLong ad) los)
-
-fmtShort :: ArgDescr a -> Char -> String
-fmtShort (NoArg _ ) so = "-" ++ [so]
-fmtShort (ReqArg _ ad) so = "-" ++ [so] ++ " " ++ ad
-fmtShort (OptArg _ ad) so = "-" ++ [so] ++ "[" ++ ad ++ "]"
-
-fmtLong :: ArgDescr a -> String -> String
-fmtLong (NoArg _ ) lo = "--" ++ lo
-fmtLong (ReqArg _ ad) lo = "--" ++ lo ++ "=" ++ ad
-fmtLong (OptArg _ ad) lo = "--" ++ lo ++ "[=" ++ ad ++ "]"
-
-{-|
-Process the command-line, and return the list of values that matched
-(and those that didn\'t). The arguments are:
-
-* The order requirements (see 'ArgOrder')
-
-* The option descriptions (see 'OptDescr')
-
-* The actual command line arguments (presumably got from
- 'System.Environment.getArgs').
-
-'getOpt' returns a triple consisting of the option arguments, a list
-of non-options, and a list of error messages.
--}
-getOpt :: ArgOrder a -- non-option handling
- -> [OptDescr a] -- option descriptors
- -> [String] -- the command-line arguments
- -> ([a],[String],[String]) -- (options,non-options,error messages)
-getOpt ordering optDescr args = (os,xs,es ++ map errUnrec us)
- where (os,xs,us,es) = getOpt' ordering optDescr args
-
-{-|
-This is almost the same as 'getOpt', but returns a quadruple
-consisting of the option arguments, a list of non-options, a list of
-unrecognized options, and a list of error messages.
--}
-getOpt' :: ArgOrder a -- non-option handling
- -> [OptDescr a] -- option descriptors
- -> [String] -- the command-line arguments
- -> ([a],[String], [String] ,[String]) -- (options,non-options,unrecognized,error messages)
-getOpt' _ _ [] = ([],[],[],[])
-getOpt' ordering optDescr (arg:args) = procNextOpt opt ordering
- where procNextOpt (Opt o) _ = (o:os,xs,us,es)
- procNextOpt (UnreqOpt u) _ = (os,xs,u:us,es)
- procNextOpt (NonOpt x) RequireOrder = ([],x:rest,[],[])
- procNextOpt (NonOpt x) Permute = (os,x:xs,us,es)
- procNextOpt (NonOpt x) (ReturnInOrder f) = (f x :os, xs,us,es)
- procNextOpt EndOfOpts RequireOrder = ([],rest,[],[])
- procNextOpt EndOfOpts Permute = ([],rest,[],[])
- procNextOpt EndOfOpts (ReturnInOrder f) = (map f rest,[],[],[])
- procNextOpt (OptErr e) _ = (os,xs,us,e:es)
-
- (opt,rest) = getNext arg args optDescr
- (os,xs,us,es) = getOpt' ordering optDescr rest
-
--- take a look at the next cmd line arg and decide what to do with it
-getNext :: String -> [String] -> [OptDescr a] -> (OptKind a,[String])
-getNext ('-':'-':[]) rest _ = (EndOfOpts,rest)
-getNext ('-':'-':xs) rest optDescr = longOpt xs rest optDescr
-getNext ('-' :xs) rest optDescr = longOpt xs rest optDescr
-getNext a rest _ = (NonOpt a,rest)
-
--- handle long option
-longOpt :: String -> [String] -> [OptDescr a] -> (OptKind a,[String])
-longOpt ls rs optDescr = long ads arg rs
- where (opt,arg) = break (=='=') ls
- options = [ o | o@(Option ss xs _ _) <- optDescr
- , opt `elem` map (:[]) ss || opt `elem` xs ]
- ads = [ ad | Option _ _ ad _ <- options ]
- optStr = ("--"++opt)
-
- long (_:_:_) _ rest = (errAmbig options optStr,rest)
- long [NoArg a ] [] rest = (Opt a,rest)
- long [NoArg _ ] ('=':_) rest = (errNoArg optStr,rest)
- long [ReqArg _ d] [] [] = (errReq d optStr,[])
- long [ReqArg f _] [] (r:rest) = (Opt (f r),rest)
- long [ReqArg f _] ('=':xs) rest = (Opt (f xs),rest)
- long [OptArg f _] [] rest = (Opt (f Nothing),rest)
- long [OptArg f _] ('=':xs) rest = (Opt (f (Just xs)),rest)
- long _ _ rest = (UnreqOpt ("--"++ls),rest)
-
-
--- miscellaneous error formatting
-
-errAmbig :: [OptDescr a] -> String -> OptKind a
-errAmbig ods optStr = OptErr (usageInfo header ods)
- where header = "option `" ++ optStr ++ "' is ambiguous; could be one of:"
-
-errReq :: String -> String -> OptKind a
-errReq d optStr = OptErr ("option `" ++ optStr ++ "' requires an argument " ++ d ++ "\n")
-
-errUnrec :: String -> String
-errUnrec optStr = "unrecognized option `" ++ optStr ++ "'\n"
-
-errNoArg :: String -> OptKind a
-errNoArg optStr = OptErr ("option `" ++ optStr ++ "' doesn't allow an argument\n")
-
-{-
------------------------------------------------------------------------------------------
--- and here a small and hopefully enlightening example:
-
-data Flag = Verbose | Version | Name String | Output String | Arg String deriving Show
-
-options :: [OptDescr Flag]
-options =
- [Option ['v'] ["verbose"] (NoArg Verbose) "verbosely list files",
- Option ['V','?'] ["version","release"] (NoArg Version) "show version info",
- Option ['o'] ["output"] (OptArg out "FILE") "use FILE for dump",
- Option ['n'] ["name"] (ReqArg Name "USER") "only dump USER's files"]
-
-out :: Maybe String -> Flag
-out Nothing = Output "stdout"
-out (Just o) = Output o
-
-test :: ArgOrder Flag -> [String] -> String
-test order cmdline = case getOpt order options cmdline of
- (o,n,[] ) -> "options=" ++ show o ++ " args=" ++ show n ++ "\n"
- (_,_,errs) -> concat errs ++ usageInfo header options
- where header = "Usage: foobar [OPTION...] files..."
-
--- example runs:
--- putStr (test RequireOrder ["foo","-v"])
--- ==> options=[] args=["foo", "-v"]
--- putStr (test Permute ["foo","-v"])
--- ==> options=[Verbose] args=["foo"]
--- putStr (test (ReturnInOrder Arg) ["foo","-v"])
--- ==> options=[Arg "foo", Verbose] args=[]
--- putStr (test Permute ["foo","--","-v"])
--- ==> options=[] args=["foo", "-v"]
--- putStr (test Permute ["-?o","--name","bar","--na=baz"])
--- ==> options=[Version, Output "stdout", Name "bar", Name "baz"] args=[]
--- putStr (test Permute ["--ver","foo"])
--- ==> option `--ver' is ambiguous; could be one of:
--- -v --verbose verbosely list files
--- -V, -? --version, --release show version info
--- Usage: foobar [OPTION...] files...
--- -v --verbose verbosely list files
--- -V, -? --version, --release show version info
--- -o[FILE] --output[=FILE] use FILE for dump
--- -n USER --name=USER only dump USER's files
------------------------------------------------------------------------------------------
--}
-
-{- $example1
-
-A simple choice for the type associated with flags is to define a type
-@Flag@ as an algebraic type representing the possible flags and their
-arguments:
-
-> module Opts1 where
->
-> import System.Console.GetOpt
-> import Data.Maybe ( fromMaybe )
->
-> data Flag
-> = Verbose | Version
-> | Input String | Output String | LibDir String
-> deriving Show
->
-> options :: [OptDescr Flag]
-> options =
-> [ Option ['v'] ["verbose"] (NoArg Verbose) "chatty output on stderr"
-> , Option ['V','?'] ["version"] (NoArg Version) "show version number"
-> , Option ['o'] ["output"] (OptArg outp "FILE") "output FILE"
-> , Option ['c'] [] (OptArg inp "FILE") "input FILE"
-> , Option ['L'] ["libdir"] (ReqArg LibDir "DIR") "library directory"
-> ]
->
-> inp,outp :: Maybe String -> Flag
-> outp = Output . fromMaybe "stdout"
-> inp = Input . fromMaybe "stdin"
->
-> compilerOpts :: [String] -> IO ([Flag], [String])
-> compilerOpts argv =
-> case getOpt Permute options argv of
-> (o,n,[] ) -> return (o,n)
-> (_,_,errs) -> ioError (userError (concat errs ++ usageInfo header options))
-> where header = "Usage: ic [OPTION...] files..."
-
-Then the rest of the program will use the constructed list of flags
-to determine it\'s behaviour.
-
--}
-
-{- $example2
-
-A different approach is to group the option values in a record of type
-@Options@, and have each flag yield a function of type
-@Options -> Options@ transforming this record.
-
-> module Opts2 where
->
-> import System.Console.GetOpt
-> import Data.Maybe ( fromMaybe )
->
-> data Options = Options
-> { optVerbose :: Bool
-> , optShowVersion :: Bool
-> , optOutput :: Maybe FilePath
-> , optInput :: Maybe FilePath
-> , optLibDirs :: [FilePath]
-> } deriving Show
->
-> defaultOptions = Options
-> { optVerbose = False
-> , optShowVersion = False
-> , optOutput = Nothing
-> , optInput = Nothing
-> , optLibDirs = []
-> }
->
-> options :: [OptDescr (Options -> Options)]
-> options =
-> [ Option ['v'] ["verbose"]
-> (NoArg (\ opts -> opts { optVerbose = True }))
-> "chatty output on stderr"
-> , Option ['V','?'] ["version"]
-> (NoArg (\ opts -> opts { optShowVersion = True }))
-> "show version number"
-> , Option ['o'] ["output"]
-> (OptArg ((\ f opts -> opts { optOutput = Just f }) . fromMaybe "output")
-> "FILE")
-> "output FILE"
-> , Option ['c'] []
-> (OptArg ((\ f opts -> opts { optInput = Just f }) . fromMaybe "input")
-> "FILE")
-> "input FILE"
-> , Option ['L'] ["libdir"]
-> (ReqArg (\ d opts -> opts { optLibDirs = optLibDirs opts ++ [d] }) "DIR")
-> "library directory"
-> ]
->
-> compilerOpts :: [String] -> IO (Options, [String])
-> compilerOpts argv =
-> case getOpt Permute options argv of
-> (o,n,[] ) -> return (foldl (flip id) defaultOptions o, n)
-> (_,_,errs) -> ioError (userError (concat errs ++ usageInfo header options))
-> where header = "Usage: ic [OPTION...] files..."
-
-Similarly, each flag could yield a monadic function transforming a record,
-of type @Options -> IO Options@ (or any other monad), allowing option
-processing to perform actions of the chosen monad, e.g. printing help or
-version messages, checking that file arguments exist, etc.
-
--}
diff --git a/src-3.0/GF/Infra/Ident.hs b/src-3.0/GF/Infra/Ident.hs
deleted file mode 100644
index 45ebf3a5b..000000000
--- a/src-3.0/GF/Infra/Ident.hs
+++ /dev/null
@@ -1,152 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : Ident
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/11/15 11:43:33 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.8 $
---
--- (Description of the module)
------------------------------------------------------------------------------
-
-module GF.Infra.Ident (-- * Identifiers
- Ident(..), ident2bs, prIdent,
- identC, identV, identA, identAV, identW,
- argIdent, varStr, varX, isWildIdent, varIndex,
- -- * refreshing identifiers
- IdState, initIdStateN, initIdState,
- lookVar, refVar, refVarPlus
- ) where
-
-import GF.Data.Operations
-import qualified Data.ByteString.Char8 as BS
--- import Monad
-
-
--- | the constructors labelled /INTERNAL/ are
--- internal representation never returned by the parser
-data Ident =
- IC {-# UNPACK #-} !BS.ByteString -- ^ raw identifier after parsing, resolved in Rename
- | IW -- ^ wildcard
---
--- below this constructor: internal representation never returned by the parser
- | IV {-# UNPACK #-} !BS.ByteString {-# UNPACK #-} !Int -- ^ /INTERNAL/ variable
- | IA {-# UNPACK #-} !BS.ByteString {-# UNPACK #-} !Int -- ^ /INTERNAL/ argument of cat at position
- | IAV {-# UNPACK #-} !BS.ByteString {-# UNPACK #-} !Int {-# UNPACK #-} !Int -- ^ /INTERNAL/ argument of cat with bindings at position
---
-
- deriving (Eq, Ord, Show, Read)
-
-ident2bs :: Ident -> BS.ByteString
-ident2bs i = case i of
- IC s -> s
- IV s n -> BS.append s (BS.pack ('_':show n))
- IA s j -> BS.append s (BS.pack ('_':show j))
- IAV s b j -> BS.append s (BS.pack ('_':show b ++ '_':show j))
- IW -> BS.pack "_"
-
-prIdent :: Ident -> String
-prIdent i = BS.unpack $! ident2bs i
-
-identC :: BS.ByteString -> Ident
-identV :: BS.ByteString -> Int -> Ident
-identA :: BS.ByteString -> Int -> Ident
-identAV:: BS.ByteString -> Int -> Int -> Ident
-identW :: Ident
-(identC, identV, identA, identAV, identW) =
- (IC, IV, IA, IAV, IW)
-
--- normal identifier
--- ident s = IC s
-
--- | to mark argument variables
-argIdent :: Int -> Ident -> Int -> Ident
-argIdent 0 (IC c) i = identA c i
-argIdent b (IC c) i = identAV c b i
-
--- | used in lin defaults
-varStr :: Ident
-varStr = identA (BS.pack "str") 0
-
--- | refreshing variables
-varX :: Int -> Ident
-varX = identV (BS.pack "x")
-
-isWildIdent :: Ident -> Bool
-isWildIdent x = case x of
- IW -> True
- IC s | s == BS.pack "_" -> True
- _ -> False
-
-varIndex :: Ident -> Int
-varIndex (IV _ n) = n
-varIndex _ = -1 --- other than IV should not count
-
--- refreshing identifiers
-
-type IdState = ([(Ident,Ident)],Int)
-
-initIdStateN :: Int -> IdState
-initIdStateN i = ([],i)
-
-initIdState :: IdState
-initIdState = initIdStateN 0
-
-lookVar :: Ident -> STM IdState Ident
-lookVar a@(IA _ _) = return a
-lookVar x = do
- (sys,_) <- readSTM
- stm (\s -> maybe (Bad ("cannot find" +++ show x +++ prParenth (show sys)))
- return $
- lookup x sys >>= (\y -> return (y,s)))
-
-refVar :: Ident -> STM IdState Ident
-----refVar IW = return IW --- no update of wildcard
-refVar x = do
- (_,m) <- readSTM
- let x' = IV (ident2bs x) m
- updateSTM (\(sys,mx) -> ((x, x'):sys, mx + 1))
- return x'
-
-refVarPlus :: Ident -> STM IdState Ident
-----refVarPlus IW = refVar (identC "h")
-refVarPlus x = refVar x
-
-
-{-
-------------------------------
--- to test
-
-refreshExp :: Exp -> Err Exp
-refreshExp e = err Bad (return . fst) (appSTM (refresh e) initState)
-
-refresh :: Exp -> STM State Exp
-refresh e = case e of
- Atom x -> lookVar x >>= return . Atom
- App f a -> liftM2 App (refresh f) (refresh a)
- Abs x b -> liftM2 Abs (refVar x) (refresh b)
- Fun xs a b -> do
- a' <- refresh a
- xs' <- mapM refVar xs
- b' <- refresh b
- return $ Fun xs' a' b'
-
-data Exp =
- Atom Ident
- | App Exp Exp
- | Abs Ident Exp
- | Fun [Ident] Exp Exp
- deriving Show
-
-exp1 = Abs (IC "y") (Atom (IC "y"))
-exp2 = Abs (IC "y") (App (Atom (IC "y")) (Atom (IC "y")))
-exp3 = Abs (IC "y") (Abs (IC "z") (App (Atom (IC "y")) (Atom (IC "z"))))
-exp4 = Abs (IC "y") (Abs (IC "y") (App (Atom (IC "y")) (Atom (IC "z"))))
-exp5 = Abs (IC "y") (Abs (IC "y") (App (Atom (IC "y")) (Atom (IC "y"))))
-exp6 = Abs (IC "y") (Fun [IC "x", IC "y"] (Atom (IC "y")) (Atom (IC "y")))
-exp7 = Abs (IL "8") (Atom (IC "y"))
-
--}
diff --git a/src-3.0/GF/Infra/Modules.hs b/src-3.0/GF/Infra/Modules.hs
deleted file mode 100644
index 797f729c8..000000000
--- a/src-3.0/GF/Infra/Modules.hs
+++ /dev/null
@@ -1,429 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : Modules
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/11/09 15:14:30 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.26 $
---
--- Datastructures and functions for modules, common to GF and GFC.
---
--- AR 29\/4\/2003
---
--- The same structure will be used in both source code and canonical.
--- The parameters tell what kind of data is involved.
--- Invariant: modules are stored in dependency order
------------------------------------------------------------------------------
-
-module GF.Infra.Modules (
- MGrammar(..), ModInfo(..), Module(..), ModuleType(..),
- MReuseType(..), MInclude (..),
- extends, isInherited,inheritAll,
- updateMGrammar, updateModule, replaceJudgements, addFlag,
- addOpenQualif, flagsModule, allFlags, mapModules,
- MainGrammar(..), MainConcreteSpec(..), OpenSpec(..), OpenQualif(..),
- oSimple, oQualif,
- ModuleStatus(..),
- openedModule, allOpens, depPathModule, allDepsModule, partOfGrammar,
- allExtends, allExtendSpecs, allExtendsPlus, allExtensions,
- searchPathModule, addModule,
- emptyMGrammar, emptyModInfo, emptyModule,
- IdentM(..),
- typeOfModule, abstractOfConcrete, abstractModOfConcrete,
- lookupModule, lookupModuleType, lookupModMod, lookupInfo,
- lookupPosition, showPosition,
- allModMod, isModAbs, isModRes, isModCnc, isModTrans,
- sameMType, isCompilableModule, isCompleteModule,
- allAbstracts, greatestAbstract, allResources,
- greatestResource, allConcretes, allConcreteModules
- ) where
-
-import GF.Infra.Ident
-import GF.Infra.Option
-import GF.Data.Operations
-
-import Data.List
-
-
--- AR 29/4/2003
-
--- The same structure will be used in both source code and canonical.
--- The parameters tell what kind of data is involved.
--- Invariant: modules are stored in dependency order
-
-data MGrammar i a = MGrammar {modules :: [(i,ModInfo i a)]}
- deriving Show
-
-data ModInfo i a =
- ModMainGrammar (MainGrammar i)
- | ModMod (Module i a)
- | ModWith (Module i a) (i,MInclude i) [OpenSpec i]
- deriving Show
-
-data Module i a = Module {
- mtype :: ModuleType i ,
- mstatus :: ModuleStatus ,
- flags :: ModuleOptions,
- extend :: [(i,MInclude i)],
- opens :: [OpenSpec i] ,
- jments :: BinTree i a ,
- positions :: BinTree i (String,(Int,Int)) -- file, first line, last line
- }
---- deriving Show
-instance Show (Module i a) where
- show _ = "cannot show Module with FiniteMap"
-
--- | encoding the type of the module
-data ModuleType i =
- MTAbstract
- | MTTransfer (OpenSpec i) (OpenSpec i)
- | MTResource
- | MTConcrete i
- -- ^ up to this, also used in GFC. Below, source only.
- | MTInterface
- | MTInstance i
- | MTReuse (MReuseType i)
- | MTUnion (ModuleType i) [(i,[i])] -- ^ not meant to be recursive
- deriving (Eq,Show)
-
-data MReuseType i = MRInterface i | MRInstance i i | MRResource i
- deriving (Show,Eq)
-
-data MInclude i = MIAll | MIOnly [i] | MIExcept [i]
- deriving (Show,Eq)
-
-extends :: Module i a -> [i]
-extends = map fst . extend
-
-isInherited :: Eq i => MInclude i -> i -> Bool
-isInherited c i = case c of
- MIAll -> True
- MIOnly is -> elem i is
- MIExcept is -> notElem i is
-
-inheritAll :: i -> (i,MInclude i)
-inheritAll i = (i,MIAll)
-
--- destructive update
-
--- | dep order preserved since old cannot depend on new
-updateMGrammar :: Ord i => MGrammar i a -> MGrammar i a -> MGrammar i a
-updateMGrammar old new = MGrammar $
- [(i,m) | (i,m) <- os, notElem i (map fst ns)] ++ ns
- where
- os = modules old
- ns = modules new
-
-updateModule :: Ord i => Module i t -> i -> t -> Module i t
-updateModule (Module mt ms fs me ops js ps) i t =
- Module mt ms fs me ops (updateTree (i,t) js) ps
-
-replaceJudgements :: Module i t -> BinTree i t -> Module i t
-replaceJudgements (Module mt ms fs me ops _ ps) js = Module mt ms fs me ops js ps
-
-addOpenQualif :: i -> i -> Module i t -> Module i t
-addOpenQualif i j (Module mt ms fs me ops js ps) =
- Module mt ms fs me (oQualif i j : ops) js ps
-
-addFlag :: ModuleOptions -> Module i t -> Module i t
-addFlag f mo = mo {flags = addModuleOptions (flags mo) f}
-
-flagsModule :: (i,ModInfo i a) -> ModuleOptions
-flagsModule (_,mi) = case mi of
- ModMod m -> flags m
- _ -> noModuleOptions
-
-allFlags :: MGrammar i a -> ModuleOptions
-allFlags gr = concatModuleOptions $ map flags $ [m | (_, ModMod m) <- modules gr]
-
-mapModules :: (Module i a -> Module i a)
- -> MGrammar i a -> MGrammar i a
-mapModules f = MGrammar . map (onSnd mapModules') . modules
- where mapModules' (ModMod m) = ModMod (f m)
- mapModules' m = m
-
-data MainGrammar i = MainGrammar {
- mainAbstract :: i ,
- mainConcretes :: [MainConcreteSpec i]
- }
- deriving Show
-
-data MainConcreteSpec i = MainConcreteSpec {
- concretePrintname :: i ,
- concreteName :: i ,
- transferIn :: Maybe (OpenSpec i) , -- ^ if there is an in-transfer
- transferOut :: Maybe (OpenSpec i) -- ^ if there is an out-transfer
- }
- deriving Show
-
-data OpenSpec i =
- OSimple OpenQualif i
- | OQualif OpenQualif i i
- deriving (Eq,Show)
-
-data OpenQualif =
- OQNormal
- | OQInterface
- | OQIncomplete
- deriving (Eq,Show)
-
-oSimple :: i -> OpenSpec i
-oSimple = OSimple OQNormal
-
-oQualif :: i -> i -> OpenSpec i
-oQualif = OQualif OQNormal
-
-data ModuleStatus =
- MSComplete
- | MSIncomplete
- deriving (Eq,Show)
-
-openedModule :: OpenSpec i -> i
-openedModule o = case o of
- OSimple _ m -> m
- OQualif _ _ m -> m
-
-allOpens :: Module i a -> [OpenSpec i]
-allOpens m = case mtype m of
- MTTransfer a b -> a : b : opens m
- _ -> opens m
-
--- | initial dependency list
-depPathModule :: Ord i => Module i a -> [OpenSpec i]
-depPathModule m = fors m ++ exts m ++ opens m where
- fors m = case mtype m of
- MTTransfer i j -> [i,j]
- MTConcrete i -> [oSimple i]
- MTInstance i -> [oSimple i]
- _ -> []
- exts m = map oSimple $ extends m
-
--- | all dependencies
-allDepsModule :: Ord i => MGrammar i a -> Module i a -> [OpenSpec i]
-allDepsModule gr m = iterFix add os0 where
- os0 = depPathModule m
- add os = [m | o <- os, Just (ModMod n) <- [lookup (openedModule o) mods],
- m <- depPathModule n]
- mods = modules gr
-
--- | select just those modules that a given one depends on, including itself
-partOfGrammar :: Ord i => MGrammar i a -> (i,ModInfo i a) -> MGrammar i a
-partOfGrammar gr (i,m) = MGrammar [mo | mo@(j,_) <- mods, elem j modsFor]
- where
- mods = modules gr
- modsFor = case m of
- ModMod n -> (i:) $ map openedModule $ allDepsModule gr n
- ---- ModWith n i os -> i : map openedModule os ++ partOfGrammar (ModMod n) ----
- _ -> [i]
-
--- | all modules that a module extends, directly or indirectly, without restricts
-allExtends :: (Show i,Ord i) => MGrammar i a -> i -> [i]
-allExtends gr i = case lookupModule gr i of
- Ok (ModMod m) -> case extends m of
- [] -> [i]
- is -> i : concatMap (allExtends gr) is
- _ -> []
-
--- | all modules that a module extends, directly or indirectly, with restricts
-allExtendSpecs :: (Show i,Ord i) => MGrammar i a -> i -> [(i,MInclude i)]
-allExtendSpecs gr i = case lookupModule gr i of
- Ok (ModMod m) -> case extend m of
- [] -> [(i,MIAll)]
- is -> (i,MIAll) : concatMap (allExtendSpecs gr . fst) is
- _ -> []
-
--- | this plus that an instance extends its interface
-allExtendsPlus :: (Show i,Ord i) => MGrammar i a -> i -> [i]
-allExtendsPlus gr i = case lookupModule gr i of
- Ok (ModMod m) -> i : concatMap (allExtendsPlus gr) (exts m)
- _ -> []
- where
- exts m = extends m ++ [j | MTInstance j <- [mtype m]]
-
--- | conversely: all modules that extend a given module, incl. instances of interface
-allExtensions :: (Show i,Ord i) => MGrammar i a -> i -> [i]
-allExtensions gr i = case lookupModule gr i of
- Ok (ModMod m) -> let es = exts i in es ++ concatMap (allExtensions gr) es
- _ -> []
- where
- exts i = [j | (j,m) <- mods, elem i (extends m)
- || elem (MTInstance i) [mtype m]]
- mods = [(j,m) | (j,ModMod m) <- modules gr]
-
--- | initial search path: the nonqualified dependencies
-searchPathModule :: Ord i => Module i a -> [i]
-searchPathModule m = [i | OSimple _ i <- depPathModule m]
-
--- | a new module can safely be added to the end, since nothing old can depend on it
-addModule :: Ord i =>
- MGrammar i a -> i -> ModInfo i a -> MGrammar i a
-addModule gr name mi = MGrammar $ (modules gr ++ [(name,mi)])
-
-emptyMGrammar :: MGrammar i a
-emptyMGrammar = MGrammar []
-
-emptyModInfo :: ModInfo i a
-emptyModInfo = ModMod emptyModule
-
-emptyModule :: Module i a
-emptyModule = Module
- MTResource MSComplete noModuleOptions [] [] emptyBinTree emptyBinTree
-
--- | we store the module type with the identifier
-data IdentM i = IdentM {
- identM :: i ,
- typeM :: ModuleType i
- }
- deriving (Eq,Show)
-
-typeOfModule :: ModInfo i a -> ModuleType i
-typeOfModule mi = case mi of
- ModMod m -> mtype m
-
-abstractOfConcrete :: (Show i, Eq i) => MGrammar i a -> i -> Err i
-abstractOfConcrete gr c = do
- m <- lookupModule gr c
- case m of
- ModMod n -> case mtype n of
- MTConcrete a -> return a
- _ -> Bad $ "expected concrete" +++ show c
- _ -> Bad $ "expected concrete" +++ show c
-
-abstractModOfConcrete :: (Show i, Eq i) =>
- MGrammar i a -> i -> Err (Module i a)
-abstractModOfConcrete gr c = do
- a <- abstractOfConcrete gr c
- m <- lookupModule gr a
- case m of
- ModMod n -> return n
- _ -> Bad $ "expected abstract" +++ show c
-
-
--- the canonical file name
-
---- canonFileName s = prt s ++ ".gfc"
-
-lookupModule :: (Show i,Eq i) => MGrammar i a -> i -> Err (ModInfo i a)
-lookupModule gr m = case lookup m (modules gr) of
- Just i -> return i
- _ -> Bad $ "unknown module" +++ show m
- +++ "among" +++ unwords (map (show . fst) (modules gr)) ---- debug
-
-lookupModuleType :: (Show i,Eq i) => MGrammar i a -> i -> Err (ModuleType i)
-lookupModuleType gr m = do
- mi <- lookupModule gr m
- return $ typeOfModule mi
-
-lookupModMod :: (Show i,Eq i) => MGrammar i a -> i -> Err (Module i a)
-lookupModMod gr i = do
- mo <- lookupModule gr i
- case mo of
- ModMod m -> return m
- _ -> Bad $ "expected proper module, not" +++ show i
-
-lookupInfo :: (Show i, Ord i) => Module i a -> i -> Err a
-lookupInfo mo i = lookupTree show i (jments mo)
-
-lookupPosition :: (Show i, Ord i) => Module i a -> i -> Err (String,(Int,Int))
-lookupPosition mo i = lookupTree show i (positions mo)
-
-showPosition :: (Show i, Ord i) => Module i a -> i -> String
-showPosition mo i = case lookupPosition mo i of
- Ok (f,(b,e)) | b == e -> "in" +++ f ++ ", line" +++ show b
- Ok (f,(b,e)) -> "in" +++ f ++ ", lines" +++ show b ++ "-" ++ show e
- _ -> ""
-
-
-allModMod :: (Show i,Eq i) => MGrammar i a -> [(i,Module i a)]
-allModMod gr = [(i,m) | (i, ModMod m) <- modules gr]
-
-isModAbs :: Module i a -> Bool
-isModAbs m = case mtype m of
- MTAbstract -> True
----- MTUnion t -> isModAbs t
- _ -> False
-
-isModRes :: Module i a -> Bool
-isModRes m = case mtype m of
- MTResource -> True
- MTReuse _ -> True
----- MTUnion t -> isModRes t --- maybe not needed, since eliminated early
- MTInterface -> True ---
- MTInstance _ -> True
- _ -> False
-
-isModCnc :: Module i a -> Bool
-isModCnc m = case mtype m of
- MTConcrete _ -> True
----- MTUnion t -> isModCnc t
- _ -> False
-
-isModTrans :: Module i a -> Bool
-isModTrans m = case mtype m of
- MTTransfer _ _ -> True
----- MTUnion t -> isModTrans t
- _ -> False
-
-sameMType :: Eq i => ModuleType i -> ModuleType i -> Bool
-sameMType m n = case (n,m) of
- (MTConcrete _, MTConcrete _) -> True
-
- (MTInstance _, MTInstance _) -> True
- (MTInstance _, MTResource) -> True
- (MTInstance _, MTConcrete _) -> True
-
- (MTInterface, MTInstance _) -> True
- (MTInterface, MTResource) -> True -- for reuse
- (MTInterface, MTAbstract) -> True -- for reuse
-
- (MTResource, MTInstance _) -> True
- (MTResource, MTConcrete _) -> True -- for reuse
-
- _ -> m == n
-
--- | don't generate code for interfaces and for incomplete modules
-isCompilableModule :: ModInfo i a -> Bool
-isCompilableModule m = case m of
- ModMod m -> case mtype m of
- MTInterface -> False
- _ -> mstatus m == MSComplete
- _ -> False ---
-
--- | interface and "incomplete M" are not complete
-isCompleteModule :: (Eq i) => Module i a -> Bool
-isCompleteModule m = mstatus m == MSComplete && mtype m /= MTInterface
-
-
--- | all abstract modules sorted from least to most dependent
-allAbstracts :: Eq i => MGrammar i a -> [i]
-allAbstracts gr = topoSort
- [(i,extends m) | (i,ModMod m) <- modules gr, mtype m == MTAbstract]
-
--- | the last abstract in dependency order (head of list)
-greatestAbstract :: Eq i => MGrammar i a -> Maybe i
-greatestAbstract gr = case allAbstracts gr of
- [] -> Nothing
- as -> return $ last as
-
--- | all resource modules
-allResources :: MGrammar i a -> [i]
-allResources gr = [i | (i,ModMod m) <- modules gr, isModRes m || isModCnc m]
-
--- | the greatest resource in dependency order
-greatestResource :: MGrammar i a -> Maybe i
-greatestResource gr = case allResources gr of
- [] -> Nothing
- a -> return $ head a ---- why not last as in Abstract? works though AR 24/5/2008
-
--- | all concretes for a given abstract
-allConcretes :: Eq i => MGrammar i a -> i -> [i]
-allConcretes gr a =
- [i | (i, ModMod m) <- modules gr, mtype m == MTConcrete a, isCompleteModule m]
-
--- | all concrete modules for any abstract
-allConcreteModules :: Eq i => MGrammar i a -> [i]
-allConcreteModules gr =
- [i | (i, ModMod m) <- modules gr, MTConcrete _ <- [mtype m], isCompleteModule m]
diff --git a/src-3.0/GF/Infra/Option.hs b/src-3.0/GF/Infra/Option.hs
deleted file mode 100644
index 380cb3af7..000000000
--- a/src-3.0/GF/Infra/Option.hs
+++ /dev/null
@@ -1,549 +0,0 @@
-module GF.Infra.Option
- (
- -- * Option types
- Options, ModuleOptions,
- Flags(..), ModuleFlags(..),
- Mode(..), Phase(..), Verbosity(..), Encoding(..), OutputFormat(..),
- SISRFormat(..), Optimization(..),
- Dump(..), Printer(..), Recomp(..),
- -- * Option parsing
- parseOptions, parseModuleOptions,
- -- * Option pretty-printing
- moduleOptionsGFO,
- -- * Option manipulation
- addOptions, concatOptions, noOptions,
- moduleOptions,
- addModuleOptions, concatModuleOptions, noModuleOptions,
- helpMessage,
- -- * Checking specific options
- flag, moduleFlag,
- -- * Setting specific options
- setOptimization,
- -- * Convenience methods for checking options
- verbAtLeast, dump
- ) where
-
-import Control.Monad
-import Data.Char (toLower)
-import Data.List
-import Data.Maybe
-import GF.Infra.GetOpt
---import System.Console.GetOpt
-import System.FilePath
-
-import GF.Data.ErrM
-
-import Data.Set (Set)
-import qualified Data.Set as Set
-
-
-
-
-usageHeader :: String
-usageHeader = unlines
- ["Usage: gfc [OPTIONS] [FILE [...]]",
- "",
- "How each FILE is handled depends on the file name suffix:",
- "",
- ".gf Normal or old GF source, will be compiled.",
- ".gfo Compiled GF source, will be loaded as is.",
- ".gfe Example-based GF source, will be converted to .gf and compiled.",
- ".ebnf Extended BNF format, will be converted to .gf and compiled.",
- ".cf Context-free (BNF) format, will be converted to .gf and compiled.",
- "",
- "If multiple FILES are given, they must be normal GF source, .gfo or .gfe files.",
- "For the other input formats, only one file can be given.",
- "",
- "Command-line options:"]
-
-
-helpMessage :: String
-helpMessage = usageInfo usageHeader optDescr
-
-
--- FIXME: do we really want multi-line errors?
-errors :: [String] -> Err a
-errors = fail . unlines
-
--- Types
-
-data Mode = ModeVersion | ModeHelp | ModeInteractive | ModeCompiler
- deriving (Show,Eq,Ord)
-
-data Verbosity = Quiet | Normal | Verbose | Debug
- deriving (Show,Eq,Ord,Enum,Bounded)
-
-data Phase = Preproc | Convert | Compile | Link
- deriving (Show,Eq,Ord)
-
-data Encoding = UTF_8 | ISO_8859_1 | CP_1251
- deriving (Show,Eq,Ord)
-
-data OutputFormat = FmtPGF
- | FmtJavaScript
- | FmtHaskell
- | FmtHaskell_GADT
- | FmtBNF
- | FmtSRGS_XML
- | FmtSRGS_ABNF
- | FmtJSGF
- | FmtGSL
- | FmtVoiceXML
- | FmtSLF
- | FmtRegExp
- | FmtFA
- deriving (Eq,Ord)
-
-data SISRFormat =
- -- | SISR Working draft 1 April 2003
- -- <http://www.w3.org/TR/2003/WD-semantic-interpretation-20030401/>
- SISR_WD20030401
- | SISR_1_0
- deriving (Show,Eq,Ord)
-
-data Optimization = OptStem | OptCSE | OptExpand | OptParametrize | OptValues
- deriving (Show,Eq,Ord)
-
-data Warning = WarnMissingLincat
- deriving (Show,Eq,Ord)
-
-data Dump = DumpRebuild | DumpExtend | DumpRename | DumpTypeCheck | DumpRefresh | DumpOptimize | DumpCanon
- deriving (Show,Eq,Ord)
-
--- | Pretty-printing options
-data Printer = PrinterStrip -- ^ Remove name qualifiers.
- deriving (Show,Eq,Ord)
-
-data Recomp = AlwaysRecomp | RecompIfNewer | NeverRecomp
- deriving (Show,Eq,Ord)
-
-data ModuleFlags = ModuleFlags {
- optName :: Maybe String,
- optAbsName :: Maybe String,
- optCncName :: Maybe String,
- optResName :: Maybe String,
- optPreprocessors :: [String],
- optEncoding :: Encoding,
- optOptimizations :: Set Optimization,
- optLibraryPath :: [FilePath],
- optStartCat :: Maybe String,
- optSpeechLanguage :: Maybe String,
- optLexer :: Maybe String,
- optUnlexer :: Maybe String,
- optErasing :: Bool,
- optBuildParser :: Bool,
- optWarnings :: [Warning],
- optDump :: [Dump]
- }
- deriving (Show)
-
-data Flags = Flags {
- optMode :: Mode,
- optStopAfterPhase :: Phase,
- optVerbosity :: Verbosity,
- optShowCPUTime :: Bool,
- optEmitGFO :: Bool,
- optGFODir :: FilePath,
- optOutputFormats :: [OutputFormat],
- optSISR :: Maybe SISRFormat,
- optOutputFile :: Maybe FilePath,
- optOutputDir :: Maybe FilePath,
- optRecomp :: Recomp,
- optPrinter :: [Printer],
- optProb :: Bool,
- optRetainResource :: Bool,
- optModuleFlags :: ModuleFlags
- }
- deriving (Show)
-
-newtype Options = Options (Flags -> Flags)
-
-instance Show Options where
- show (Options o) = show (o defaultFlags)
-
-newtype ModuleOptions = ModuleOptions (ModuleFlags -> ModuleFlags)
-
--- Option parsing
-
-parseOptions :: [String] -> Err (Options, [FilePath])
-parseOptions args
- | not (null errs) = errors errs
- | otherwise = do opts <- liftM concatOptions $ sequence optss
- return (opts, files)
- where (optss, files, errs) = getOpt RequireOrder optDescr args
-
-parseModuleOptions :: [String] -> Err ModuleOptions
-parseModuleOptions args
- | not (null errs) = errors errs
- | not (null files) = errors $ map ("Non-option among module options: " ++) files
- | otherwise = liftM concatModuleOptions $ sequence flags
- where (flags, files, errs) = getOpt RequireOrder moduleOptDescr args
-
--- Showing options
-
--- | Pretty-print the module options that are preserved in .gfo files.
-moduleOptionsGFO :: ModuleOptions -> [(String,String)]
-moduleOptionsGFO (ModuleOptions o) =
- maybe [] (\x -> [("language",x)]) (optSpeechLanguage mfs)
- ++ maybe [] (\x -> [("startcat",x)]) (optStartCat mfs)
--- ++ maybe [] (\x -> [("coding", e2s x)]) (Just (optEncoding mfs))
- ++ (if optErasing mfs then [("erasing","on")] else [])
- where
- mfs = o defaultModuleFlags
- e2s e = maybe [] id $ lookup e [(s,e) | (e,s) <- encodings]
-
--- Option manipulation
-
-noOptions :: Options
-noOptions = Options id
-
-addOptions :: Options -- ^ Existing options.
- -> Options -- ^ Options to add (these take preference).
- -> Options
-addOptions (Options o1) (Options o2) = Options (o2 . o1)
-
-concatOptions :: [Options] -> Options
-concatOptions = foldr addOptions noOptions
-
-moduleOptions :: ModuleOptions -> Options
-moduleOptions (ModuleOptions f) = Options (\o -> o { optModuleFlags = f (optModuleFlags o) })
-
-addModuleOptions :: ModuleOptions -- ^ Existing options.
- -> ModuleOptions -- ^ Options to add (these take preference).
- -> ModuleOptions
-addModuleOptions (ModuleOptions o1) (ModuleOptions o2) = ModuleOptions (o2 . o1)
-
-concatModuleOptions :: [ModuleOptions] -> ModuleOptions
-concatModuleOptions = foldr addModuleOptions noModuleOptions
-
-noModuleOptions :: ModuleOptions
-noModuleOptions = ModuleOptions id
-
-flag :: (Flags -> a) -> Options -> a
-flag f (Options o) = f (o defaultFlags)
-
-moduleFlag :: (ModuleFlags -> a) -> Options -> a
-moduleFlag f = flag (f . optModuleFlags)
-
-modifyFlags :: (Flags -> Flags) -> Options
-modifyFlags = Options
-
-modifyModuleFlags :: (ModuleFlags -> ModuleFlags) -> Options
-modifyModuleFlags = moduleOptions . ModuleOptions
-
-
-{-
-
-parseModuleFlags :: Options -> [(String,Maybe String)] -> Err ModuleOptions
-parseModuleFlags opts flags =
- mapM (uncurry (findFlag moduleOptDescr)) flags >>= foldM (flip ($)) (optModuleOptions opts)
-
-findFlag :: Monad m => [OptDescr a] -> String -> Maybe String -> m a
-findFlag opts n mv =
- case filter (`flagMatches` n) opts of
- [] -> fail $ "Unknown option: " ++ n
- [opt] -> flagValue opt n mv
- _ -> fail $ n ++ " matches multiple options."
-
-flagMatches :: OptDescr a -> String -> Bool
-flagMatches (Option cs ss _ _) n = n `elem` (map (:[]) cs ++ ss)
-
-flagValue :: Monad m => OptDescr a -> String -> Maybe String -> m a
-flagValue (Option _ _ arg _) n mv =
- case (arg, mv) of
- (NoArg x, Nothing) -> return x
- (NoArg _, Just _ ) -> fail $ "Option " ++ n ++ " does not take a value."
- (ReqArg _ _, Nothing) -> fail $ "Option " ++ n ++ " requires a value."
- (ReqArg f _, Just x ) -> return (f x)
- (OptArg f _, mx ) -> return (f mx)
-
--}
-
--- Default options
-
-defaultModuleFlags :: ModuleFlags
-defaultModuleFlags = ModuleFlags {
- optName = Nothing,
- optAbsName = Nothing,
- optCncName = Nothing,
- optResName = Nothing,
- optPreprocessors = [],
- optEncoding = ISO_8859_1,
- optOptimizations = Set.fromList [OptStem,OptCSE,OptExpand,OptParametrize,OptValues],
- optLibraryPath = [],
- optStartCat = Nothing,
- optSpeechLanguage = Nothing,
- optLexer = Nothing,
- optUnlexer = Nothing,
- optErasing = False,
- optBuildParser = True,
- optWarnings = [],
- optDump = []
- }
-
-defaultFlags :: Flags
-defaultFlags = Flags {
- optMode = ModeInteractive,
- optStopAfterPhase = Compile,
- optVerbosity = Normal,
- optShowCPUTime = False,
- optEmitGFO = True,
- optGFODir = ".",
- optOutputFormats = [FmtPGF],
- optSISR = Nothing,
- optOutputFile = Nothing,
- optOutputDir = Nothing,
- optRecomp = RecompIfNewer,
- optPrinter = [],
- optProb = False,
- optRetainResource = False,
- optModuleFlags = defaultModuleFlags
- }
-
--- Option descriptions
-
-moduleOptDescr :: [OptDescr (Err ModuleOptions)]
-moduleOptDescr =
- [
- Option ['n'] ["name"] (ReqArg name "NAME")
- (unlines ["Use NAME as the name of the output. This is used in the output file names, ",
- "with suffixes depending on the formats, and, when relevant, ",
- "internally in the output."]),
- Option [] ["abs"] (ReqArg absName "NAME")
- ("Use NAME as the name of the abstract syntax module generated from "
- ++ "a grammar in GF 1 format."),
- Option [] ["cnc"] (ReqArg cncName "NAME")
- ("Use NAME as the name of the concrete syntax module generated from "
- ++ "a grammar in GF 1 format."),
- Option [] ["res"] (ReqArg resName "NAME")
- ("Use NAME as the name of the resource module generated from "
- ++ "a grammar in GF 1 format."),
- Option ['i'] [] (ReqArg addLibDir "DIR") "Add DIR to the library search path.",
- Option [] ["path"] (ReqArg setLibPath "DIR:DIR:...") "Set the library search path.",
- Option [] ["preproc"] (ReqArg preproc "CMD")
- (unlines ["Use CMD to preprocess input files.",
- "Multiple preprocessors can be used by giving this option multiple times."]),
- Option [] ["coding"] (ReqArg coding "ENCODING")
- ("Character encoding of the source grammar, ENCODING = "
- ++ concat (intersperse " | " (map fst encodings)) ++ "."),
- Option [] ["erasing"] (onOff erasing False) "Generate erasing grammar (default off).",
- Option [] ["parser"] (onOff parser True) "Build parser (default on).",
- Option [] ["startcat"] (ReqArg startcat "CAT") "Grammar start category.",
- Option [] ["language"] (ReqArg language "LANG") "Set the speech language flag to LANG in the generated grammar.",
- Option [] ["lexer"] (ReqArg lexer "LEXER") "Use lexer LEXER.",
- Option [] ["unlexer"] (ReqArg unlexer "UNLEXER") "Use unlexer UNLEXER.",
- Option [] ["optimize"] (ReqArg optimize "OPT")
- "Select an optimization package. OPT = all | values | parametrize | none",
- Option [] ["stem"] (onOff (toggleOptimize OptStem) True) "Perform stem-suffix analysis (default on).",
- Option [] ["cse"] (onOff (toggleOptimize OptCSE) True) "Perform common sub-expression elimination (default on).",
- dumpOption "rebuild" DumpRebuild,
- dumpOption "extend" DumpExtend,
- dumpOption "rename" DumpRename,
- dumpOption "tc" DumpTypeCheck,
- dumpOption "refresh" DumpRefresh,
- dumpOption "opt" DumpOptimize,
- dumpOption "canon" DumpCanon
- ]
- where
- name x = set $ \o -> o { optName = Just x }
- absName x = set $ \o -> o { optAbsName = Just x }
- cncName x = set $ \o -> o { optCncName = Just x }
- resName x = set $ \o -> o { optResName = Just x }
- addLibDir x = set $ \o -> o { optLibraryPath = x:optLibraryPath o }
- setLibPath x = set $ \o -> o { optLibraryPath = splitInModuleSearchPath x }
- preproc x = set $ \o -> o { optPreprocessors = optPreprocessors o ++ [x] }
- coding x = case lookup x encodings of
- Just c -> set $ \o -> o { optEncoding = c }
- Nothing -> fail $ "Unknown character encoding: " ++ x
- erasing x = set $ \o -> o { optErasing = x }
- parser x = set $ \o -> o { optBuildParser = x }
- startcat x = set $ \o -> o { optStartCat = Just x }
- language x = set $ \o -> o { optSpeechLanguage = Just x }
- lexer x = set $ \o -> o { optLexer = Just x }
- unlexer x = set $ \o -> o { optUnlexer = Just x }
-
- optimize x = case lookup x optimizationPackages of
- Just p -> set $ \o -> o { optOptimizations = p }
- Nothing -> fail $ "Unknown optimization package: " ++ x
-
- toggleOptimize x b = set $ setOptimization' x b
-
- dumpOption s d = Option [] ["dump-"++s] (NoArg (set $ \o -> o { optDump = d:optDump o})) ("Dump output of the " ++ s ++ " phase.")
-
- set = return . ModuleOptions
-
-optDescr :: [OptDescr (Err Options)]
-optDescr =
- [
- Option ['?','h'] ["help"] (NoArg (mode ModeHelp)) "Show help message.",
- Option ['V'] ["version"] (NoArg (mode ModeVersion)) "Display GF version number.",
- Option ['v'] ["verbose"] (OptArg verbosity "N") "Set verbosity (default 1). -v alone is the same as -v 2.",
- Option ['q','s'] ["quiet"] (NoArg (verbosity (Just "0"))) "Quiet, same as -v 0.",
- Option [] ["batch"] (NoArg (mode ModeCompiler)) "Run in batch compiler mode.",
- Option [] ["interactive"] (NoArg (mode ModeInteractive)) "Run in interactive mode (default).",
- Option ['E'] [] (NoArg (phase Preproc)) "Stop after preprocessing (with --preproc).",
- Option ['C'] [] (NoArg (phase Convert)) "Stop after conversion to .gf.",
- Option ['c'] [] (NoArg (phase Compile)) "Stop after compiling to .gfo (default) .",
- Option [] ["make"] (NoArg (phase Link)) "Build .pgf file and other output files.",
- Option [] ["cpu"] (NoArg (cpu True)) "Show compilation CPU time statistics.",
- Option [] ["no-cpu"] (NoArg (cpu False)) "Don't show compilation CPU time statistics (default).",
- Option [] ["emit-gfo"] (NoArg (emitGFO True)) "Create .gfo files (default).",
- Option [] ["no-emit-gfo"] (NoArg (emitGFO False)) "Do not create .gfo files.",
- Option [] ["gfo-dir"] (ReqArg gfoDir "DIR") "Directory to put .gfo files in (default = '.').",
- Option ['f'] ["output-format"] (ReqArg outFmt "FMT")
- (unlines ["Output format. FMT can be one of:",
- "Multiple concrete: pgf (default), gar, js, ...",
- "Single concrete only: cf, bnf, lbnf, gsl, srgs_xml, srgs_abnf, ...",
- "Abstract only: haskell, ..."]),
- Option [] ["sisr"] (ReqArg sisrFmt "FMT")
- (unlines ["Include SISR tags in generated speech recognition grammars.",
- "FMT can be one of: old, 1.0"]),
- Option ['o'] ["output-file"] (ReqArg outFile "FILE")
- "Save output in FILE (default is out.X, where X depends on output format.",
- Option ['D'] ["output-dir"] (ReqArg outDir "DIR")
- "Save output files (other than .gfc files) in DIR.",
- Option [] ["src","force-recomp"] (NoArg (recomp AlwaysRecomp))
- "Always recompile from source.",
- Option [] ["gfo","recomp-if-newer"] (NoArg (recomp RecompIfNewer))
- "(default) Recompile from source if the source is newer than the .gfo file.",
- Option [] ["gfo","no-recomp"] (NoArg (recomp NeverRecomp))
- "Never recompile from source, if there is already .gfo file.",
- Option [] ["strip"] (NoArg (printer PrinterStrip))
- "Remove name qualifiers when pretty-printing.",
- Option [] ["retain"] (NoArg (set $ \o -> o { optRetainResource = True })) "Retain opers.",
- Option [] ["prob"] (NoArg (prob True)) "Read probabilities from '--# prob' pragmas."
- ] ++ map (fmap (liftM moduleOptions)) moduleOptDescr
- where phase x = set $ \o -> o { optStopAfterPhase = x }
- mode x = set $ \o -> o { optMode = x }
- verbosity mv = case mv of
- Nothing -> set $ \o -> o { optVerbosity = Verbose }
- Just v -> case readMaybe v >>= toEnumBounded of
- Just i -> set $ \o -> o { optVerbosity = i }
- Nothing -> fail $ "Bad verbosity: " ++ show v
- cpu x = set $ \o -> o { optShowCPUTime = x }
- emitGFO x = set $ \o -> o { optEmitGFO = x }
- gfoDir x = set $ \o -> o { optGFODir = x }
- outFmt x = readOutputFormat x >>= \f ->
- set $ \o -> o { optOutputFormats = optOutputFormats o ++ [f] }
- sisrFmt x = case x of
- "old" -> set $ \o -> o { optSISR = Just SISR_WD20030401 }
- "1.0" -> set $ \o -> o { optSISR = Just SISR_1_0 }
- _ -> fail $ "Unknown SISR format: " ++ show x
- outFile x = set $ \o -> o { optOutputFile = Just x }
- outDir x = set $ \o -> o { optOutputDir = Just x }
- recomp x = set $ \o -> o { optRecomp = x }
- printer x = set $ \o -> o { optPrinter = x : optPrinter o }
- prob x = set $ \o -> o { optProb = x }
-
- set = return . Options
-
-outputFormats :: [(String,OutputFormat)]
-outputFormats =
- [("pgf", FmtPGF),
- ("js", FmtJavaScript),
- ("haskell", FmtHaskell),
- ("haskell_gadt", FmtHaskell_GADT),
- ("bnf", FmtBNF),
- ("srgs_xml", FmtSRGS_XML),
- ("srgs_abnf", FmtSRGS_ABNF),
- ("jsgf", FmtJSGF),
- ("gsl", FmtGSL),
- ("vxml", FmtVoiceXML),
- ("slf", FmtSLF),
- ("regexp", FmtRegExp),
- ("fa", FmtFA)]
-
-instance Show OutputFormat where
- show = lookupShow outputFormats
-
-instance Read OutputFormat where
- readsPrec = lookupReadsPrec outputFormats
-
-optimizationPackages :: [(String, Set Optimization)]
-optimizationPackages =
- [("all_subs", Set.fromList [OptStem,OptCSE,OptExpand,OptParametrize,OptValues]), -- deprecated
- ("all", Set.fromList [OptStem,OptCSE,OptExpand,OptParametrize,OptValues]),
- ("values", Set.fromList [OptStem,OptCSE,OptExpand,OptValues]),
- ("parametrize", Set.fromList [OptStem,OptCSE,OptExpand,OptParametrize]),
- ("none", Set.fromList [OptStem,OptCSE,OptExpand]),
- ("noexpand", Set.fromList [OptStem,OptCSE])]
-
-encodings :: [(String,Encoding)]
-encodings =
- [("utf8", UTF_8),
- ("cp1251", CP_1251),
- ("latin1", ISO_8859_1)
- ]
-
-lookupShow :: Eq a => [(String,a)] -> a -> String
-lookupShow xs z = fromMaybe "lookupShow" $ lookup z [(y,x) | (x,y) <- xs]
-
-lookupReadsPrec :: [(String,a)] -> Int -> ReadS a
-lookupReadsPrec xs _ s = [(z,rest) | (x,rest) <- lex s, (y,z) <- xs, y == x]
-
-onOff :: Monad m => (Bool -> m a) -> Bool -> ArgDescr (m a)
-onOff f def = OptArg g "[on,off]"
- where g ma = maybe (return def) readOnOff ma >>= f
- readOnOff x = case map toLower x of
- "on" -> return True
- "off" -> return False
- _ -> fail $ "Expected [on,off], got: " ++ show x
-
-readOutputFormat :: Monad m => String -> m OutputFormat
-readOutputFormat s =
- maybe (fail $ "Unknown output format: " ++ show s) return $ lookup s outputFormats
-
--- FIXME: this is a copy of the function in GF.Devel.UseIO.
-splitInModuleSearchPath :: String -> [FilePath]
-splitInModuleSearchPath s = case break isPathSep s of
- (f,_:cs) -> f : splitInModuleSearchPath cs
- (f,_) -> [f]
- where
- isPathSep :: Char -> Bool
- isPathSep c = c == ':' || c == ';'
-
---
--- * Convenience functions for checking options
---
-
-verbAtLeast :: Options -> Verbosity -> Bool
-verbAtLeast opts v = flag optVerbosity opts >= v
-
-dump :: Options -> Dump -> Bool
-dump opts d = moduleFlag ((d `elem`) . optDump) opts
-
---
--- * Convenience functions for setting options
---
-
-setOptimization :: Optimization -> Bool -> Options
-setOptimization o b = modifyModuleFlags (setOptimization' o b)
-
-setOptimization' :: Optimization -> Bool -> ModuleFlags -> ModuleFlags
-setOptimization' o b f = f { optOptimizations = g (optOptimizations f)}
- where g = if b then Set.insert o else Set.delete o
-
---
--- * General utilities
---
-
-readMaybe :: Read a => String -> Maybe a
-readMaybe s = case reads s of
- [(x,"")] -> Just x
- _ -> Nothing
-
-toEnumBounded :: (Bounded a, Enum a, Ord a) => Int -> Maybe a
-toEnumBounded i = let mi = minBound
- ma = maxBound `asTypeOf` mi
- in if i >= fromEnum mi && i <= fromEnum ma
- then Just (toEnum i `asTypeOf` mi)
- else Nothing
-
-
-instance Functor OptDescr where
- fmap f (Option cs ss d s) = Option cs ss (fmap f d) s
-
-instance Functor ArgDescr where
- fmap f (NoArg x) = NoArg (f x)
- fmap f (ReqArg g s) = ReqArg (f . g) s
- fmap f (OptArg g s) = OptArg (f . g) s
diff --git a/src-3.0/GF/Infra/PrintClass.hs b/src-3.0/GF/Infra/PrintClass.hs
deleted file mode 100644
index 5e94984a6..000000000
--- a/src-3.0/GF/Infra/PrintClass.hs
+++ /dev/null
@@ -1,51 +0,0 @@
-module GF.Infra.PrintClass where
-
-import Data.List (intersperse)
-
-class Print a where
- prt :: a -> String
- prtList :: [a] -> String
- prtList as = "[" ++ prtSep "," as ++ "]"
-
-prtSep :: Print a => String -> [a] -> String
-prtSep sep = concat . intersperse sep . map prt
-
-prtBefore :: Print a => String -> [a] -> String
-prtBefore before = prtBeforeAfter before ""
-
-prtAfter :: Print a => String -> [a] -> String
-prtAfter after = prtBeforeAfter "" after
-
-prtBeforeAfter :: Print a => String -> String -> [a] -> String
-prtBeforeAfter before after as = concat [ before ++ prt a ++ after | a <- as ]
-
-prtPairList :: (Print a, Print b) => String -> String -> [(a,b)] -> String
-prtPairList comma sep xys = prtSep sep [ prt x ++ comma ++ prt y | (x,y) <- xys ]
-prIO :: Print a => a -> IO ()
-prIO = putStr . prt
-
-instance Print a => Print [a] where
- prt = prtList
-
-instance (Print a, Print b) => Print (a, b) where
- prt (a, b) = "(" ++ prt a ++ "," ++ prt b ++ ")"
-
-instance (Print a, Print b, Print c) => Print (a, b, c) where
- prt (a, b, c) = "(" ++ prt a ++ "," ++ prt b ++ "," ++ prt c ++ ")"
-
-instance (Print a, Print b, Print c, Print d) => Print (a, b, c, d) where
- prt (a, b, c, d) = "(" ++ prt a ++ "," ++ prt b ++ "," ++ prt c ++ "," ++ prt d ++ ")"
-
-instance Print Char where
- prt = return
- prtList = id
-
-instance Print Int where
- prt = show
-
-instance Print Integer where
- prt = show
-
-instance Print a => Print (Maybe a) where
- prt (Just a) = prt a
- prt Nothing = "Nothing"
diff --git a/src-3.0/GF/Infra/UseIO.hs b/src-3.0/GF/Infra/UseIO.hs
deleted file mode 100644
index 00b956708..000000000
--- a/src-3.0/GF/Infra/UseIO.hs
+++ /dev/null
@@ -1,277 +0,0 @@
-{-# OPTIONS -cpp #-}
-----------------------------------------------------------------------
--- |
--- Module : UseIO
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/08/08 09:01:25 $
--- > CVS $Author: peb $
--- > CVS $Revision: 1.17 $
---
--- (Description of the module)
------------------------------------------------------------------------------
-
-module GF.Infra.UseIO where
-
-import GF.Data.Operations
-import GF.Infra.Option
-import Paths_gf(getDataDir)
-
-import System.Directory
-import System.FilePath
-import System.IO
-import System.IO.Error
-import System.Environment
-import System.Exit
-import System.CPUTime
-import Control.Monad
-import Control.Exception(evaluate)
-import qualified Data.ByteString.Char8 as BS
-
-putShow' :: Show a => (c -> a) -> c -> IO ()
-putShow' f = putStrLn . show . length . show . f
-
-putIfVerb :: Options -> String -> IO ()
-putIfVerb opts msg =
- when (verbAtLeast opts Verbose) $ putStrLn msg
-
-putIfVerbW :: Options -> String -> IO ()
-putIfVerbW opts msg =
- when (verbAtLeast opts Verbose) $ putStr (' ' : msg)
-
-errOptIO :: Options -> a -> Err a -> IO a
-errOptIO os e m = case m of
- Ok x -> return x
- Bad k -> do
- putIfVerb os k
- return e
-
-readFileIf f = catch (readFile f) (\_ -> reportOn f) where
- reportOn f = do
- putStrLnFlush ("File " ++ f ++ " does not exist. Returned empty string")
- return ""
-
-readFileIfStrict f = catch (BS.readFile f) (\_ -> reportOn f) where
- reportOn f = do
- putStrLnFlush ("File " ++ f ++ " does not exist. Returned empty string")
- return BS.empty
-
-type FileName = String
-type InitPath = String
-type FullPath = String
-
-getFilePath :: [FilePath] -> String -> IO (Maybe FilePath)
-getFilePath ps file = getFilePathMsg ("file" +++ file +++ "not found\n") ps file
-
-getFilePathMsg :: String -> [FilePath] -> String -> IO (Maybe FilePath)
-getFilePathMsg msg paths file = get paths where
- get [] = putStrFlush msg >> return Nothing
- get (p:ps) = do
- let pfile = p </> file
- exist <- doesFileExist pfile
- if not exist
- then get ps
- else do pfile <- canonicalizePath pfile
- return (Just pfile)
-
-readFileIfPath :: [FilePath] -> String -> IOE (FilePath,BS.ByteString)
-readFileIfPath paths file = do
- mpfile <- ioeIO $ getFilePath paths file
- case mpfile of
- Just pfile -> do
- s <- ioeIO $ BS.readFile pfile
- return (dropFileName pfile,s)
- _ -> ioeErr $ Bad ("File " ++ file ++ " does not exist.")
-
-doesFileExistPath :: [FilePath] -> String -> IOE Bool
-doesFileExistPath paths file = do
- mpfile <- ioeIO $ getFilePathMsg "" paths file
- return $ maybe False (const True) mpfile
-
-gfLibraryPath = "GF_LIB_PATH"
-gfGrammarPathVar = "GF_GRAMMAR_PATH"
-
-getLibraryPath :: IO FilePath
-getLibraryPath =
- catch
- (getEnv gfLibraryPath)
- (\ex -> getDataDir >>= \path -> return (path </> "lib"))
-
--- | extends the search path with the
--- 'gfLibraryPath' and 'gfGrammarPathVar'
--- environment variables. Returns only existing paths.
-extendPathEnv :: [FilePath] -> IO [FilePath]
-extendPathEnv ps = do
- b <- getLibraryPath -- e.g. GF_LIB_PATH
- s <- catch (getEnv gfGrammarPathVar) (const (return "")) -- e.g. GF_GRAMMAR_PATH
- let ss = ps ++ splitSearchPath s
- liftM concat $ mapM allSubdirs $ ss ++ [b </> s | s <- ss ++ ["prelude"]]
- where
- allSubdirs :: FilePath -> IO [FilePath]
- allSubdirs [] = return [[]]
- allSubdirs p = case last p of
- '*' -> do let path = init p
- fs <- getSubdirs path
- return [path </> f | f <- fs]
- _ -> do exists <- doesDirectoryExist p
- if exists
- then return [p]
- else return []
-
-getSubdirs :: FilePath -> IO [FilePath]
-getSubdirs dir = do
- fs <- catch (getDirectoryContents dir) (const $ return [])
- foldM (\fs f -> do let fpath = dir </> f
- p <- getPermissions fpath
- if searchable p && not (take 1 f==".")
- then return (fpath:fs)
- else return fs ) [] fs
-
-justModuleName :: FilePath -> String
-justModuleName = dropExtension . takeFileName
-
-splitInModuleSearchPath :: String -> [FilePath]
-splitInModuleSearchPath s = case break isPathSep s of
- (f,_:cs) -> f : splitInModuleSearchPath cs
- (f,_) -> [f]
- where
- isPathSep :: Char -> Bool
- isPathSep c = c == ':' || c == ';'
-
---
-
-getLineWell :: IO String -> IO String
-getLineWell ios =
- catch getLine (\e -> if (isEOFError e) then ios else ioError e)
-
-putStrFlush :: String -> IO ()
-putStrFlush s = putStr s >> hFlush stdout
-
-putStrLnFlush :: String -> IO ()
-putStrLnFlush s = putStrLn s >> hFlush stdout
-
--- * a generic quiz session
-
-type QuestionsAndAnswers = [(String, String -> (Integer,String))]
-
-teachDialogue :: QuestionsAndAnswers -> String -> IO ()
-teachDialogue qas welc = do
- putStrLn $ welc ++++ genericTeachWelcome
- teach (0,0) qas
- where
- teach _ [] = do putStrLn "Sorry, ran out of problems"
- teach (score,total) ((question,grade):quas) = do
- putStr ("\n" ++ question ++ "\n> ")
- answer <- getLine
- if (answer == ".") then return () else do
- let (result, feedback) = grade answer
- score' = score + result
- total' = total + 1
- putStr (feedback ++++ "Score" +++ show score' ++ "/" ++ show total')
- if (total' > 9 && fromInteger score' / fromInteger total' >= 0.75)
- then do putStrLn "\nCongratulations - you passed!"
- else teach (score',total') quas
-
- genericTeachWelcome =
- "The quiz is over when you have done at least 10 examples" ++++
- "with at least 75 % success." +++++
- "You can interrupt the quiz by entering a line consisting of a dot ('.').\n"
-
-
--- * IO monad with error; adapted from state monad
-
-newtype IOE a = IOE (IO (Err a))
-
-appIOE :: IOE a -> IO (Err a)
-appIOE (IOE iea) = iea
-
-ioe :: IO (Err a) -> IOE a
-ioe = IOE
-
-ioeIO :: IO a -> IOE a
-ioeIO io = ioe (io >>= return . return)
-
-ioeErr :: Err a -> IOE a
-ioeErr = ioe . return
-
-instance Monad IOE where
- return a = ioe (return (return a))
- IOE c >>= f = IOE $ do
- x <- c -- Err a
- appIOE $ err ioeBad f x -- f :: a -> IOE a
-
-ioeBad :: String -> IOE a
-ioeBad = ioe . return . Bad
-
-useIOE :: a -> IOE a -> IO a
-useIOE a ioe = appIOE ioe >>= err (\s -> putStrLn s >> return a) return
-
-foldIOE :: (a -> b -> IOE a) -> a -> [b] -> IOE (a, Maybe String)
-foldIOE f s xs = case xs of
- [] -> return (s,Nothing)
- x:xx -> do
- ev <- ioeIO $ appIOE (f s x)
- case ev of
- Ok v -> foldIOE f v xx
- Bad m -> return $ (s, Just m)
-
-dieIOE :: IOE a -> IO a
-dieIOE x = appIOE x >>= err die return
-
-die :: String -> IO a
-die s = do hPutStrLn stderr s
- exitFailure
-
-putStrLnE :: String -> IOE ()
-putStrLnE = ioeIO . putStrLnFlush
-
-putStrE :: String -> IOE ()
-putStrE = ioeIO . putStrFlush
-
-putPointE :: Verbosity -> Options -> String -> IOE a -> IOE a
-putPointE v opts msg act = do
- when (verbAtLeast opts v) $ ioeIO $ putStrFlush msg
-
- t1 <- ioeIO $ getCPUTime
- a <- act >>= ioeIO . evaluate
- t2 <- ioeIO $ getCPUTime
-
- if flag optShowCPUTime opts
- then putStrLnE (" " ++ show ((t2 - t1) `div` 1000000000) ++ " msec")
- else when (verbAtLeast opts v) $ putStrLnE ""
-
- return a
-
-
--- ((do {s <- readFile f; return (return s)}) )
-readFileIOE :: FilePath -> IOE BS.ByteString
-readFileIOE f = ioe $ catch (BS.readFile f >>= return . return)
- (\e -> return (Bad (show e)))
-
--- | like readFileIOE but look also in the GF library if file not found
---
--- intended semantics: if file is not found, try @\$GF_LIB_PATH\/file@
--- (even if file is an absolute path, but this should always fail)
--- it returns not only contents of the file, but also the path used
-readFileLibraryIOE :: String -> FilePath -> IOE (FilePath, BS.ByteString)
-readFileLibraryIOE ini f = ioe $ do
- lp <- getLibraryPath
- tryRead ini $ \_ ->
- tryRead lp $ \e ->
- return (Bad (show e))
- where
- tryRead path onError =
- catch (BS.readFile fpath >>= \s -> return (return (fpath,s)))
- onError
- where
- fpath = path </> f
-
--- | example
-koeIOE :: IO ()
-koeIOE = useIOE () $ do
- s <- ioeIO $ getLine
- s2 <- ioeErr $ mapM (!? 2) $ words s
- ioeIO $ putStrLn s2
-
diff --git a/src-3.0/GF/JavaScript/AbsJS.hs b/src-3.0/GF/JavaScript/AbsJS.hs
deleted file mode 100644
index 2632ade48..000000000
--- a/src-3.0/GF/JavaScript/AbsJS.hs
+++ /dev/null
@@ -1,60 +0,0 @@
-module GF.JavaScript.AbsJS where
-
--- Haskell module generated by the BNF converter
-
-newtype Ident = Ident String deriving (Eq,Ord,Show)
-data Program =
- Program [Element]
- deriving (Eq,Ord,Show)
-
-data Element =
- FunDef Ident [Ident] [Stmt]
- | ElStmt Stmt
- deriving (Eq,Ord,Show)
-
-data Stmt =
- SCompound [Stmt]
- | SReturnVoid
- | SReturn Expr
- | SDeclOrExpr DeclOrExpr
- deriving (Eq,Ord,Show)
-
-data DeclOrExpr =
- Decl [DeclVar]
- | DExpr Expr
- deriving (Eq,Ord,Show)
-
-data DeclVar =
- DVar Ident
- | DInit Ident Expr
- deriving (Eq,Ord,Show)
-
-data Expr =
- EAssign Expr Expr
- | ENew Ident [Expr]
- | EMember Expr Ident
- | EIndex Expr Expr
- | ECall Expr [Expr]
- | EVar Ident
- | EInt Int
- | EDbl Double
- | EStr String
- | ETrue
- | EFalse
- | ENull
- | EThis
- | EFun [Ident] [Stmt]
- | EArray [Expr]
- | EObj [Property]
- | ESeq [Expr]
- deriving (Eq,Ord,Show)
-
-data Property =
- Prop PropertyName Expr
- deriving (Eq,Ord,Show)
-
-data PropertyName =
- IdentPropName Ident
- | StringPropName String
- deriving (Eq,Ord,Show)
-
diff --git a/src-3.0/GF/JavaScript/JS.cf b/src-3.0/GF/JavaScript/JS.cf
deleted file mode 100644
index fe31a2074..000000000
--- a/src-3.0/GF/JavaScript/JS.cf
+++ /dev/null
@@ -1,55 +0,0 @@
-entrypoints Program;
-
-Program. Program ::= [Element];
-
-FunDef. Element ::= "function" Ident "(" [Ident] ")" "{" [Stmt] "}" ;
-ElStmt. Element ::= Stmt;
-separator Element "" ;
-
-separator Ident "," ;
-
-SCompound. Stmt ::= "{" [Stmt] "}" ;
-SReturnVoid. Stmt ::= "return" ";" ;
-SReturn. Stmt ::= "return" Expr ";" ;
-SDeclOrExpr. Stmt ::= DeclOrExpr ";" ;
-separator Stmt "" ;
-
-Decl. DeclOrExpr ::= "var" [DeclVar];
-DExpr. DeclOrExpr ::= Expr1 ;
-
-DVar. DeclVar ::= Ident ;
-DInit. DeclVar ::= Ident "=" Expr ;
-separator DeclVar "," ;
-
-EAssign. Expr13 ::= Expr14 "=" Expr13 ;
-
-ENew. Expr14 ::= "new" Ident "(" [Expr] ")" ;
-
-EMember. Expr15 ::= Expr15 "." Ident ;
-EIndex. Expr15 ::= Expr15 "[" Expr "]" ;
-ECall. Expr15 ::= Expr15 "(" [Expr] ")" ;
-
-EVar. Expr16 ::= Ident ;
-EInt. Expr16 ::= Integer ;
-EDbl. Expr16 ::= Double ;
-EStr. Expr16 ::= String ;
-ETrue. Expr16 ::= "true" ;
-EFalse. Expr16 ::= "false" ;
-ENull. Expr16 ::= "null" ;
-EThis. Expr16 ::= "this" ;
-EFun. Expr16 ::= "function" "(" [Ident] ")" "{" [Stmt] "}" ;
-EArray. Expr16 ::= "[" [Expr] "]" ;
-EObj. Expr16 ::= "{" [Property] "}" ;
-
-eseq1. Expr16 ::= "(" Expr "," [Expr] ")";
-internal ESeq. Expr16 ::= "(" [Expr] ")" ;
-define eseq1 x xs = ESeq (x:xs);
-
-separator Expr "," ;
-coercions Expr 16 ;
-
-Prop. Property ::= PropertyName ":" Expr ;
-separator Property "," ;
-
-IdentPropName. PropertyName ::= Ident ;
-StringPropName. PropertyName ::= String ;
diff --git a/src-3.0/GF/JavaScript/LexJS.x b/src-3.0/GF/JavaScript/LexJS.x
deleted file mode 100644
index 10ba66d69..000000000
--- a/src-3.0/GF/JavaScript/LexJS.x
+++ /dev/null
@@ -1,132 +0,0 @@
--- -*- haskell -*-
--- This Alex file was machine-generated by the BNF converter
-{
-{-# OPTIONS -fno-warn-incomplete-patterns #-}
-module GF.JavaScript.LexJS where
-
-
-}
-
-
-$l = [a-zA-Z\192 - \255] # [\215 \247] -- isolatin1 letter FIXME
-$c = [A-Z\192-\221] # [\215] -- capital isolatin1 letter FIXME
-$s = [a-z\222-\255] # [\247] -- small isolatin1 letter FIXME
-$d = [0-9] -- digit
-$i = [$l $d _ '] -- identifier character
-$u = [\0-\255] -- universal: any character
-
-@rsyms = -- symbols and non-identifier-like reserved words
- \( | \) | \{ | \} | \, | \; | \= | \. | \[ | \] | \:
-
-:-
-
-$white+ ;
-@rsyms { tok (\p s -> PT p (TS $ share s)) }
-
-$l $i* { tok (\p s -> PT p (eitherResIdent (TV . share) s)) }
-\" ([$u # [\" \\ \n]] | (\\ (\" | \\ | \' | n | t)))* \"{ tok (\p s -> PT p (TL $ share $ unescapeInitTail s)) }
-
-$d+ { tok (\p s -> PT p (TI $ share s)) }
-$d+ \. $d+ (e (\-)? $d+)? { tok (\p s -> PT p (TD $ share s)) }
-
-{
-
-tok f p s = f p s
-
-share :: String -> String
-share = id
-
-data Tok =
- TS !String -- reserved words and symbols
- | TL !String -- string literals
- | TI !String -- integer literals
- | TV !String -- identifiers
- | TD !String -- double precision float literals
- | TC !String -- character literals
-
- deriving (Eq,Show,Ord)
-
-data Token =
- PT Posn Tok
- | Err Posn
- deriving (Eq,Show,Ord)
-
-tokenPos (PT (Pn _ l _) _ :_) = "line " ++ show l
-tokenPos (Err (Pn _ l _) :_) = "line " ++ show l
-tokenPos _ = "end of file"
-
-posLineCol (Pn _ l c) = (l,c)
-mkPosToken t@(PT p _) = (posLineCol p, prToken t)
-
-prToken t = case t of
- PT _ (TS s) -> s
- PT _ (TI s) -> s
- PT _ (TV s) -> s
- PT _ (TD s) -> s
- PT _ (TC s) -> s
-
- _ -> show t
-
-data BTree = N | B String Tok BTree BTree deriving (Show)
-
-eitherResIdent :: (String -> Tok) -> String -> Tok
-eitherResIdent tv s = treeFind resWords
- where
- treeFind N = tv s
- treeFind (B a t left right) | s < a = treeFind left
- | s > a = treeFind right
- | s == a = t
-
-resWords = b "return" (b "new" (b "function" (b "false" N N) N) (b "null" N N)) (b "true" (b "this" N N) (b "var" N N))
- where b s = B s (TS s)
-
-unescapeInitTail :: String -> String
-unescapeInitTail = unesc . tail where
- unesc s = case s of
- '\\':c:cs | elem c ['\"', '\\', '\''] -> c : unesc cs
- '\\':'n':cs -> '\n' : unesc cs
- '\\':'t':cs -> '\t' : unesc cs
- '"':[] -> []
- c:cs -> c : unesc cs
- _ -> []
-
--------------------------------------------------------------------
--- Alex wrapper code.
--- A modified "posn" wrapper.
--------------------------------------------------------------------
-
-data Posn = Pn !Int !Int !Int
- deriving (Eq, Show,Ord)
-
-alexStartPos :: Posn
-alexStartPos = Pn 0 1 1
-
-alexMove :: Posn -> Char -> Posn
-alexMove (Pn a l c) '\t' = Pn (a+1) l (((c+7) `div` 8)*8+1)
-alexMove (Pn a l c) '\n' = Pn (a+1) (l+1) 1
-alexMove (Pn a l c) _ = Pn (a+1) l (c+1)
-
-type AlexInput = (Posn, -- current position,
- Char, -- previous char
- String) -- current input string
-
-tokens :: String -> [Token]
-tokens str = go (alexStartPos, '\n', str)
- where
- go :: (Posn, Char, String) -> [Token]
- go inp@(pos, _, str) =
- case alexScan inp 0 of
- AlexEOF -> []
- AlexError (pos, _, _) -> [Err pos]
- AlexSkip inp' len -> go inp'
- AlexToken inp' len act -> act pos (take len str) : (go inp')
-
-alexGetChar :: AlexInput -> Maybe (Char,AlexInput)
-alexGetChar (p, c, []) = Nothing
-alexGetChar (p, _, (c:s)) =
- let p' = alexMove p c
- in p' `seq` Just (c, (p', c, s))
-
-alexInputPrevChar :: AlexInput -> Char
-alexInputPrevChar (p, c, s) = c
-}
diff --git a/src-3.0/GF/JavaScript/Makefile b/src-3.0/GF/JavaScript/Makefile
deleted file mode 100644
index 10f867b06..000000000
--- a/src-3.0/GF/JavaScript/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-all:
- happy -gca ParJS.y
- alex -g LexJS.x
-
-bnfc:
- (cd ../.. && bnfc -p GF.JavaScript GF/JavaScript/JS.cf)
- -rm -f *.bak
-
-clean:
- -rm -f *.log *.aux *.hi *.o *.dvi
- -rm -f DocJS.ps
-distclean: clean
- -rm -f DocJS.* LexJS.* ParJS.* LayoutJS.* SkelJS.* PrintJS.* TestJS.* AbsJS.* TestJS ErrM.* SharedString.* JS.dtd XMLJS.* Makefile*
-
diff --git a/src-3.0/GF/JavaScript/ParJS.y b/src-3.0/GF/JavaScript/ParJS.y
deleted file mode 100644
index bf0614757..000000000
--- a/src-3.0/GF/JavaScript/ParJS.y
+++ /dev/null
@@ -1,225 +0,0 @@
--- This Happy file was machine-generated by the BNF converter
-{
-{-# OPTIONS -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-}
-module GF.JavaScript.ParJS where
-import GF.JavaScript.AbsJS
-import GF.JavaScript.LexJS
-import GF.Data.ErrM
-}
-
-%name pProgram Program
-
--- no lexer declaration
-%monad { Err } { thenM } { returnM }
-%tokentype { Token }
-
-%token
- '(' { PT _ (TS "(") }
- ')' { PT _ (TS ")") }
- '{' { PT _ (TS "{") }
- '}' { PT _ (TS "}") }
- ',' { PT _ (TS ",") }
- ';' { PT _ (TS ";") }
- '=' { PT _ (TS "=") }
- '.' { PT _ (TS ".") }
- '[' { PT _ (TS "[") }
- ']' { PT _ (TS "]") }
- ':' { PT _ (TS ":") }
- 'false' { PT _ (TS "false") }
- 'function' { PT _ (TS "function") }
- 'new' { PT _ (TS "new") }
- 'null' { PT _ (TS "null") }
- 'return' { PT _ (TS "return") }
- 'this' { PT _ (TS "this") }
- 'true' { PT _ (TS "true") }
- 'var' { PT _ (TS "var") }
-
-L_ident { PT _ (TV $$) }
-L_integ { PT _ (TI $$) }
-L_doubl { PT _ (TD $$) }
-L_quoted { PT _ (TL $$) }
-L_err { _ }
-
-
-%%
-
-Ident :: { Ident } : L_ident { Ident $1 }
-Integer :: { Integer } : L_integ { (read $1) :: Integer }
-Double :: { Double } : L_doubl { (read $1) :: Double }
-String :: { String } : L_quoted { $1 }
-
-Program :: { Program }
-Program : ListElement { Program (reverse $1) }
-
-
-Element :: { Element }
-Element : 'function' Ident '(' ListIdent ')' '{' ListStmt '}' { FunDef $2 $4 (reverse $7) }
- | Stmt { ElStmt $1 }
-
-
-ListElement :: { [Element] }
-ListElement : {- empty -} { [] }
- | ListElement Element { flip (:) $1 $2 }
-
-
-ListIdent :: { [Ident] }
-ListIdent : {- empty -} { [] }
- | Ident { (:[]) $1 }
- | Ident ',' ListIdent { (:) $1 $3 }
-
-
-Stmt :: { Stmt }
-Stmt : '{' ListStmt '}' { SCompound (reverse $2) }
- | 'return' ';' { SReturnVoid }
- | 'return' Expr ';' { SReturn $2 }
- | DeclOrExpr ';' { SDeclOrExpr $1 }
-
-
-ListStmt :: { [Stmt] }
-ListStmt : {- empty -} { [] }
- | ListStmt Stmt { flip (:) $1 $2 }
-
-
-DeclOrExpr :: { DeclOrExpr }
-DeclOrExpr : 'var' ListDeclVar { Decl $2 }
- | Expr1 { DExpr $1 }
-
-
-DeclVar :: { DeclVar }
-DeclVar : Ident { DVar $1 }
- | Ident '=' Expr { DInit $1 $3 }
-
-
-ListDeclVar :: { [DeclVar] }
-ListDeclVar : {- empty -} { [] }
- | DeclVar { (:[]) $1 }
- | DeclVar ',' ListDeclVar { (:) $1 $3 }
-
-
-Expr13 :: { Expr }
-Expr13 : Expr14 '=' Expr13 { EAssign $1 $3 }
- | Expr14 { $1 }
-
-
-Expr14 :: { Expr }
-Expr14 : 'new' Ident '(' ListExpr ')' { ENew $2 $4 }
- | Expr15 { $1 }
-
-
-Expr15 :: { Expr }
-Expr15 : Expr15 '.' Ident { EMember $1 $3 }
- | Expr15 '[' Expr ']' { EIndex $1 $3 }
- | Expr15 '(' ListExpr ')' { ECall $1 $3 }
- | Expr16 { $1 }
-
-
-Expr16 :: { Expr }
-Expr16 : Ident { EVar $1 }
- | Integer { EInt $1 }
- | Double { EDbl $1 }
- | String { EStr $1 }
- | 'true' { ETrue }
- | 'false' { EFalse }
- | 'null' { ENull }
- | 'this' { EThis }
- | 'function' '(' ListIdent ')' '{' ListStmt '}' { EFun $3 (reverse $6) }
- | '[' ListExpr ']' { EArray $2 }
- | '{' ListProperty '}' { EObj $2 }
- | '(' Expr ',' ListExpr ')' { eseq1_ $2 $4 }
- | '(' Expr ')' { $2 }
-
-
-ListExpr :: { [Expr] }
-ListExpr : {- empty -} { [] }
- | Expr { (:[]) $1 }
- | Expr ',' ListExpr { (:) $1 $3 }
-
-
-Expr :: { Expr }
-Expr : Expr1 { $1 }
-
-
-Expr1 :: { Expr }
-Expr1 : Expr2 { $1 }
-
-
-Expr2 :: { Expr }
-Expr2 : Expr3 { $1 }
-
-
-Expr3 :: { Expr }
-Expr3 : Expr4 { $1 }
-
-
-Expr4 :: { Expr }
-Expr4 : Expr5 { $1 }
-
-
-Expr5 :: { Expr }
-Expr5 : Expr6 { $1 }
-
-
-Expr6 :: { Expr }
-Expr6 : Expr7 { $1 }
-
-
-Expr7 :: { Expr }
-Expr7 : Expr8 { $1 }
-
-
-Expr8 :: { Expr }
-Expr8 : Expr9 { $1 }
-
-
-Expr9 :: { Expr }
-Expr9 : Expr10 { $1 }
-
-
-Expr10 :: { Expr }
-Expr10 : Expr11 { $1 }
-
-
-Expr11 :: { Expr }
-Expr11 : Expr12 { $1 }
-
-
-Expr12 :: { Expr }
-Expr12 : Expr13 { $1 }
-
-
-Property :: { Property }
-Property : PropertyName ':' Expr { Prop $1 $3 }
-
-
-ListProperty :: { [Property] }
-ListProperty : {- empty -} { [] }
- | Property { (:[]) $1 }
- | Property ',' ListProperty { (:) $1 $3 }
-
-
-PropertyName :: { PropertyName }
-PropertyName : Ident { IdentPropName $1 }
- | String { StringPropName $1 }
-
-
-
-{
-
-returnM :: a -> Err a
-returnM = return
-
-thenM :: Err a -> (a -> Err b) -> Err b
-thenM = (>>=)
-
-happyError :: [Token] -> Err a
-happyError ts =
- Bad $ "syntax error at " ++ tokenPos ts ++
- case ts of
- [] -> []
- [Err _] -> " due to lexer error"
- _ -> " before " ++ unwords (map prToken (take 4 ts))
-
-myLexer = tokens
-eseq1_ x_ xs_ = ESeq (x_ : xs_)
-}
-
diff --git a/src-3.0/GF/JavaScript/PrintJS.hs b/src-3.0/GF/JavaScript/PrintJS.hs
deleted file mode 100644
index 4e04e3cbf..000000000
--- a/src-3.0/GF/JavaScript/PrintJS.hs
+++ /dev/null
@@ -1,169 +0,0 @@
-{-# OPTIONS -fno-warn-incomplete-patterns #-}
-module GF.JavaScript.PrintJS (printTree, Doc, Print(..)) where
-
--- pretty-printer generated by the BNF converter
-
-import GF.JavaScript.AbsJS
-import Data.Char
-
--- the top-level printing method
-printTree :: Print a => a -> String
-printTree = render . prt 0
-
-type Doc = [ShowS] -> [ShowS]
-
-doc :: ShowS -> Doc
-doc = (:)
-
-render :: Doc -> String
-render d = rend 0 (map ($ "") $ d []) "" where
- rend i ss = case ss of
- t:ts | not (spaceAfter t) -> showString t . rend i ts
- t:ts@(t':_) | not (spaceBefore t') -> showString t . rend i ts
- t:ts -> space t . rend i ts
- [] -> id
- new i = showChar '\n' . replicateS (2*i) (showChar ' ') . dropWhile isSpace
- space t = showString t . (\s -> if null s then "" else (' ':s))
-
-spaceAfter :: String -> Bool
-spaceAfter = (`notElem` [".","(","[","{","\n"])
-
-spaceBefore :: String -> Bool
-spaceBefore = (`notElem` [",",".",":",";","(",")","[","]","{","}","\n"])
-
-parenth :: Doc -> Doc
-parenth ss = doc (showChar '(') . ss . doc (showChar ')')
-
-concatS :: [ShowS] -> ShowS
-concatS = foldr (.) id
-
-concatD :: [Doc] -> Doc
-concatD = foldr (.) id
-
-replicateS :: Int -> ShowS -> ShowS
-replicateS n f = concatS (replicate n f)
-
--- the printer class does the job
-class Print a where
- prt :: Int -> a -> Doc
- prtList :: [a] -> Doc
- prtList = concatD . map (prt 0)
-
-instance Print a => Print [a] where
- prt _ = prtList
-
-instance Print Char where
- prt _ s = doc (showChar '\'' . mkEsc '\'' s . showChar '\'')
- prtList s = doc (showChar '"' . concatS (map (mkEsc '"') s) . showChar '"')
-
-mkEsc :: Char -> Char -> ShowS
-mkEsc q s = case s of
- _ | s == q -> showChar '\\' . showChar s
- '\\'-> showString "\\\\"
- '\n' -> showString "\\n"
- '\t' -> showString "\\t"
- _ -> showChar s
-
-prPrec :: Int -> Int -> Doc -> Doc
-prPrec i j = if j<i then parenth else id
-
-
-instance Print Int where
- prt _ x = doc (shows x)
-
-
-instance Print Double where
- prt _ x = doc (shows x)
-
-
-instance Print Ident where
- prt _ (Ident i) = doc (showString i)
- prtList es = case es of
- [] -> (concatD [])
- [x] -> (concatD [prt 0 x])
- x:xs -> (concatD [prt 0 x , doc (showString ",") , prt 0 xs])
-
-
-
-instance Print Program where
- prt i e = case e of
- Program elements -> prPrec i 0 (concatD [prt 0 elements])
-
-
-instance Print Element where
- prt i e = case e of
- FunDef id ids stmts -> prPrec i 0 (concatD [doc (showString "function") , prt 0 id , doc (showString "(") , prt 0 ids , doc (showString ")") , doc (showString "{") , prt 0 stmts , doc (showString "}")])
- ElStmt stmt -> prPrec i 0 (concatD [prt 0 stmt])
-
- prtList es = case es of
- [] -> (concatD [])
- x:xs -> (concatD [prt 0 x , doc (showString "\n"), prt 0 xs]) -- HACKED!
-
-instance Print Stmt where
- prt i e = case e of
- SCompound stmts -> prPrec i 0 (concatD [doc (showString "{") , prt 0 stmts , doc (showString "}")])
- SReturnVoid -> prPrec i 0 (concatD [doc (showString "return") , doc (showString ";")])
- SReturn expr -> prPrec i 0 (concatD [doc (showString "return") , prt 0 expr , doc (showString ";")])
- SDeclOrExpr declorexpr -> prPrec i 0 (concatD [prt 0 declorexpr , doc (showString ";")])
-
- prtList es = case es of
- [] -> (concatD [])
- x:xs -> (concatD [prt 0 x , prt 0 xs])
-
-instance Print DeclOrExpr where
- prt i e = case e of
- Decl declvars -> prPrec i 0 (concatD [doc (showString "var") , prt 0 declvars])
- DExpr expr -> prPrec i 0 (concatD [prt 1 expr])
-
-
-instance Print DeclVar where
- prt i e = case e of
- DVar id -> prPrec i 0 (concatD [prt 0 id])
- DInit id expr -> prPrec i 0 (concatD [prt 0 id , doc (showString "=") , prt 0 expr])
-
- prtList es = case es of
- [] -> (concatD [])
- [x] -> (concatD [prt 0 x])
- x:xs -> (concatD [prt 0 x , doc (showString ",") , prt 0 xs])
-
-instance Print Expr where
- prt i e = case e of
- EAssign expr0 expr -> prPrec i 13 (concatD [prt 14 expr0 , doc (showString "=") , prt 13 expr])
- ENew id exprs -> prPrec i 14 (concatD [doc (showString "new") , prt 0 id , doc (showString "(") , prt 0 exprs , doc (showString ")")])
- EMember expr id -> prPrec i 15 (concatD [prt 15 expr , doc (showString ".") , prt 0 id])
- EIndex expr0 expr -> prPrec i 15 (concatD [prt 15 expr0 , doc (showString "[") , prt 0 expr , doc (showString "]")])
- ECall expr exprs -> prPrec i 15 (concatD [prt 15 expr , doc (showString "(") , prt 0 exprs , doc (showString ")")])
- EVar id -> prPrec i 16 (concatD [prt 0 id])
- EInt n -> prPrec i 16 (concatD [prt 0 n])
- EDbl d -> prPrec i 16 (concatD [prt 0 d])
- EStr str -> prPrec i 16 (concatD [prt 0 str])
- ETrue -> prPrec i 16 (concatD [doc (showString "true")])
- EFalse -> prPrec i 16 (concatD [doc (showString "false")])
- ENull -> prPrec i 16 (concatD [doc (showString "null")])
- EThis -> prPrec i 16 (concatD [doc (showString "this")])
- EFun ids stmts -> prPrec i 16 (concatD [doc (showString "function") , doc (showString "(") , prt 0 ids , doc (showString ")") , doc (showString "{") , prt 0 stmts , doc (showString "}")])
- EArray exprs -> prPrec i 16 (concatD [doc (showString "[") , prt 0 exprs , doc (showString "]")])
- EObj propertys -> prPrec i 16 (concatD [doc (showString "{") , prt 0 propertys , doc (showString "}")])
- ESeq exprs -> prPrec i 16 (concatD [doc (showString "(") , prt 0 exprs , doc (showString ")")])
-
- prtList es = case es of
- [] -> (concatD [])
- [x] -> (concatD [prt 0 x])
- x:xs -> (concatD [prt 0 x , doc (showString ",") , prt 0 xs])
-
-instance Print Property where
- prt i e = case e of
- Prop propertyname expr -> prPrec i 0 (concatD [prt 0 propertyname , doc (showString ":") , prt 0 expr])
-
- prtList es = case es of
- [] -> (concatD [])
- [x] -> (concatD [prt 0 x])
- x:xs -> (concatD [prt 0 x , doc (showString ",") , prt 0 xs])
-
-instance Print PropertyName where
- prt i e = case e of
- IdentPropName id -> prPrec i 0 (concatD [prt 0 id])
- StringPropName str -> prPrec i 0 (concatD [prt 0 str])
-
-
-
diff --git a/src-3.0/GF/Source/AbsGF.hs b/src-3.0/GF/Source/AbsGF.hs
deleted file mode 100644
index 86e521318..000000000
--- a/src-3.0/GF/Source/AbsGF.hs
+++ /dev/null
@@ -1,307 +0,0 @@
-module GF.Source.AbsGF where
-
--- Haskell module generated by the BNF converter
-
-import qualified Data.ByteString.Char8 as BS
-newtype LString = LString BS.ByteString deriving (Eq,Ord,Show)
-newtype PIdent = PIdent ((Int,Int),BS.ByteString) deriving (Eq,Ord,Show)
-data Grammar =
- Gr [ModDef]
- deriving (Eq,Ord,Show)
-
-data ModDef =
- MMain PIdent PIdent [ConcSpec]
- | MModule ComplMod ModType ModBody
- deriving (Eq,Ord,Show)
-
-data ConcSpec =
- ConcSpec PIdent ConcExp
- deriving (Eq,Ord,Show)
-
-data ConcExp =
- ConcExp PIdent [Transfer]
- deriving (Eq,Ord,Show)
-
-data Transfer =
- TransferIn Open
- | TransferOut Open
- deriving (Eq,Ord,Show)
-
-data ModType =
- MTAbstract PIdent
- | MTResource PIdent
- | MTInterface PIdent
- | MTConcrete PIdent PIdent
- | MTInstance PIdent PIdent
- | MTTransfer PIdent Open Open
- deriving (Eq,Ord,Show)
-
-data ModBody =
- MBody Extend Opens [TopDef]
- | MNoBody [Included]
- | MWith Included [Open]
- | MWithBody Included [Open] Opens [TopDef]
- | MWithE [Included] Included [Open]
- | MWithEBody [Included] Included [Open] Opens [TopDef]
- | MReuse PIdent
- | MUnion [Included]
- deriving (Eq,Ord,Show)
-
-data Extend =
- Ext [Included]
- | NoExt
- deriving (Eq,Ord,Show)
-
-data Opens =
- NoOpens
- | OpenIn [Open]
- deriving (Eq,Ord,Show)
-
-data Open =
- OName PIdent
- | OQualQO QualOpen PIdent
- | OQual QualOpen PIdent PIdent
- deriving (Eq,Ord,Show)
-
-data ComplMod =
- CMCompl
- | CMIncompl
- deriving (Eq,Ord,Show)
-
-data QualOpen =
- QOCompl
- | QOIncompl
- | QOInterface
- deriving (Eq,Ord,Show)
-
-data Included =
- IAll PIdent
- | ISome PIdent [PIdent]
- | IMinus PIdent [PIdent]
- deriving (Eq,Ord,Show)
-
-data Def =
- DDecl [Name] Exp
- | DDef [Name] Exp
- | DPatt Name [Patt] Exp
- | DFull [Name] Exp Exp
- deriving (Eq,Ord,Show)
-
-data TopDef =
- DefCat [CatDef]
- | DefFun [FunDef]
- | DefFunData [FunDef]
- | DefDef [Def]
- | DefData [DataDef]
- | DefTrans [Def]
- | DefPar [ParDef]
- | DefOper [Def]
- | DefLincat [PrintDef]
- | DefLindef [Def]
- | DefLin [Def]
- | DefPrintCat [PrintDef]
- | DefPrintFun [PrintDef]
- | DefFlag [FlagDef]
- | DefPrintOld [PrintDef]
- | DefLintype [Def]
- | DefPattern [Def]
- | DefPackage PIdent [TopDef]
- | DefVars [Def]
- | DefTokenizer PIdent
- deriving (Eq,Ord,Show)
-
-data CatDef =
- SimpleCatDef PIdent [DDecl]
- | ListCatDef PIdent [DDecl]
- | ListSizeCatDef PIdent [DDecl] Integer
- deriving (Eq,Ord,Show)
-
-data FunDef =
- FunDef [PIdent] Exp
- deriving (Eq,Ord,Show)
-
-data DataDef =
- DataDef PIdent [DataConstr]
- deriving (Eq,Ord,Show)
-
-data DataConstr =
- DataId PIdent
- | DataQId PIdent PIdent
- deriving (Eq,Ord,Show)
-
-data ParDef =
- ParDefDir PIdent [ParConstr]
- | ParDefIndir PIdent PIdent
- | ParDefAbs PIdent
- deriving (Eq,Ord,Show)
-
-data ParConstr =
- ParConstr PIdent [DDecl]
- deriving (Eq,Ord,Show)
-
-data PrintDef =
- PrintDef [Name] Exp
- deriving (Eq,Ord,Show)
-
-data FlagDef =
- FlagDef PIdent PIdent
- deriving (Eq,Ord,Show)
-
-data Name =
- IdentName PIdent
- | ListName PIdent
- deriving (Eq,Ord,Show)
-
-data LocDef =
- LDDecl [PIdent] Exp
- | LDDef [PIdent] Exp
- | LDFull [PIdent] Exp Exp
- deriving (Eq,Ord,Show)
-
-data Exp =
- EIdent PIdent
- | EConstr PIdent
- | ECons PIdent
- | ESort Sort
- | EString String
- | EInt Integer
- | EFloat Double
- | EMeta
- | EEmpty
- | EData
- | EList PIdent Exps
- | EStrings String
- | ERecord [LocDef]
- | ETuple [TupleComp]
- | EIndir PIdent
- | ETyped Exp Exp
- | EProj Exp Label
- | EQConstr PIdent PIdent
- | EQCons PIdent PIdent
- | EApp Exp Exp
- | ETable [Case]
- | ETTable Exp [Case]
- | EVTable Exp [Exp]
- | ECase Exp [Case]
- | EVariants [Exp]
- | EPre Exp [Altern]
- | EStrs [Exp]
- | EConAt PIdent Exp
- | EPatt Patt
- | EPattType Exp
- | ESelect Exp Exp
- | ETupTyp Exp Exp
- | EExtend Exp Exp
- | EGlue Exp Exp
- | EConcat Exp Exp
- | EAbstr [Bind] Exp
- | ECTable [Bind] Exp
- | EProd Decl Exp
- | ETType Exp Exp
- | ELet [LocDef] Exp
- | ELetb [LocDef] Exp
- | EWhere Exp [LocDef]
- | EEqs [Equation]
- | EExample Exp String
- | ELString LString
- | ELin PIdent
- deriving (Eq,Ord,Show)
-
-data Exps =
- NilExp
- | ConsExp Exp Exps
- deriving (Eq,Ord,Show)
-
-data Patt =
- PChar
- | PChars String
- | PMacro PIdent
- | PM PIdent PIdent
- | PW
- | PV PIdent
- | PCon PIdent
- | PQ PIdent PIdent
- | PInt Integer
- | PFloat Double
- | PStr String
- | PR [PattAss]
- | PTup [PattTupleComp]
- | PC PIdent [Patt]
- | PQC PIdent PIdent [Patt]
- | PDisj Patt Patt
- | PSeq Patt Patt
- | PRep Patt
- | PAs PIdent Patt
- | PNeg Patt
- deriving (Eq,Ord,Show)
-
-data PattAss =
- PA [PIdent] Patt
- deriving (Eq,Ord,Show)
-
-data Label =
- LIdent PIdent
- | LVar Integer
- deriving (Eq,Ord,Show)
-
-data Sort =
- Sort_Type
- | Sort_PType
- | Sort_Tok
- | Sort_Str
- | Sort_Strs
- deriving (Eq,Ord,Show)
-
-data Bind =
- BIdent PIdent
- | BWild
- deriving (Eq,Ord,Show)
-
-data Decl =
- DDec [Bind] Exp
- | DExp Exp
- deriving (Eq,Ord,Show)
-
-data TupleComp =
- TComp Exp
- deriving (Eq,Ord,Show)
-
-data PattTupleComp =
- PTComp Patt
- deriving (Eq,Ord,Show)
-
-data Case =
- Case Patt Exp
- deriving (Eq,Ord,Show)
-
-data Equation =
- Equ [Patt] Exp
- deriving (Eq,Ord,Show)
-
-data Altern =
- Alt Exp Exp
- deriving (Eq,Ord,Show)
-
-data DDecl =
- DDDec [Bind] Exp
- | DDExp Exp
- deriving (Eq,Ord,Show)
-
-data OldGrammar =
- OldGr Include [TopDef]
- deriving (Eq,Ord,Show)
-
-data Include =
- NoIncl
- | Incl [FileName]
- deriving (Eq,Ord,Show)
-
-data FileName =
- FString String
- | FIdent PIdent
- | FSlash FileName
- | FDot FileName
- | FMinus FileName
- | FAddId PIdent FileName
- deriving (Eq,Ord,Show)
-
diff --git a/src-3.0/GF/Source/ErrM.hs b/src-3.0/GF/Source/ErrM.hs
deleted file mode 100644
index addd22f69..000000000
--- a/src-3.0/GF/Source/ErrM.hs
+++ /dev/null
@@ -1,26 +0,0 @@
--- BNF Converter: Error Monad
--- Copyright (C) 2004 Author: Aarne Ranta
-
--- This file comes with NO WARRANTY and may be used FOR ANY PURPOSE.
-module GF.Source.ErrM where
-
--- the Error monad: like Maybe type with error msgs
-
-import Control.Monad (MonadPlus(..), liftM)
-
-data Err a = Ok a | Bad String
- deriving (Read, Show, Eq, Ord)
-
-instance Monad Err where
- return = Ok
- fail = Bad
- Ok a >>= f = f a
- Bad s >>= f = Bad s
-
-instance Functor Err where
- fmap = liftM
-
-instance MonadPlus Err where
- mzero = Bad "Err.mzero"
- mplus (Bad _) y = y
- mplus x _ = x
diff --git a/src-3.0/GF/Source/GF.cf b/src-3.0/GF/Source/GF.cf
deleted file mode 100644
index ef458c91a..000000000
--- a/src-3.0/GF/Source/GF.cf
+++ /dev/null
@@ -1,371 +0,0 @@
--- AR 2/5/2003, 14-16 o'clock, Torino
-
--- 17/6/2007: marked with suffix --% those lines that are obsolete and
--- should not be included in documentation
-
-entrypoints Grammar, ModDef,
- OldGrammar, --%
- ModHeader,
- Exp ; -- let's see if more are needed
-
-comment "--" ;
-comment "{-" "-}" ;
-
--- the top-level grammar
-
-Gr. Grammar ::= [ModDef] ;
-
--- semicolon after module is permitted but not obligatory
-
-terminator ModDef "" ;
-_. ModDef ::= ModDef ";" ;
-
--- The $main$ multilingual grammar structure --%
-
-MMain. ModDef ::= "grammar" PIdent "=" "{" "abstract" "=" PIdent ";" [ConcSpec] "}" ;--%
-
-ConcSpec. ConcSpec ::= PIdent "=" ConcExp ;--%
-separator ConcSpec ";" ;--%
-
-ConcExp. ConcExp ::= PIdent [Transfer] ;--%
-
-separator Transfer "" ;--%
-TransferIn. Transfer ::= "(" "transfer" "in" Open ")" ; --%
-TransferOut. Transfer ::= "(" "transfer" "out" Open ")" ; --%
-
--- the module header
-
-MModule2. ModHeader ::= ComplMod ModType "=" ModHeaderBody ;
-
-MBody2. ModHeaderBody ::= Extend Opens ;
-MNoBody2. ModHeaderBody ::= [Included] ;
-MWith2. ModHeaderBody ::= Included "with" [Open] ;
-MWithBody2. ModHeaderBody ::= Included "with" [Open] "**" Opens ;
-MWithE2. ModHeaderBody ::= [Included] "**" Included "with" [Open] ;
-MWithEBody2. ModHeaderBody ::= [Included] "**" Included "with" [Open] "**" Opens ;
-
-MReuse2. ModHeaderBody ::= "reuse" PIdent ; --%
-MUnion2. ModHeaderBody ::= "union" [Included] ;--%
-
--- the individual modules
-
-MModule. ModDef ::= ComplMod ModType "=" ModBody ;
-
-MTAbstract. ModType ::= "abstract" PIdent ;
-MTResource. ModType ::= "resource" PIdent ;
-MTInterface. ModType ::= "interface" PIdent ;
-MTConcrete. ModType ::= "concrete" PIdent "of" PIdent ;
-MTInstance. ModType ::= "instance" PIdent "of" PIdent ;
-MTTransfer. ModType ::= "transfer" PIdent ":" Open "->" Open ;
-
-
-MBody. ModBody ::= Extend Opens "{" [TopDef] "}" ;
-MNoBody. ModBody ::= [Included] ;
-MWith. ModBody ::= Included "with" [Open] ;
-MWithBody. ModBody ::= Included "with" [Open] "**" Opens "{" [TopDef] "}" ;
-MWithE. ModBody ::= [Included] "**" Included "with" [Open] ;
-MWithEBody. ModBody ::= [Included] "**" Included "with" [Open] "**" Opens "{" [TopDef] "}" ;
-
-MReuse. ModBody ::= "reuse" PIdent ; --%
-MUnion. ModBody ::= "union" [Included] ;--%
-
-separator TopDef "" ;
-
-Ext. Extend ::= [Included] "**" ;
-NoExt. Extend ::= ;
-
-separator Open "," ;
-NoOpens. Opens ::= ;
-OpenIn. Opens ::= "open" [Open] "in" ;
-
-OName. Open ::= PIdent ;
-OQualQO. Open ::= "(" QualOpen PIdent ")" ;
-OQual. Open ::= "(" QualOpen PIdent "=" PIdent ")" ;
-
-CMCompl. ComplMod ::= ;
-CMIncompl. ComplMod ::= "incomplete" ;
-
-QOCompl. QualOpen ::= ;
-QOIncompl. QualOpen ::= "incomplete" ;--%
-QOInterface. QualOpen ::= "interface" ;--%
-
-separator Included "," ;
-
-IAll. Included ::= PIdent ;
-ISome. Included ::= PIdent "[" [PIdent] "]" ;
-IMinus. Included ::= PIdent "-" "[" [PIdent] "]" ;
-
--- definitions after the $oper$ keywords
-
-DDecl. Def ::= [Name] ":" Exp ;
-DDef. Def ::= [Name] "=" Exp ;
-DPatt. Def ::= Name [Patt] "=" Exp ; -- non-empty pattern list
-DFull. Def ::= [Name] ":" Exp "=" Exp ;
-
--- top-level definitions
-
-DefCat. TopDef ::= "cat" [CatDef] ;
-DefFun. TopDef ::= "fun" [FunDef] ;
-DefFunData.TopDef ::= "data" [FunDef] ;
-DefDef. TopDef ::= "def" [Def] ;
-DefData. TopDef ::= "data" [DataDef] ;
-
-DefTrans. TopDef ::= "transfer" [Def] ;--%
-
-DefPar. TopDef ::= "param" [ParDef] ;
-DefOper. TopDef ::= "oper" [Def] ;
-
-DefLincat. TopDef ::= "lincat" [PrintDef] ;
-DefLindef. TopDef ::= "lindef" [Def] ;
-DefLin. TopDef ::= "lin" [Def] ;
-
-DefPrintCat. TopDef ::= "printname" "cat" [PrintDef] ;
-DefPrintFun. TopDef ::= "printname" "fun" [PrintDef] ;
-DefFlag. TopDef ::= "flags" [FlagDef] ;
-
-SimpleCatDef. CatDef ::= PIdent [DDecl] ;
-ListCatDef. CatDef ::= "[" PIdent [DDecl] "]" ;
-ListSizeCatDef. CatDef ::= "[" PIdent [DDecl] "]" "{" Integer "}" ;
-
-FunDef. FunDef ::= [PIdent] ":" Exp ;
-
-DataDef. DataDef ::= PIdent "=" [DataConstr] ;
-DataId. DataConstr ::= PIdent ;
-DataQId. DataConstr ::= PIdent "." PIdent ;
-separator DataConstr "|" ;
-
-
-ParDefDir. ParDef ::= PIdent "=" [ParConstr] ;
-ParDefIndir. ParDef ::= PIdent "=" "(" "in" PIdent ")" ;
-ParDefAbs. ParDef ::= PIdent ;
-
-ParConstr. ParConstr ::= PIdent [DDecl] ;
-
-PrintDef. PrintDef ::= [Name] "=" Exp ;
-
-FlagDef. FlagDef ::= PIdent "=" PIdent ;
-
-terminator nonempty Def ";" ;
-terminator nonempty CatDef ";" ;
-terminator nonempty FunDef ";" ;
-terminator nonempty DataDef ";" ;
-terminator nonempty ParDef ";" ;
-
-terminator nonempty PrintDef ";" ;
-terminator nonempty FlagDef ";" ;
-
-separator ParConstr "|" ;
-
-separator nonempty PIdent "," ;
-
--- names of categories and functions in definition LHS
-
-IdentName. Name ::= PIdent ;
-ListName. Name ::= "[" PIdent "]" ;
-
-separator nonempty Name "," ;
-
--- definitions in records and $let$ expressions
-
-LDDecl. LocDef ::= [PIdent] ":" Exp ;
-LDDef. LocDef ::= [PIdent] "=" Exp ;
-LDFull. LocDef ::= [PIdent] ":" Exp "=" Exp ;
-
-separator LocDef ";" ;
-
--- terms and types
-
-EIdent. Exp6 ::= PIdent ;
-EConstr. Exp6 ::= "{" PIdent "}" ;--%
-ECons. Exp6 ::= "%" PIdent "%" ;--%
-ESort. Exp6 ::= Sort ;
-EString. Exp6 ::= String ;
-EInt. Exp6 ::= Integer ;
-EFloat. Exp6 ::= Double ;
-EMeta. Exp6 ::= "?" ;
-EEmpty. Exp6 ::= "[" "]" ;
-EData. Exp6 ::= "data" ;
-EList. Exp6 ::= "[" PIdent Exps "]" ;
-EStrings. Exp6 ::= "[" String "]" ;
-ERecord. Exp6 ::= "{" [LocDef] "}" ; -- !
-ETuple. Exp6 ::= "<" [TupleComp] ">" ; --- needed for separator ","
-EIndir. Exp6 ::= "(" "in" PIdent ")" ; -- indirection, used in judgements --%
-ETyped. Exp6 ::= "<" Exp ":" Exp ">" ; -- typing, used for annotations
-
-EProj. Exp5 ::= Exp5 "." Label ;
-EQConstr. Exp5 ::= "{" PIdent "." PIdent "}" ; -- qualified constructor --%
-EQCons. Exp5 ::= "%" PIdent "." PIdent ; -- qualified constant --%
-
-EApp. Exp4 ::= Exp4 Exp5 ;
-ETable. Exp4 ::= "table" "{" [Case] "}" ;
-ETTable. Exp4 ::= "table" Exp6 "{" [Case] "}" ;
-EVTable. Exp4 ::= "table" Exp6 "[" [Exp] "]" ;
-ECase. Exp4 ::= "case" Exp "of" "{" [Case] "}" ;
-EVariants. Exp4 ::= "variants" "{" [Exp] "}" ;
---- EPreCase. Exp4 ::= "pre" "{" [Case] "}" ;
-EPre. Exp4 ::= "pre" "{" Exp ";" [Altern] "}" ;
-EStrs. Exp4 ::= "strs" "{" [Exp] "}" ;
-EConAt. Exp4 ::= PIdent "@" Exp6 ; --%
-
-EPatt. Exp4 ::= "#" Patt2 ;
-EPattType. Exp4 ::= "pattern" Exp5 ;
-
-ESelect. Exp3 ::= Exp3 "!" Exp4 ;
-ETupTyp. Exp3 ::= Exp3 "*" Exp4 ;
-EExtend. Exp3 ::= Exp3 "**" Exp4 ;
-
-EGlue. Exp1 ::= Exp2 "+" Exp1 ;
-
-EConcat. Exp ::= Exp1 "++" Exp ;
-
-EAbstr. Exp ::= "\\" [Bind] "->" Exp ;
-ECTable. Exp ::= "\\""\\" [Bind] "=>" Exp ;
-EProd. Exp ::= Decl "->" Exp ;
-ETType. Exp ::= Exp3 "=>" Exp ; -- these are thus right associative
-ELet. Exp ::= "let" "{" [LocDef] "}" "in" Exp ;
-ELetb. Exp ::= "let" [LocDef] "in" Exp ;
-EWhere. Exp ::= Exp3 "where" "{" [LocDef] "}" ;
-EEqs. Exp ::= "fn" "{" [Equation] "}" ; --%
-
-EExample. Exp ::= "in" Exp5 String ;
-
-coercions Exp 6 ;
-
-separator Exp ";" ; -- in variants
-
--- list of arguments to category
-NilExp. Exps ::= ;
-ConsExp. Exps ::= Exp6 Exps ; -- Exp6 to force parantheses
-
--- patterns
-
-PChar. Patt2 ::= "?" ;
-PChars. Patt2 ::= "[" String "]" ;
-PMacro. Patt2 ::= "#" PIdent ;
-PM. Patt2 ::= "#" PIdent "." PIdent ;
-PW. Patt2 ::= "_" ;
-PV. Patt2 ::= PIdent ;
-PCon. Patt2 ::= "{" PIdent "}" ; --%
-PQ. Patt2 ::= PIdent "." PIdent ;
-PInt. Patt2 ::= Integer ;
-PFloat. Patt2 ::= Double ;
-PStr. Patt2 ::= String ;
-PR. Patt2 ::= "{" [PattAss] "}" ;
-PTup. Patt2 ::= "<" [PattTupleComp] ">" ;
-PC. Patt1 ::= PIdent [Patt] ;
-PQC. Patt1 ::= PIdent "." PIdent [Patt] ;
-PDisj. Patt ::= Patt "|" Patt1 ;
-PSeq. Patt ::= Patt "+" Patt1 ;
-PRep. Patt1 ::= Patt2 "*" ;
-PAs. Patt1 ::= PIdent "@" Patt2 ;
-PNeg. Patt1 ::= "-" Patt2 ;
-
-coercions Patt 2 ;
-
-PA. PattAss ::= [PIdent] "=" Patt ;
-
--- labels
-
-LIdent. Label ::= PIdent ;
-LVar. Label ::= "$" Integer ;
-
--- basic types
-
-rules Sort ::=
- "Type"
- | "PType"
- | "Tok" --%
- | "Str"
- | "Strs" ;
-
-separator PattAss ";" ;
-
--- this is explicit to force higher precedence level on rhs
-(:[]). [Patt] ::= Patt2 ;
-(:). [Patt] ::= Patt2 [Patt] ;
-
-
--- binds in lambdas and lin rules
-
-BIdent. Bind ::= PIdent ;
-BWild. Bind ::= "_" ;
-
-separator Bind "," ;
-
-
--- declarations in function types
-
-DDec. Decl ::= "(" [Bind] ":" Exp ")" ;
-DExp. Decl ::= Exp4 ; -- can thus be an application
-
--- tuple component (term or pattern)
-
-TComp. TupleComp ::= Exp ;
-PTComp. PattTupleComp ::= Patt ;
-
-separator TupleComp "," ;
-separator PattTupleComp "," ;
-
--- case branches
-
-Case. Case ::= Patt "=>" Exp ;
-
-separator nonempty Case ";" ;
-
--- cases in abstract syntax --%
-
-Equ. Equation ::= [Patt] "->" Exp ; --%
-
-separator Equation ";" ; --%
-
--- prefix alternatives
-
-Alt. Altern ::= Exp "/" Exp ;
-
-separator Altern ";" ;
-
--- in a context, higher precedence is required than in function types
-
-DDDec. DDecl ::= "(" [Bind] ":" Exp ")" ;
-DDExp. DDecl ::= Exp6 ; -- can thus *not* be an application
-
-separator DDecl "" ;
-
-
--------------------------------------- --%
-
--- for backward compatibility --%
-
-OldGr. OldGrammar ::= Include [TopDef] ; --%
-
-NoIncl. Include ::= ; --%
-Incl. Include ::= "include" [FileName] ; --%
-
-FString. FileName ::= String ; --%
-
-terminator nonempty FileName ";" ; --%
-
-FIdent. FileName ::= PIdent ; --%
-FSlash. FileName ::= "/" FileName ; --%
-FDot. FileName ::= "." FileName ; --%
-FMinus. FileName ::= "-" FileName ; --%
-FAddId. FileName ::= PIdent FileName ; --%
-
-token LString '\'' (char - '\'')* '\'' ; --%
-ELString. Exp6 ::= LString ; --%
-ELin. Exp4 ::= "Lin" PIdent ; --%
-
-DefPrintOld. TopDef ::= "printname" [PrintDef] ; --%
-DefLintype. TopDef ::= "lintype" [Def] ; --%
-DefPattern. TopDef ::= "pattern" [Def] ; --%
-
--- deprecated packages are attempted to be interpreted --%
-DefPackage. TopDef ::= "package" PIdent "=" "{" [TopDef] "}" ";" ; --%
-
--- these two are just ignored after parsing --%
-DefVars. TopDef ::= "var" [Def] ; --%
-DefTokenizer. TopDef ::= "tokenizer" PIdent ";" ; --%
-
--- identifiers
-
-position token PIdent ('_' | letter) (letter | digit | '_' | '\'')* ;
diff --git a/src-3.0/GF/Source/GrammarToSource.hs b/src-3.0/GF/Source/GrammarToSource.hs
deleted file mode 100644
index f76fe6cee..000000000
--- a/src-3.0/GF/Source/GrammarToSource.hs
+++ /dev/null
@@ -1,257 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : GrammarToSource
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/10/04 11:05:07 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.23 $
---
--- From internal source syntax to BNFC-generated (used for printing).
------------------------------------------------------------------------------
-
-module GF.Source.GrammarToSource ( trGrammar,
- trModule,
- trAnyDef,
- trLabel,
- trt, tri, trp
- ) where
-
-import GF.Data.Operations
-import GF.Grammar.Grammar
-import GF.Grammar.Predef
-import GF.Infra.Modules
-import GF.Infra.Option
-import qualified GF.Source.AbsGF as P
-import GF.Infra.Ident
-import qualified Data.ByteString.Char8 as BS
-
--- | AR 13\/5\/2003
---
--- translate internal to parsable and printable source
-trGrammar :: SourceGrammar -> P.Grammar
-trGrammar (MGrammar ms) = P.Gr (map trModule ms) -- no includes
-
-trModule :: (Ident,SourceModInfo) -> P.ModDef
-trModule (i,mo) = case mo of
- ModMod m -> P.MModule compl typ body where
- compl = case mstatus m of
- MSIncomplete -> P.CMIncompl
- _ -> P.CMCompl
- i' = tri i
- typ = case typeOfModule mo of
- MTResource -> P.MTResource i'
- MTAbstract -> P.MTAbstract i'
- MTConcrete a -> P.MTConcrete i' (tri a)
- MTTransfer a b -> P.MTTransfer i' (trOpen a) (trOpen b)
- MTInstance a -> P.MTInstance i' (tri a)
- MTInterface -> P.MTInterface i'
- body = P.MBody
- (trExtends (extend m))
- (mkOpens (map trOpen (opens m)))
- (mkTopDefs (concatMap trAnyDef (tree2list (jments m)) ++ trFlags (flags m)))
-
-trExtends :: [(Ident,MInclude Ident)] -> P.Extend
-trExtends [] = P.NoExt
-trExtends es = (P.Ext $ map tre es) where
- tre (i,c) = case c of
- MIAll -> P.IAll (tri i)
- MIOnly is -> P.ISome (tri i) (map tri is)
- MIExcept is -> P.IMinus (tri i) (map tri is)
-
----- this has to be completed with other mtys
-forName (MTConcrete a) = tri a
-
-trOpen :: OpenSpec Ident -> P.Open
-trOpen o = case o of
- OSimple OQNormal i -> P.OName (tri i)
- OSimple q i -> P.OQualQO (trQualOpen q) (tri i)
- OQualif q i j -> P.OQual (trQualOpen q) (tri i) (tri j)
-
-trQualOpen q = case q of
- OQNormal -> P.QOCompl
- OQIncomplete -> P.QOIncompl
- OQInterface -> P.QOInterface
-
-
-mkOpens ds = if null ds then P.NoOpens else P.OpenIn ds
-mkTopDefs ds = ds
-
-trAnyDef :: (Ident,Info) -> [P.TopDef]
-trAnyDef (i,info) = let i' = tri i in case info of
- AbsCat (Yes co) pd -> [P.DefCat [P.SimpleCatDef i' (map trDecl co)]]
- AbsFun (Yes ty) (Yes EData) -> [P.DefFunData [P.FunDef [i'] (trt ty)]]
- AbsFun (Yes ty) pt -> [P.DefFun [P.FunDef [i'] (trt ty)]] ++ case pt of
- Yes t -> [P.DefDef [P.DDef [mkName i'] (trt t)]]
- _ -> []
- AbsFun (May b) _ -> [P.DefFun [P.FunDef [i'] (P.EIndir (tri b))]]
- ---- don't destroy definitions!
- AbsTrans f -> [P.DefTrans [P.DDef [mkName i'] (trt f)]]
-
- ResOper pty ptr -> [P.DefOper [trDef i' pty ptr]]
- ResParam pp -> [P.DefPar [case pp of
- Yes (ps,_) -> P.ParDefDir i' [P.ParConstr (tri c) (map trDecl co) | (c,co) <- ps]
- May b -> P.ParDefIndir i' $ tri b
- _ -> P.ParDefAbs i']]
-
- ResOverload os tysts ->
- [P.DefOper [P.DDef [mkName i'] (
- foldl P.EApp
- (P.EIdent $ tri $ cOverload)
- (map (P.EIdent . tri) os ++
- [P.ERecord [P.LDFull [i'] (trt ty) (trt fu) | (ty,fu) <- tysts]]))]]
-
- CncCat (Yes ty) Nope _ ->
- [P.DefLincat [P.PrintDef [mkName i'] (trt ty)]]
- CncCat pty ptr ppr ->
- [P.DefLindef [trDef i' pty ptr]] ++
- [P.DefPrintCat [P.PrintDef [mkName i'] (trt pr)] | Yes pr <- [ppr]]
- CncFun _ ptr ppr ->
- [P.DefLin [trDef i' nope ptr]] ++
- [P.DefPrintFun [P.PrintDef [mkName i'] (trt pr)] | Yes pr <- [ppr]]
-{-
- ---- encoding of AnyInd without changing syntax. AR 20/9/2007
- AnyInd s b ->
- [P.DefOper [P.DDef [mkName i]
- (P.EApp (P.EInt (if s then 1 else 0)) (P.EIdent (tri b)))]]
--}
- _ -> []
-
-
-trDef :: P.PIdent -> Perh Type -> Perh Term -> P.Def
-trDef i pty ptr = case (pty,ptr) of
- (Nope, Nope) -> P.DDef [mkName i] (P.EMeta) ---
- (_, Nope) -> P.DDecl [mkName i] (trPerh pty)
- (Nope, _ ) -> P.DDef [mkName i] (trPerh ptr)
- (_, _ ) -> P.DFull [mkName i] (trPerh pty) (trPerh ptr)
-
-trPerh p = case p of
- Yes t -> trt t
- May b -> P.EIndir $ tri b
- _ -> P.EMeta ---
-
-trFlags :: ModuleOptions -> [P.TopDef]
-trFlags = map trFlag . moduleOptionsGFO
-
-trFlag :: (String,String) -> P.TopDef
-trFlag (f,x) = P.DefFlag [P.FlagDef (tri $ identC (BS.pack f)) (tri $ identC (BS.pack x))]
-
-trt :: Term -> P.Exp
-trt trm = case trm of
- Vr s -> P.EIdent $ tri s
- Cn s -> P.ECons $ tri s
- Con s -> P.EConstr $ tri s
- Sort s -> P.ESort $! if s == cType then P.Sort_Type else
- if s == cPType then P.Sort_PType else
- if s == cTok then P.Sort_Tok else
- if s == cStr then P.Sort_Str else
- if s == cStrs then P.Sort_Strs else
- error $ "not yet sort " +++ show trm
- App c a -> P.EApp (trt c) (trt a)
- Abs x b -> P.EAbstr [trb x] (trt b)
- Eqs pts -> P.EEqs [P.Equ (map trp ps) (trt t) | (ps,t) <- pts]
- Meta m -> P.EMeta
- Prod x a b | isWildIdent x -> P.EProd (P.DExp (trt a)) (trt b)
- Prod x a b -> P.EProd (P.DDec [trb x] (trt a)) (trt b)
-
- Example t s -> P.EExample (trt t) s
- R [] -> P.ETuple [] --- to get correct parsing when read back
- R r -> P.ERecord $ map trAssign r
- RecType r -> P.ERecord $ map trLabelling r
- ExtR x y -> P.EExtend (trt x) (trt y)
- P t l -> P.EProj (trt t) (trLabel l)
- PI t l _ -> P.EProj (trt t) (trLabel l)
- Q t l -> P.EQCons (tri t) (tri l)
- QC t l -> P.EQConstr (tri t) (tri l)
- TSh (TComp ty) cc -> P.ETTable (trt ty) (map trCases cc)
- TSh (TTyped ty) cc -> P.ETTable (trt ty) (map trCases cc)
- TSh (TWild ty) cc -> P.ETTable (trt ty) (map trCases cc)
- T (TTyped ty) cc -> P.ETTable (trt ty) (map trCase cc)
- T (TComp ty) cc -> P.ETTable (trt ty) (map trCase cc)
- T (TWild ty) cc -> P.ETTable (trt ty) (map trCase cc)
- T _ cc -> P.ETable (map trCase cc)
- V ty cc -> P.EVTable (trt ty) (map trt cc)
-
- Table x v -> P.ETType (trt x) (trt v)
- S f x -> P.ESelect (trt f) (trt x)
----- Alias c a t -> "{-" +++ prt c +++ "=" +++ "-}" +++ prt t
--- Alias c a t -> prt (Let (c,(Just a,t)) (Vr c)) -- thus Alias is only internal
-
- Let (x,(ma,b)) t ->
- P.ELet [maybe (P.LDDef x' b') (\ty -> P.LDFull x' (trt ty) b') ma] (trt t)
- where
- b' = trt b
- x' = [tri x]
-
- Empty -> P.EEmpty
- K [] -> P.EEmpty
- K a -> P.EString a
- C a b -> P.EConcat (trt a) (trt b)
-
- EInt i -> P.EInt i
- EFloat i -> P.EFloat i
-
- EPatt p -> P.EPatt (trp p)
- EPattType t -> P.EPattType (trt t)
-
- Glue a b -> P.EGlue (trt a) (trt b)
- Alts (t, tt) -> P.EPre (trt t) [P.Alt (trt v) (trt c) | (v,c) <- tt]
- FV ts -> P.EVariants $ map trt ts
- Strs tt -> P.EStrs $ map trt tt
- EData -> P.EData
- _ -> error $ "not yet" +++ show trm ----
-
-trp :: Patt -> P.Patt
-trp p = case p of
- PW -> P.PW
- PV s | isWildIdent s -> P.PW
- PV s -> P.PV $ tri s
- PC c [] -> P.PCon $ tri c
- PC c a -> P.PC (tri c) (map trp a)
- PP p c [] -> P.PQ (tri p) (tri c)
- PP p c a -> P.PQC (tri p) (tri c) (map trp a)
- PR r -> P.PR [P.PA [tri $ label2ident l] (trp p) | (l,p) <- r]
- PString s -> P.PStr s
- PInt i -> P.PInt i
- PFloat i -> P.PFloat i
- PT t p -> trp p ---- prParenth (prt p +++ ":" +++ prt t)
-
- PAs x p -> P.PAs (tri x) (trp p)
-
- PAlt p q -> P.PDisj (trp p) (trp q)
- PSeq p q -> P.PSeq (trp p) (trp q)
- PRep p -> P.PRep (trp p)
- PNeg p -> P.PNeg (trp p)
- PChar -> P.PChar
- PChars s -> P.PChars s
- PM m c -> P.PM (tri m) (tri c)
-
-
-trAssign (lab, (mty, t)) = maybe (P.LDDef x t') (\ty -> P.LDFull x (trt ty) t') mty
- where
- t' = trt t
- x = [tri $ label2ident lab]
-
-trLabelling (lab,ty) = P.LDDecl [tri $ label2ident lab] (trt ty)
-
-trCase (patt, trm) = P.Case (trp patt) (trt trm)
-trCases (patts,trm) = P.Case (foldl1 P.PDisj (map trp patts)) (trt trm)
-
-trDecl (x,ty) = P.DDDec [trb x] (trt ty)
-
-tri :: Ident -> P.PIdent
-tri = ppIdent . ident2bs
-
-ppIdent i = P.PIdent ((0,0),i)
-
-trb i = if isWildIdent i then P.BWild else P.BIdent (tri i)
-
-trLabel :: Label -> P.Label
-trLabel i = case i of
- LIdent s -> P.LIdent $ ppIdent s
- LVar i -> P.LVar $ toInteger i
-
-mkName :: P.PIdent -> P.Name
-mkName = P.IdentName
diff --git a/src-3.0/GF/Source/LexGF.hs b/src-3.0/GF/Source/LexGF.hs
deleted file mode 100644
index 1a2e507be..000000000
--- a/src-3.0/GF/Source/LexGF.hs
+++ /dev/null
@@ -1,350 +0,0 @@
-{-# OPTIONS -fglasgow-exts -cpp #-}
-{-# LINE 3 "LexGF.x" #-}
-
-{-# OPTIONS -fno-warn-incomplete-patterns #-}
-module GF.Source.LexGF where
-
-import GF.Source.SharedString
-import qualified Data.ByteString.Char8 as BS
-
-#if __GLASGOW_HASKELL__ >= 603
-#include "ghcconfig.h"
-#elif defined(__GLASGOW_HASKELL__)
-#include "config.h"
-#endif
-#if __GLASGOW_HASKELL__ >= 503
-import Data.Array
-import Data.Char (ord)
-import Data.Array.Base (unsafeAt)
-#else
-import Array
-import Char (ord)
-#endif
-#if __GLASGOW_HASKELL__ >= 503
-import GHC.Exts
-#else
-import GlaExts
-#endif
-alex_base :: AlexAddr
-alex_base = AlexA# "\x01\x00\x00\x00\x15\x00\x00\x00\x39\x00\x00\x00\x3a\x00\x00\x00\x18\x00\x00\x00\x19\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x44\x00\x00\x00\x45\x00\x00\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x1d\x00\x00\x00\x42\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\x27\x00\x00\x00\x13\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x00\x00\x2d\x00\x00\x00\x6c\x01\x00\x00\x3c\x02\x00\x00\x0c\x03\x00\x00\x00\x00\x00\x00\x17\x01\x00\x00\xe7\x01\x00\x00\xd5\x00\x00\x00\x35\x00\x00\x00\xe7\x00\x00\x00\xf2\x00\x00\x00\x1d\x01\x00\x00\xc2\x01\x00\x00\xcc\x01\x00\x00"#
-
-alex_table :: AlexAddr
-alex_table = AlexA# "\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0d\x00\x0e\x00\x1a\x00\x0e\x00\x0e\x00\x0e\x00\xff\xff\x14\x00\x0e\x00\x0e\x00\x0f\x00\x10\x00\x0e\x00\x05\x00\x0e\x00\x0e\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x0e\x00\x0e\x00\x0e\x00\x11\x00\x0e\x00\x0e\x00\x0e\x00\x04\x00\xff\xff\xff\xff\x02\x00\x02\x00\x09\x00\x09\x00\x09\x00\x0a\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0e\x00\x0e\x00\x0e\x00\x13\x00\x13\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x0e\x00\x0e\x00\xff\xff\x12\x00\xff\xff\x0d\x00\x20\x00\x00\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x00\x00\x00\x00\x09\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x0e\x00\x0e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x06\x00\x07\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x1b\x00\xff\xff\x00\x00\x00\x00\x17\x00\x1b\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\xff\xff\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x21\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x1c\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x18\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x00\x00\x00\xff\xff\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x1c\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x17\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x00\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x18\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x00\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x00\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00"#
-
-alex_check :: AlexAddr
-alex_check = AlexA# "\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x2d\x00\x0a\x00\x0a\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2a\x00\x3e\x00\x2b\x00\x27\x00\x27\x00\xff\xff\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x20\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x2d\x00\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\x7d\x00\x7d\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xd7\x00\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x22\x00\xf7\x00\xff\xff\xff\xff\x5f\x00\x27\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x74\x00\xff\xff\xff\xff\x65\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\x5c\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\x27\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\x5c\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\x27\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xff\xff\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\x27\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xff\xff\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xff\xff\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00"#
-
-alex_deflt :: AlexAddr
-alex_deflt = AlexA# "\x16\x00\xff\xff\x03\x00\x03\x00\xff\xff\xff\xff\x0b\x00\xff\xff\x0b\x00\x0b\x00\x0b\x00\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x15\x00\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
-
-alex_accept = listArray (0::Int,34) [[],[],[(AlexAccSkip)],[(AlexAccSkip)],[],[(AlexAcc (alex_action_3))],[(AlexAccSkip)],[(AlexAccSkip)],[],[],[],[],[(AlexAcc (alex_action_3))],[(AlexAccSkip)],[(AlexAcc (alex_action_3))],[(AlexAcc (alex_action_3))],[(AlexAcc (alex_action_3))],[(AlexAcc (alex_action_3))],[(AlexAcc (alex_action_3))],[(AlexAcc (alex_action_4))],[],[],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_7))],[],[],[],[(AlexAcc (alex_action_8))],[(AlexAcc (alex_action_9))],[(AlexAcc (alex_action_9))],[],[],[]]
-{-# LINE 37 "LexGF.x" #-}
-
-
-tok f p s = f p s
-
-share :: BS.ByteString -> BS.ByteString
-share = shareString
-
-data Tok =
- TS !BS.ByteString !Int -- reserved words and symbols
- | TL !BS.ByteString -- string literals
- | TI !BS.ByteString -- integer literals
- | TV !BS.ByteString -- identifiers
- | TD !BS.ByteString -- double precision float literals
- | TC !BS.ByteString -- character literals
- | T_LString !BS.ByteString
- | T_PIdent !BS.ByteString
-
- deriving (Eq,Show,Ord)
-
-data Token =
- PT Posn Tok
- | Err Posn
- deriving (Eq,Show,Ord)
-
-tokenPos (PT (Pn _ l _) _ :_) = "line " ++ show l
-tokenPos (Err (Pn _ l _) :_) = "line " ++ show l
-tokenPos _ = "end of file"
-
-posLineCol (Pn _ l c) = (l,c)
-mkPosToken t@(PT p _) = (posLineCol p, prToken t)
-
-prToken t = case t of
- PT _ (TS s _) -> s
- PT _ (TL s) -> s
- PT _ (TI s) -> s
- PT _ (TV s) -> s
- PT _ (TD s) -> s
- PT _ (TC s) -> s
- PT _ (T_LString s) -> s
- PT _ (T_PIdent s) -> s
-
-
-data BTree = N | B BS.ByteString Tok BTree BTree deriving (Show)
-
-eitherResIdent :: (BS.ByteString -> Tok) -> BS.ByteString -> Tok
-eitherResIdent tv s = treeFind resWords
- where
- treeFind N = tv s
- treeFind (B a t left right) | s < a = treeFind left
- | s > a = treeFind right
- | s == a = t
-
-resWords = b "def" 39 (b "=>" 20 (b "++" 10 (b "(" 5 (b "$" 3 (b "#" 2 (b "!" 1 N N) N) (b "%" 4 N N)) (b "**" 8 (b "*" 7 (b ")" 6 N N) N) (b "+" 9 N N))) (b "/" 15 (b "->" 13 (b "-" 12 (b "," 11 N N) N) (b "." 14 N N)) (b "<" 18 (b ";" 17 (b ":" 16 N N) N) (b "=" 19 N N)))) (b "[" 30 (b "PType" 25 (b "@" 23 (b "?" 22 (b ">" 21 N N) N) (b "Lin" 24 N N)) (b "Tok" 28 (b "Strs" 27 (b "Str" 26 N N) N) (b "Type" 29 N N))) (b "case" 35 (b "_" 33 (b "]" 32 (b "\\" 31 N N) N) (b "abstract" 34 N N)) (b "concrete" 37 (b "cat" 36 N N) (b "data" 38 N N))))) (b "package" 58 (b "let" 49 (b "in" 44 (b "fun" 42 (b "fn" 41 (b "flags" 40 N N) N) (b "grammar" 43 N N)) (b "instance" 47 (b "incomplete" 46 (b "include" 45 N N) N) (b "interface" 48 N N))) (b "of" 54 (b "lindef" 52 (b "lincat" 51 (b "lin" 50 N N) N) (b "lintype" 53 N N)) (b "oper" 56 (b "open" 55 N N) (b "out" 57 N N)))) (b "transfer" 68 (b "resource" 63 (b "pre" 61 (b "pattern" 60 (b "param" 59 N N) N) (b "printname" 62 N N)) (b "table" 66 (b "strs" 65 (b "reuse" 64 N N) N) (b "tokenizer" 67 N N))) (b "with" 73 (b "variants" 71 (b "var" 70 (b "union" 69 N N) N) (b "where" 72 N N)) (b "|" 75 (b "{" 74 N N) (b "}" 76 N N)))))
- where b s n = let bs = BS.pack s
- in B bs (TS bs n)
-
-unescapeInitTail :: BS.ByteString -> BS.ByteString
-unescapeInitTail = BS.pack . unesc . tail . BS.unpack where
- unesc s = case s of
- '\\':c:cs | elem c ['\"', '\\', '\''] -> c : unesc cs
- '\\':'n':cs -> '\n' : unesc cs
- '\\':'t':cs -> '\t' : unesc cs
- '"':[] -> []
- c:cs -> c : unesc cs
- _ -> []
-
--------------------------------------------------------------------
--- Alex wrapper code.
--- A modified "posn" wrapper.
--------------------------------------------------------------------
-
-data Posn = Pn !Int !Int !Int
- deriving (Eq, Show,Ord)
-
-alexStartPos :: Posn
-alexStartPos = Pn 0 1 1
-
-alexMove :: Posn -> Char -> Posn
-alexMove (Pn a l c) '\t' = Pn (a+1) l (((c+7) `div` 8)*8+1)
-alexMove (Pn a l c) '\n' = Pn (a+1) (l+1) 1
-alexMove (Pn a l c) _ = Pn (a+1) l (c+1)
-
-type AlexInput = (Posn, -- current position,
- Char, -- previous char
- BS.ByteString) -- current input string
-
-tokens :: BS.ByteString -> [Token]
-tokens str = go (alexStartPos, '\n', str)
- where
- go :: AlexInput -> [Token]
- go inp@(pos, _, str) =
- case alexScan inp 0 of
- AlexEOF -> []
- AlexError (pos, _, _) -> [Err pos]
- AlexSkip inp' len -> go inp'
- AlexToken inp' len act -> act pos (BS.take len str) : (go inp')
-
-alexGetChar :: AlexInput -> Maybe (Char,AlexInput)
-alexGetChar (p, _, s) =
- case BS.uncons s of
- Nothing -> Nothing
- Just (c,s) ->
- let p' = alexMove p c
- in p' `seq` Just (c, (p', c, s))
-
-alexInputPrevChar :: AlexInput -> Char
-alexInputPrevChar (p, c, s) = c
-
-alex_action_3 = tok (\p s -> PT p (eitherResIdent (T_PIdent . share) s))
-alex_action_4 = tok (\p s -> PT p (eitherResIdent (T_LString . share) s))
-alex_action_5 = tok (\p s -> PT p (eitherResIdent (T_PIdent . share) s))
-alex_action_6 = tok (\p s -> PT p (eitherResIdent (TV . share) s))
-alex_action_7 = tok (\p s -> PT p (TL $ share $ unescapeInitTail s))
-alex_action_8 = tok (\p s -> PT p (TI $ share s))
-alex_action_9 = tok (\p s -> PT p (TD $ share s))
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
-{-# LINE 1 "<built-in>" #-}
-{-# LINE 1 "<command line>" #-}
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
--- -----------------------------------------------------------------------------
--- ALEX TEMPLATE
---
--- This code is in the PUBLIC DOMAIN; you may copy it freely and use
--- it for any purpose whatsoever.
-
--- -----------------------------------------------------------------------------
--- INTERNALS and main scanner engine
-
-{-# LINE 35 "templates/GenericTemplate.hs" #-}
-
-{-# LINE 45 "templates/GenericTemplate.hs" #-}
-
-
-data AlexAddr = AlexA# Addr#
-
-#if __GLASGOW_HASKELL__ < 503
-uncheckedShiftL# = shiftL#
-#endif
-
-{-# INLINE alexIndexInt16OffAddr #-}
-alexIndexInt16OffAddr (AlexA# arr) off =
-#ifdef WORDS_BIGENDIAN
- narrow16Int# i
- where
- i = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)
- high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
- low = int2Word# (ord# (indexCharOffAddr# arr off'))
- off' = off *# 2#
-#else
- indexInt16OffAddr# arr off
-#endif
-
-
-
-
-
-{-# INLINE alexIndexInt32OffAddr #-}
-alexIndexInt32OffAddr (AlexA# arr) off =
-#ifdef WORDS_BIGENDIAN
- narrow32Int# i
- where
- i = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`
- (b2 `uncheckedShiftL#` 16#) `or#`
- (b1 `uncheckedShiftL#` 8#) `or#` b0)
- b3 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))
- b2 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))
- b1 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
- b0 = int2Word# (ord# (indexCharOffAddr# arr off'))
- off' = off *# 4#
-#else
- indexInt32OffAddr# arr off
-#endif
-
-
-
-
-
-#if __GLASGOW_HASKELL__ < 503
-quickIndex arr i = arr ! i
-#else
--- GHC >= 503, unsafeAt is available from Data.Array.Base.
-quickIndex = unsafeAt
-#endif
-
-
-
-
--- -----------------------------------------------------------------------------
--- Main lexing routines
-
-data AlexReturn a
- = AlexEOF
- | AlexError !AlexInput
- | AlexSkip !AlexInput !Int
- | AlexToken !AlexInput !Int a
-
--- alexScan :: AlexInput -> StartCode -> AlexReturn a
-alexScan input (I# (sc))
- = alexScanUser undefined input (I# (sc))
-
-alexScanUser user input (I# (sc))
- = case alex_scan_tkn user input 0# input sc AlexNone of
- (AlexNone, input') ->
- case alexGetChar input of
- Nothing ->
-
-
-
- AlexEOF
- Just _ ->
-
-
-
- AlexError input'
-
- (AlexLastSkip input len, _) ->
-
-
-
- AlexSkip input len
-
- (AlexLastAcc k input len, _) ->
-
-
-
- AlexToken input len k
-
-
--- Push the input through the DFA, remembering the most recent accepting
--- state it encountered.
-
-alex_scan_tkn user orig_input len input s last_acc =
- input `seq` -- strict in the input
- let
- new_acc = check_accs (alex_accept `quickIndex` (I# (s)))
- in
- new_acc `seq`
- case alexGetChar input of
- Nothing -> (new_acc, input)
- Just (c, new_input) ->
-
-
-
- let
- base = alexIndexInt32OffAddr alex_base s
- (I# (ord_c)) = ord c
- offset = (base +# ord_c)
- check = alexIndexInt16OffAddr alex_check offset
-
- new_s = if (offset >=# 0#) && (check ==# ord_c)
- then alexIndexInt16OffAddr alex_table offset
- else alexIndexInt16OffAddr alex_deflt s
- in
- case new_s of
- -1# -> (new_acc, input)
- -- on an error, we want to keep the input *before* the
- -- character that failed, not after.
- _ -> alex_scan_tkn user orig_input (len +# 1#)
- new_input new_s new_acc
-
- where
- check_accs [] = last_acc
- check_accs (AlexAcc a : _) = AlexLastAcc a input (I# (len))
- check_accs (AlexAccSkip : _) = AlexLastSkip input (I# (len))
- check_accs (AlexAccPred a pred : rest)
- | pred user orig_input (I# (len)) input
- = AlexLastAcc a input (I# (len))
- check_accs (AlexAccSkipPred pred : rest)
- | pred user orig_input (I# (len)) input
- = AlexLastSkip input (I# (len))
- check_accs (_ : rest) = check_accs rest
-
-data AlexLastAcc a
- = AlexNone
- | AlexLastAcc a !AlexInput !Int
- | AlexLastSkip !AlexInput !Int
-
-data AlexAcc a user
- = AlexAcc a
- | AlexAccSkip
- | AlexAccPred a (AlexAccPred user)
- | AlexAccSkipPred (AlexAccPred user)
-
-type AlexAccPred user = user -> AlexInput -> Int -> AlexInput -> Bool
-
--- -----------------------------------------------------------------------------
--- Predicates on a rule
-
-alexAndPred p1 p2 user in1 len in2
- = p1 user in1 len in2 && p2 user in1 len in2
-
---alexPrevCharIsPred :: Char -> AlexAccPred _
-alexPrevCharIs c _ input _ _ = c == alexInputPrevChar input
-
---alexPrevCharIsOneOfPred :: Array Char Bool -> AlexAccPred _
-alexPrevCharIsOneOf arr _ input _ _ = arr ! alexInputPrevChar input
-
---alexRightContext :: Int -> AlexAccPred _
-alexRightContext (I# (sc)) user _ _ input =
- case alex_scan_tkn user input 0# input sc AlexNone of
- (AlexNone, _) -> False
- _ -> True
- -- TODO: there's no need to find the longest
- -- match when checking the right context, just
- -- the first match will do.
-
--- used by wrappers
-iUnbox (I# (i)) = i
diff --git a/src-3.0/GF/Source/LexGF.x b/src-3.0/GF/Source/LexGF.x
deleted file mode 100644
index 15671c9de..000000000
--- a/src-3.0/GF/Source/LexGF.x
+++ /dev/null
@@ -1,144 +0,0 @@
--- -*- haskell -*-
--- This Alex file was machine-generated by the BNF converter
-{
-{-# OPTIONS -fno-warn-incomplete-patterns #-}
-module GF.Source.LexGF where
-
-import GF.Source.SharedString
-import qualified Data.ByteString.Char8 as BS
-}
-
-
-$l = [a-zA-Z\192 - \255] # [\215 \247] -- isolatin1 letter FIXME
-$c = [A-Z\192-\221] # [\215] -- capital isolatin1 letter FIXME
-$s = [a-z\222-\255] # [\247] -- small isolatin1 letter FIXME
-$d = [0-9] -- digit
-$i = [$l $d _ '] -- identifier character
-$u = [\0-\255] -- universal: any character
-
-@rsyms = -- symbols and non-identifier-like reserved words
- \; | \= | \{ | \} | \( | \) | \* \* | \: | \- \> | \, | \[ | \] | \- | \. | \| | \% | \? | \< | \> | \@ | \# | \! | \* | \+ | \+ \+ | \\ | \= \> | \_ | \$ | \/
-
-:-
-"--" [.]* ; -- Toss single line comments
-"{-" ([$u # \-] | \- [$u # \}])* ("-")+ "}" ;
-
-$white+ ;
-@rsyms { tok (\p s -> PT p (eitherResIdent (T_PIdent . share) s)) }
-\' ($u # \')* \' { tok (\p s -> PT p (eitherResIdent (T_LString . share) s)) }
-(\_ | $l)($l | $d | \_ | \')* { tok (\p s -> PT p (eitherResIdent (T_PIdent . share) s)) }
-
-$l $i* { tok (\p s -> PT p (eitherResIdent (TV . share) s)) }
-\" ([$u # [\" \\ \n]] | (\\ (\" | \\ | \' | n | t)))* \"{ tok (\p s -> PT p (TL $ share $ unescapeInitTail s)) }
-
-$d+ { tok (\p s -> PT p (TI $ share s)) }
-$d+ \. $d+ (e (\-)? $d+)? { tok (\p s -> PT p (TD $ share s)) }
-
-{
-
-tok f p s = f p s
-
-share :: BS.ByteString -> BS.ByteString
-share = shareString
-
-data Tok =
- TS !BS.ByteString !Int -- reserved words and symbols
- | TL !BS.ByteString -- string literals
- | TI !BS.ByteString -- integer literals
- | TV !BS.ByteString -- identifiers
- | TD !BS.ByteString -- double precision float literals
- | TC !BS.ByteString -- character literals
- | T_LString !BS.ByteString
- | T_PIdent !BS.ByteString
-
- deriving (Eq,Show,Ord)
-
-data Token =
- PT Posn Tok
- | Err Posn
- deriving (Eq,Show,Ord)
-
-tokenPos (PT (Pn _ l _) _ :_) = "line " ++ show l
-tokenPos (Err (Pn _ l _) :_) = "line " ++ show l
-tokenPos _ = "end of file"
-
-posLineCol (Pn _ l c) = (l,c)
-mkPosToken t@(PT p _) = (posLineCol p, prToken t)
-
-prToken t = case t of
- PT _ (TS s _) -> s
- PT _ (TL s) -> s
- PT _ (TI s) -> s
- PT _ (TV s) -> s
- PT _ (TD s) -> s
- PT _ (TC s) -> s
- PT _ (T_LString s) -> s
- PT _ (T_PIdent s) -> s
-
-
-data BTree = N | B BS.ByteString Tok BTree BTree deriving (Show)
-
-eitherResIdent :: (BS.ByteString -> Tok) -> BS.ByteString -> Tok
-eitherResIdent tv s = treeFind resWords
- where
- treeFind N = tv s
- treeFind (B a t left right) | s < a = treeFind left
- | s > a = treeFind right
- | s == a = t
-
-resWords = b "def" 39 (b "=>" 20 (b "++" 10 (b "(" 5 (b "$" 3 (b "#" 2 (b "!" 1 N N) N) (b "%" 4 N N)) (b "**" 8 (b "*" 7 (b ")" 6 N N) N) (b "+" 9 N N))) (b "/" 15 (b "->" 13 (b "-" 12 (b "," 11 N N) N) (b "." 14 N N)) (b "<" 18 (b ";" 17 (b ":" 16 N N) N) (b "=" 19 N N)))) (b "[" 30 (b "PType" 25 (b "@" 23 (b "?" 22 (b ">" 21 N N) N) (b "Lin" 24 N N)) (b "Tok" 28 (b "Strs" 27 (b "Str" 26 N N) N) (b "Type" 29 N N))) (b "case" 35 (b "_" 33 (b "]" 32 (b "\\" 31 N N) N) (b "abstract" 34 N N)) (b "concrete" 37 (b "cat" 36 N N) (b "data" 38 N N))))) (b "package" 58 (b "let" 49 (b "in" 44 (b "fun" 42 (b "fn" 41 (b "flags" 40 N N) N) (b "grammar" 43 N N)) (b "instance" 47 (b "incomplete" 46 (b "include" 45 N N) N) (b "interface" 48 N N))) (b "of" 54 (b "lindef" 52 (b "lincat" 51 (b "lin" 50 N N) N) (b "lintype" 53 N N)) (b "oper" 56 (b "open" 55 N N) (b "out" 57 N N)))) (b "transfer" 68 (b "resource" 63 (b "pre" 61 (b "pattern" 60 (b "param" 59 N N) N) (b "printname" 62 N N)) (b "table" 66 (b "strs" 65 (b "reuse" 64 N N) N) (b "tokenizer" 67 N N))) (b "with" 73 (b "variants" 71 (b "var" 70 (b "union" 69 N N) N) (b "where" 72 N N)) (b "|" 75 (b "{" 74 N N) (b "}" 76 N N)))))
- where b s n = let bs = BS.pack s
- in B bs (TS bs n)
-
-unescapeInitTail :: BS.ByteString -> BS.ByteString
-unescapeInitTail = BS.pack . unesc . tail . BS.unpack where
- unesc s = case s of
- '\\':c:cs | elem c ['\"', '\\', '\''] -> c : unesc cs
- '\\':'n':cs -> '\n' : unesc cs
- '\\':'t':cs -> '\t' : unesc cs
- '"':[] -> []
- c:cs -> c : unesc cs
- _ -> []
-
--------------------------------------------------------------------
--- Alex wrapper code.
--- A modified "posn" wrapper.
--------------------------------------------------------------------
-
-data Posn = Pn !Int !Int !Int
- deriving (Eq, Show,Ord)
-
-alexStartPos :: Posn
-alexStartPos = Pn 0 1 1
-
-alexMove :: Posn -> Char -> Posn
-alexMove (Pn a l c) '\t' = Pn (a+1) l (((c+7) `div` 8)*8+1)
-alexMove (Pn a l c) '\n' = Pn (a+1) (l+1) 1
-alexMove (Pn a l c) _ = Pn (a+1) l (c+1)
-
-type AlexInput = (Posn, -- current position,
- Char, -- previous char
- BS.ByteString) -- current input string
-
-tokens :: BS.ByteString -> [Token]
-tokens str = go (alexStartPos, '\n', str)
- where
- go :: AlexInput -> [Token]
- go inp@(pos, _, str) =
- case alexScan inp 0 of
- AlexEOF -> []
- AlexError (pos, _, _) -> [Err pos]
- AlexSkip inp' len -> go inp'
- AlexToken inp' len act -> act pos (BS.take len str) : (go inp')
-
-alexGetChar :: AlexInput -> Maybe (Char,AlexInput)
-alexGetChar (p, _, s) =
- case BS.uncons s of
- Nothing -> Nothing
- Just (c,s) ->
- let p' = alexMove p c
- in p' `seq` Just (c, (p', c, s))
-
-alexInputPrevChar :: AlexInput -> Char
-alexInputPrevChar (p, c, s) = c
-}
diff --git a/src-3.0/GF/Source/ParGF.hs b/src-3.0/GF/Source/ParGF.hs
deleted file mode 100644
index 863e6c7e9..000000000
--- a/src-3.0/GF/Source/ParGF.hs
+++ /dev/null
@@ -1,7843 +0,0 @@
-{-# OPTIONS -fglasgow-exts -cpp #-}
-{-# OPTIONS -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-}
-module GF.Source.ParGF where
-import GF.Source.AbsGF
-import GF.Source.LexGF
-import GF.Data.ErrM
-import qualified Data.ByteString.Char8 as BS
-#if __GLASGOW_HASKELL__ >= 503
-import GHC.Exts
-#else
-import GlaExts
-#endif
-
--- parser produced by Happy Version 1.17
-
-data HappyAbsSyn
- = HappyTerminal Token
- | HappyErrorToken Int
- | HappyAbsSyn8 (Integer)
- | HappyAbsSyn9 (String)
- | HappyAbsSyn10 (Double)
- | HappyAbsSyn11 (LString)
- | HappyAbsSyn12 (PIdent)
- | HappyAbsSyn13 (Grammar)
- | HappyAbsSyn14 ([ModDef])
- | HappyAbsSyn15 (ModDef)
- | HappyAbsSyn16 (ConcSpec)
- | HappyAbsSyn17 ([ConcSpec])
- | HappyAbsSyn18 (ConcExp)
- | HappyAbsSyn19 ([Transfer])
- | HappyAbsSyn20 (Transfer)
- | HappyAbsSyn22 (ModBody)
- | HappyAbsSyn23 (ModType)
- | HappyAbsSyn25 ([TopDef])
- | HappyAbsSyn26 (Extend)
- | HappyAbsSyn27 ([Open])
- | HappyAbsSyn28 (Opens)
- | HappyAbsSyn29 (Open)
- | HappyAbsSyn30 (ComplMod)
- | HappyAbsSyn31 (QualOpen)
- | HappyAbsSyn32 ([Included])
- | HappyAbsSyn33 (Included)
- | HappyAbsSyn34 (Def)
- | HappyAbsSyn35 (TopDef)
- | HappyAbsSyn36 (CatDef)
- | HappyAbsSyn37 (FunDef)
- | HappyAbsSyn38 (DataDef)
- | HappyAbsSyn39 (DataConstr)
- | HappyAbsSyn40 ([DataConstr])
- | HappyAbsSyn41 (ParDef)
- | HappyAbsSyn42 (ParConstr)
- | HappyAbsSyn43 (PrintDef)
- | HappyAbsSyn44 (FlagDef)
- | HappyAbsSyn45 ([Def])
- | HappyAbsSyn46 ([CatDef])
- | HappyAbsSyn47 ([FunDef])
- | HappyAbsSyn48 ([DataDef])
- | HappyAbsSyn49 ([ParDef])
- | HappyAbsSyn50 ([PrintDef])
- | HappyAbsSyn51 ([FlagDef])
- | HappyAbsSyn52 ([ParConstr])
- | HappyAbsSyn53 ([PIdent])
- | HappyAbsSyn54 (Name)
- | HappyAbsSyn55 ([Name])
- | HappyAbsSyn56 (LocDef)
- | HappyAbsSyn57 ([LocDef])
- | HappyAbsSyn58 (Exp)
- | HappyAbsSyn65 ([Exp])
- | HappyAbsSyn66 (Exps)
- | HappyAbsSyn67 (Patt)
- | HappyAbsSyn70 (PattAss)
- | HappyAbsSyn71 (Label)
- | HappyAbsSyn72 (Sort)
- | HappyAbsSyn73 ([PattAss])
- | HappyAbsSyn74 ([Patt])
- | HappyAbsSyn75 (Bind)
- | HappyAbsSyn76 ([Bind])
- | HappyAbsSyn77 (Decl)
- | HappyAbsSyn78 (TupleComp)
- | HappyAbsSyn79 (PattTupleComp)
- | HappyAbsSyn80 ([TupleComp])
- | HappyAbsSyn81 ([PattTupleComp])
- | HappyAbsSyn82 (Case)
- | HappyAbsSyn83 ([Case])
- | HappyAbsSyn84 (Equation)
- | HappyAbsSyn85 ([Equation])
- | HappyAbsSyn86 (Altern)
- | HappyAbsSyn87 ([Altern])
- | HappyAbsSyn88 (DDecl)
- | HappyAbsSyn89 ([DDecl])
- | HappyAbsSyn90 (OldGrammar)
- | HappyAbsSyn91 (Include)
- | HappyAbsSyn92 (FileName)
- | HappyAbsSyn93 ([FileName])
-
-type HappyReduction m =
- Int#
- -> (Token)
- -> HappyState (Token) (HappyStk HappyAbsSyn -> [(Token)] -> m HappyAbsSyn)
- -> [HappyState (Token) (HappyStk HappyAbsSyn -> [(Token)] -> m HappyAbsSyn)]
- -> HappyStk HappyAbsSyn
- -> [(Token)] -> m HappyAbsSyn
-
-action_0,
- action_1,
- action_2,
- action_3,
- action_4,
- action_5,
- action_6,
- action_7,
- action_8,
- action_9,
- action_10,
- action_11,
- action_12,
- action_13,
- action_14,
- action_15,
- action_16,
- action_17,
- action_18,
- action_19,
- action_20,
- action_21,
- action_22,
- action_23,
- action_24,
- action_25,
- action_26,
- action_27,
- action_28,
- action_29,
- action_30,
- action_31,
- action_32,
- action_33,
- action_34,
- action_35,
- action_36,
- action_37,
- action_38,
- action_39,
- action_40,
- action_41,
- action_42,
- action_43,
- action_44,
- action_45,
- action_46,
- action_47,
- action_48,
- action_49,
- action_50,
- action_51,
- action_52,
- action_53,
- action_54,
- action_55,
- action_56,
- action_57,
- action_58,
- action_59,
- action_60,
- action_61,
- action_62,
- action_63,
- action_64,
- action_65,
- action_66,
- action_67,
- action_68,
- action_69,
- action_70,
- action_71,
- action_72,
- action_73,
- action_74,
- action_75,
- action_76,
- action_77,
- action_78,
- action_79,
- action_80,
- action_81,
- action_82,
- action_83,
- action_84,
- action_85,
- action_86,
- action_87,
- action_88,
- action_89,
- action_90,
- action_91,
- action_92,
- action_93,
- action_94,
- action_95,
- action_96,
- action_97,
- action_98,
- action_99,
- action_100,
- action_101,
- action_102,
- action_103,
- action_104,
- action_105,
- action_106,
- action_107,
- action_108,
- action_109,
- action_110,
- action_111,
- action_112,
- action_113,
- action_114,
- action_115,
- action_116,
- action_117,
- action_118,
- action_119,
- action_120,
- action_121,
- action_122,
- action_123,
- action_124,
- action_125,
- action_126,
- action_127,
- action_128,
- action_129,
- action_130,
- action_131,
- action_132,
- action_133,
- action_134,
- action_135,
- action_136,
- action_137,
- action_138,
- action_139,
- action_140,
- action_141,
- action_142,
- action_143,
- action_144,
- action_145,
- action_146,
- action_147,
- action_148,
- action_149,
- action_150,
- action_151,
- action_152,
- action_153,
- action_154,
- action_155,
- action_156,
- action_157,
- action_158,
- action_159,
- action_160,
- action_161,
- action_162,
- action_163,
- action_164,
- action_165,
- action_166,
- action_167,
- action_168,
- action_169,
- action_170,
- action_171,
- action_172,
- action_173,
- action_174,
- action_175,
- action_176,
- action_177,
- action_178,
- action_179,
- action_180,
- action_181,
- action_182,
- action_183,
- action_184,
- action_185,
- action_186,
- action_187,
- action_188,
- action_189,
- action_190,
- action_191,
- action_192,
- action_193,
- action_194,
- action_195,
- action_196,
- action_197,
- action_198,
- action_199,
- action_200,
- action_201,
- action_202,
- action_203,
- action_204,
- action_205,
- action_206,
- action_207,
- action_208,
- action_209,
- action_210,
- action_211,
- action_212,
- action_213,
- action_214,
- action_215,
- action_216,
- action_217,
- action_218,
- action_219,
- action_220,
- action_221,
- action_222,
- action_223,
- action_224,
- action_225,
- action_226,
- action_227,
- action_228,
- action_229,
- action_230,
- action_231,
- action_232,
- action_233,
- action_234,
- action_235,
- action_236,
- action_237,
- action_238,
- action_239,
- action_240,
- action_241,
- action_242,
- action_243,
- action_244,
- action_245,
- action_246,
- action_247,
- action_248,
- action_249,
- action_250,
- action_251,
- action_252,
- action_253,
- action_254,
- action_255,
- action_256,
- action_257,
- action_258,
- action_259,
- action_260,
- action_261,
- action_262,
- action_263,
- action_264,
- action_265,
- action_266,
- action_267,
- action_268,
- action_269,
- action_270,
- action_271,
- action_272,
- action_273,
- action_274,
- action_275,
- action_276,
- action_277,
- action_278,
- action_279,
- action_280,
- action_281,
- action_282,
- action_283,
- action_284,
- action_285,
- action_286,
- action_287,
- action_288,
- action_289,
- action_290,
- action_291,
- action_292,
- action_293,
- action_294,
- action_295,
- action_296,
- action_297,
- action_298,
- action_299,
- action_300,
- action_301,
- action_302,
- action_303,
- action_304,
- action_305,
- action_306,
- action_307,
- action_308,
- action_309,
- action_310,
- action_311,
- action_312,
- action_313,
- action_314,
- action_315,
- action_316,
- action_317,
- action_318,
- action_319,
- action_320,
- action_321,
- action_322,
- action_323,
- action_324,
- action_325,
- action_326,
- action_327,
- action_328,
- action_329,
- action_330,
- action_331,
- action_332,
- action_333,
- action_334,
- action_335,
- action_336,
- action_337,
- action_338,
- action_339,
- action_340,
- action_341,
- action_342,
- action_343,
- action_344,
- action_345,
- action_346,
- action_347,
- action_348,
- action_349,
- action_350,
- action_351,
- action_352,
- action_353,
- action_354,
- action_355,
- action_356,
- action_357,
- action_358,
- action_359,
- action_360,
- action_361,
- action_362,
- action_363,
- action_364,
- action_365,
- action_366,
- action_367,
- action_368,
- action_369,
- action_370,
- action_371,
- action_372,
- action_373,
- action_374,
- action_375,
- action_376,
- action_377,
- action_378,
- action_379,
- action_380,
- action_381,
- action_382,
- action_383,
- action_384,
- action_385,
- action_386,
- action_387,
- action_388,
- action_389,
- action_390,
- action_391,
- action_392,
- action_393,
- action_394,
- action_395,
- action_396,
- action_397,
- action_398,
- action_399,
- action_400,
- action_401,
- action_402,
- action_403,
- action_404,
- action_405,
- action_406,
- action_407,
- action_408,
- action_409,
- action_410,
- action_411,
- action_412,
- action_413,
- action_414,
- action_415,
- action_416,
- action_417,
- action_418,
- action_419,
- action_420,
- action_421,
- action_422,
- action_423,
- action_424,
- action_425,
- action_426,
- action_427,
- action_428,
- action_429,
- action_430,
- action_431,
- action_432,
- action_433,
- action_434,
- action_435,
- action_436,
- action_437,
- action_438,
- action_439,
- action_440,
- action_441,
- action_442,
- action_443,
- action_444,
- action_445,
- action_446,
- action_447,
- action_448,
- action_449,
- action_450,
- action_451,
- action_452,
- action_453,
- action_454,
- action_455,
- action_456,
- action_457,
- action_458,
- action_459,
- action_460,
- action_461,
- action_462,
- action_463,
- action_464,
- action_465,
- action_466,
- action_467,
- action_468,
- action_469,
- action_470,
- action_471,
- action_472,
- action_473,
- action_474,
- action_475,
- action_476,
- action_477,
- action_478,
- action_479,
- action_480,
- action_481,
- action_482,
- action_483,
- action_484,
- action_485,
- action_486,
- action_487,
- action_488,
- action_489,
- action_490,
- action_491,
- action_492,
- action_493,
- action_494,
- action_495,
- action_496,
- action_497,
- action_498,
- action_499,
- action_500,
- action_501,
- action_502,
- action_503,
- action_504,
- action_505,
- action_506,
- action_507,
- action_508,
- action_509,
- action_510,
- action_511,
- action_512,
- action_513,
- action_514,
- action_515,
- action_516,
- action_517,
- action_518,
- action_519,
- action_520,
- action_521,
- action_522,
- action_523,
- action_524,
- action_525,
- action_526,
- action_527,
- action_528,
- action_529,
- action_530,
- action_531,
- action_532,
- action_533,
- action_534,
- action_535,
- action_536,
- action_537,
- action_538,
- action_539,
- action_540,
- action_541,
- action_542,
- action_543,
- action_544,
- action_545,
- action_546,
- action_547 :: () => Int# -> HappyReduction (Err)
-
-happyReduce_5,
- happyReduce_6,
- happyReduce_7,
- happyReduce_8,
- happyReduce_9,
- happyReduce_10,
- happyReduce_11,
- happyReduce_12,
- happyReduce_13,
- happyReduce_14,
- happyReduce_15,
- happyReduce_16,
- happyReduce_17,
- happyReduce_18,
- happyReduce_19,
- happyReduce_20,
- happyReduce_21,
- happyReduce_22,
- happyReduce_23,
- happyReduce_24,
- happyReduce_25,
- happyReduce_26,
- happyReduce_27,
- happyReduce_28,
- happyReduce_29,
- happyReduce_30,
- happyReduce_31,
- happyReduce_32,
- happyReduce_33,
- happyReduce_34,
- happyReduce_35,
- happyReduce_36,
- happyReduce_37,
- happyReduce_38,
- happyReduce_39,
- happyReduce_40,
- happyReduce_41,
- happyReduce_42,
- happyReduce_43,
- happyReduce_44,
- happyReduce_45,
- happyReduce_46,
- happyReduce_47,
- happyReduce_48,
- happyReduce_49,
- happyReduce_50,
- happyReduce_51,
- happyReduce_52,
- happyReduce_53,
- happyReduce_54,
- happyReduce_55,
- happyReduce_56,
- happyReduce_57,
- happyReduce_58,
- happyReduce_59,
- happyReduce_60,
- happyReduce_61,
- happyReduce_62,
- happyReduce_63,
- happyReduce_64,
- happyReduce_65,
- happyReduce_66,
- happyReduce_67,
- happyReduce_68,
- happyReduce_69,
- happyReduce_70,
- happyReduce_71,
- happyReduce_72,
- happyReduce_73,
- happyReduce_74,
- happyReduce_75,
- happyReduce_76,
- happyReduce_77,
- happyReduce_78,
- happyReduce_79,
- happyReduce_80,
- happyReduce_81,
- happyReduce_82,
- happyReduce_83,
- happyReduce_84,
- happyReduce_85,
- happyReduce_86,
- happyReduce_87,
- happyReduce_88,
- happyReduce_89,
- happyReduce_90,
- happyReduce_91,
- happyReduce_92,
- happyReduce_93,
- happyReduce_94,
- happyReduce_95,
- happyReduce_96,
- happyReduce_97,
- happyReduce_98,
- happyReduce_99,
- happyReduce_100,
- happyReduce_101,
- happyReduce_102,
- happyReduce_103,
- happyReduce_104,
- happyReduce_105,
- happyReduce_106,
- happyReduce_107,
- happyReduce_108,
- happyReduce_109,
- happyReduce_110,
- happyReduce_111,
- happyReduce_112,
- happyReduce_113,
- happyReduce_114,
- happyReduce_115,
- happyReduce_116,
- happyReduce_117,
- happyReduce_118,
- happyReduce_119,
- happyReduce_120,
- happyReduce_121,
- happyReduce_122,
- happyReduce_123,
- happyReduce_124,
- happyReduce_125,
- happyReduce_126,
- happyReduce_127,
- happyReduce_128,
- happyReduce_129,
- happyReduce_130,
- happyReduce_131,
- happyReduce_132,
- happyReduce_133,
- happyReduce_134,
- happyReduce_135,
- happyReduce_136,
- happyReduce_137,
- happyReduce_138,
- happyReduce_139,
- happyReduce_140,
- happyReduce_141,
- happyReduce_142,
- happyReduce_143,
- happyReduce_144,
- happyReduce_145,
- happyReduce_146,
- happyReduce_147,
- happyReduce_148,
- happyReduce_149,
- happyReduce_150,
- happyReduce_151,
- happyReduce_152,
- happyReduce_153,
- happyReduce_154,
- happyReduce_155,
- happyReduce_156,
- happyReduce_157,
- happyReduce_158,
- happyReduce_159,
- happyReduce_160,
- happyReduce_161,
- happyReduce_162,
- happyReduce_163,
- happyReduce_164,
- happyReduce_165,
- happyReduce_166,
- happyReduce_167,
- happyReduce_168,
- happyReduce_169,
- happyReduce_170,
- happyReduce_171,
- happyReduce_172,
- happyReduce_173,
- happyReduce_174,
- happyReduce_175,
- happyReduce_176,
- happyReduce_177,
- happyReduce_178,
- happyReduce_179,
- happyReduce_180,
- happyReduce_181,
- happyReduce_182,
- happyReduce_183,
- happyReduce_184,
- happyReduce_185,
- happyReduce_186,
- happyReduce_187,
- happyReduce_188,
- happyReduce_189,
- happyReduce_190,
- happyReduce_191,
- happyReduce_192,
- happyReduce_193,
- happyReduce_194,
- happyReduce_195,
- happyReduce_196,
- happyReduce_197,
- happyReduce_198,
- happyReduce_199,
- happyReduce_200,
- happyReduce_201,
- happyReduce_202,
- happyReduce_203,
- happyReduce_204,
- happyReduce_205,
- happyReduce_206,
- happyReduce_207,
- happyReduce_208,
- happyReduce_209,
- happyReduce_210,
- happyReduce_211,
- happyReduce_212,
- happyReduce_213,
- happyReduce_214,
- happyReduce_215,
- happyReduce_216,
- happyReduce_217,
- happyReduce_218,
- happyReduce_219,
- happyReduce_220,
- happyReduce_221,
- happyReduce_222,
- happyReduce_223,
- happyReduce_224,
- happyReduce_225,
- happyReduce_226,
- happyReduce_227,
- happyReduce_228,
- happyReduce_229,
- happyReduce_230,
- happyReduce_231,
- happyReduce_232,
- happyReduce_233,
- happyReduce_234,
- happyReduce_235,
- happyReduce_236,
- happyReduce_237,
- happyReduce_238,
- happyReduce_239,
- happyReduce_240,
- happyReduce_241,
- happyReduce_242,
- happyReduce_243,
- happyReduce_244,
- happyReduce_245,
- happyReduce_246,
- happyReduce_247,
- happyReduce_248,
- happyReduce_249,
- happyReduce_250,
- happyReduce_251,
- happyReduce_252,
- happyReduce_253,
- happyReduce_254,
- happyReduce_255,
- happyReduce_256,
- happyReduce_257,
- happyReduce_258,
- happyReduce_259,
- happyReduce_260,
- happyReduce_261,
- happyReduce_262,
- happyReduce_263,
- happyReduce_264,
- happyReduce_265,
- happyReduce_266,
- happyReduce_267,
- happyReduce_268,
- happyReduce_269,
- happyReduce_270,
- happyReduce_271,
- happyReduce_272,
- happyReduce_273,
- happyReduce_274 :: () => HappyReduction (Err)
-
-action_0 (13#) = happyGoto action_58
-action_0 (14#) = happyGoto action_59
-action_0 x = happyTcHack x happyReduce_11
-
-action_1 (136#) = happyShift action_57
-action_1 (139#) = happyShift action_51
-action_1 (15#) = happyGoto action_55
-action_1 (30#) = happyGoto action_56
-action_1 x = happyTcHack x happyReduce_60
-
-action_2 (138#) = happyShift action_54
-action_2 (90#) = happyGoto action_52
-action_2 (91#) = happyGoto action_53
-action_2 x = happyTcHack x happyReduce_265
-
-action_3 (139#) = happyShift action_51
-action_3 (21#) = happyGoto action_49
-action_3 (30#) = happyGoto action_50
-action_3 x = happyTcHack x happyReduce_60
-
-action_4 (95#) = happyShift action_21
-action_4 (97#) = happyShift action_22
-action_4 (98#) = happyShift action_23
-action_4 (111#) = happyShift action_24
-action_4 (115#) = happyShift action_25
-action_4 (117#) = happyShift action_26
-action_4 (118#) = happyShift action_27
-action_4 (119#) = happyShift action_28
-action_4 (120#) = happyShift action_29
-action_4 (121#) = happyShift action_30
-action_4 (122#) = happyShift action_31
-action_4 (123#) = happyShift action_32
-action_4 (124#) = happyShift action_33
-action_4 (128#) = happyShift action_34
-action_4 (131#) = happyShift action_35
-action_4 (134#) = happyShift action_36
-action_4 (137#) = happyShift action_37
-action_4 (142#) = happyShift action_38
-action_4 (153#) = happyShift action_39
-action_4 (154#) = happyShift action_40
-action_4 (158#) = happyShift action_41
-action_4 (159#) = happyShift action_42
-action_4 (164#) = happyShift action_43
-action_4 (167#) = happyShift action_44
-action_4 (170#) = happyShift action_6
-action_4 (171#) = happyShift action_45
-action_4 (172#) = happyShift action_46
-action_4 (173#) = happyShift action_47
-action_4 (174#) = happyShift action_48
-action_4 (8#) = happyGoto action_7
-action_4 (9#) = happyGoto action_8
-action_4 (10#) = happyGoto action_9
-action_4 (11#) = happyGoto action_10
-action_4 (12#) = happyGoto action_11
-action_4 (58#) = happyGoto action_12
-action_4 (59#) = happyGoto action_13
-action_4 (60#) = happyGoto action_14
-action_4 (61#) = happyGoto action_15
-action_4 (62#) = happyGoto action_16
-action_4 (63#) = happyGoto action_17
-action_4 (64#) = happyGoto action_18
-action_4 (72#) = happyGoto action_19
-action_4 (77#) = happyGoto action_20
-action_4 x = happyTcHack x happyFail
-
-action_5 (170#) = happyShift action_6
-action_5 x = happyTcHack x happyFail
-
-action_6 x = happyTcHack x happyReduce_5
-
-action_7 x = happyTcHack x happyReduce_145
-
-action_8 x = happyTcHack x happyReduce_144
-
-action_9 x = happyTcHack x happyReduce_146
-
-action_10 x = happyTcHack x happyReduce_157
-
-action_11 (116#) = happyShift action_137
-action_11 x = happyTcHack x happyReduce_140
-
-action_12 x = happyTcHack x happyReduce_161
-
-action_13 (107#) = happyShift action_136
-action_13 x = happyTcHack x happyReduce_173
-
-action_14 (97#) = happyShift action_22
-action_14 (98#) = happyShift action_87
-action_14 (106#) = happyReduce_240
-action_14 (111#) = happyShift action_24
-action_14 (115#) = happyShift action_25
-action_14 (118#) = happyShift action_27
-action_14 (119#) = happyShift action_28
-action_14 (120#) = happyShift action_29
-action_14 (121#) = happyShift action_30
-action_14 (122#) = happyShift action_31
-action_14 (123#) = happyShift action_32
-action_14 (131#) = happyShift action_35
-action_14 (167#) = happyShift action_44
-action_14 (170#) = happyShift action_6
-action_14 (171#) = happyShift action_45
-action_14 (172#) = happyShift action_46
-action_14 (173#) = happyShift action_47
-action_14 (174#) = happyShift action_48
-action_14 (8#) = happyGoto action_7
-action_14 (9#) = happyGoto action_8
-action_14 (10#) = happyGoto action_9
-action_14 (11#) = happyGoto action_10
-action_14 (12#) = happyGoto action_84
-action_14 (58#) = happyGoto action_12
-action_14 (59#) = happyGoto action_135
-action_14 (72#) = happyGoto action_19
-action_14 x = happyTcHack x happyReduce_178
-
-action_15 (94#) = happyShift action_130
-action_15 (100#) = happyShift action_131
-action_15 (101#) = happyShift action_132
-action_15 (113#) = happyShift action_133
-action_15 (165#) = happyShift action_134
-action_15 x = happyTcHack x happyReduce_192
-
-action_16 (103#) = happyShift action_129
-action_16 x = happyTcHack x happyReduce_191
-
-action_17 (176#) = happyAccept
-action_17 x = happyTcHack x happyFail
-
-action_18 (102#) = happyShift action_128
-action_18 x = happyTcHack x happyReduce_180
-
-action_19 x = happyTcHack x happyReduce_143
-
-action_20 (106#) = happyShift action_127
-action_20 x = happyTcHack x happyFail
-
-action_21 (95#) = happyShift action_120
-action_21 (98#) = happyShift action_121
-action_21 (111#) = happyShift action_122
-action_21 (115#) = happyShift action_123
-action_21 (123#) = happyShift action_124
-action_21 (126#) = happyShift action_125
-action_21 (167#) = happyShift action_126
-action_21 (170#) = happyShift action_6
-action_21 (171#) = happyShift action_45
-action_21 (172#) = happyShift action_46
-action_21 (174#) = happyShift action_48
-action_21 (8#) = happyGoto action_115
-action_21 (9#) = happyGoto action_116
-action_21 (10#) = happyGoto action_117
-action_21 (12#) = happyGoto action_118
-action_21 (67#) = happyGoto action_119
-action_21 x = happyTcHack x happyFail
-
-action_22 (174#) = happyShift action_48
-action_22 (12#) = happyGoto action_114
-action_22 x = happyTcHack x happyFail
-
-action_23 (95#) = happyShift action_21
-action_23 (97#) = happyShift action_22
-action_23 (98#) = happyShift action_23
-action_23 (111#) = happyShift action_24
-action_23 (115#) = happyShift action_25
-action_23 (117#) = happyShift action_26
-action_23 (118#) = happyShift action_27
-action_23 (119#) = happyShift action_28
-action_23 (120#) = happyShift action_29
-action_23 (121#) = happyShift action_30
-action_23 (122#) = happyShift action_31
-action_23 (123#) = happyShift action_32
-action_23 (124#) = happyShift action_33
-action_23 (126#) = happyShift action_102
-action_23 (128#) = happyShift action_34
-action_23 (131#) = happyShift action_35
-action_23 (134#) = happyShift action_36
-action_23 (137#) = happyShift action_113
-action_23 (142#) = happyShift action_38
-action_23 (153#) = happyShift action_39
-action_23 (154#) = happyShift action_40
-action_23 (158#) = happyShift action_41
-action_23 (159#) = happyShift action_42
-action_23 (164#) = happyShift action_43
-action_23 (167#) = happyShift action_44
-action_23 (170#) = happyShift action_6
-action_23 (171#) = happyShift action_45
-action_23 (172#) = happyShift action_46
-action_23 (173#) = happyShift action_47
-action_23 (174#) = happyShift action_48
-action_23 (8#) = happyGoto action_7
-action_23 (9#) = happyGoto action_8
-action_23 (10#) = happyGoto action_9
-action_23 (11#) = happyGoto action_10
-action_23 (12#) = happyGoto action_110
-action_23 (58#) = happyGoto action_12
-action_23 (59#) = happyGoto action_13
-action_23 (60#) = happyGoto action_14
-action_23 (61#) = happyGoto action_15
-action_23 (62#) = happyGoto action_16
-action_23 (63#) = happyGoto action_111
-action_23 (64#) = happyGoto action_18
-action_23 (72#) = happyGoto action_19
-action_23 (75#) = happyGoto action_99
-action_23 (76#) = happyGoto action_112
-action_23 (77#) = happyGoto action_20
-action_23 x = happyTcHack x happyReduce_236
-
-action_24 (95#) = happyShift action_21
-action_24 (97#) = happyShift action_22
-action_24 (98#) = happyShift action_23
-action_24 (111#) = happyShift action_24
-action_24 (115#) = happyShift action_25
-action_24 (117#) = happyShift action_26
-action_24 (118#) = happyShift action_27
-action_24 (119#) = happyShift action_28
-action_24 (120#) = happyShift action_29
-action_24 (121#) = happyShift action_30
-action_24 (122#) = happyShift action_31
-action_24 (123#) = happyShift action_32
-action_24 (124#) = happyShift action_33
-action_24 (128#) = happyShift action_34
-action_24 (131#) = happyShift action_35
-action_24 (134#) = happyShift action_36
-action_24 (137#) = happyShift action_37
-action_24 (142#) = happyShift action_38
-action_24 (153#) = happyShift action_39
-action_24 (154#) = happyShift action_40
-action_24 (158#) = happyShift action_41
-action_24 (159#) = happyShift action_42
-action_24 (164#) = happyShift action_43
-action_24 (167#) = happyShift action_44
-action_24 (170#) = happyShift action_6
-action_24 (171#) = happyShift action_45
-action_24 (172#) = happyShift action_46
-action_24 (173#) = happyShift action_47
-action_24 (174#) = happyShift action_48
-action_24 (8#) = happyGoto action_7
-action_24 (9#) = happyGoto action_8
-action_24 (10#) = happyGoto action_9
-action_24 (11#) = happyGoto action_10
-action_24 (12#) = happyGoto action_11
-action_24 (58#) = happyGoto action_12
-action_24 (59#) = happyGoto action_13
-action_24 (60#) = happyGoto action_14
-action_24 (61#) = happyGoto action_15
-action_24 (62#) = happyGoto action_16
-action_24 (63#) = happyGoto action_107
-action_24 (64#) = happyGoto action_18
-action_24 (72#) = happyGoto action_19
-action_24 (77#) = happyGoto action_20
-action_24 (78#) = happyGoto action_108
-action_24 (80#) = happyGoto action_109
-action_24 x = happyTcHack x happyReduce_243
-
-action_25 x = happyTcHack x happyReduce_147
-
-action_26 (174#) = happyShift action_48
-action_26 (12#) = happyGoto action_106
-action_26 x = happyTcHack x happyFail
-
-action_27 x = happyTcHack x happyReduce_225
-
-action_28 x = happyTcHack x happyReduce_227
-
-action_29 x = happyTcHack x happyReduce_228
-
-action_30 x = happyTcHack x happyReduce_226
-
-action_31 x = happyTcHack x happyReduce_224
-
-action_32 (125#) = happyShift action_105
-action_32 (171#) = happyShift action_45
-action_32 (174#) = happyShift action_48
-action_32 (9#) = happyGoto action_103
-action_32 (12#) = happyGoto action_104
-action_32 x = happyTcHack x happyFail
-
-action_33 (124#) = happyShift action_101
-action_33 (126#) = happyShift action_102
-action_33 (174#) = happyShift action_48
-action_33 (12#) = happyGoto action_98
-action_33 (75#) = happyGoto action_99
-action_33 (76#) = happyGoto action_100
-action_33 x = happyTcHack x happyReduce_236
-
-action_34 (95#) = happyShift action_21
-action_34 (97#) = happyShift action_22
-action_34 (98#) = happyShift action_23
-action_34 (111#) = happyShift action_24
-action_34 (115#) = happyShift action_25
-action_34 (117#) = happyShift action_26
-action_34 (118#) = happyShift action_27
-action_34 (119#) = happyShift action_28
-action_34 (120#) = happyShift action_29
-action_34 (121#) = happyShift action_30
-action_34 (122#) = happyShift action_31
-action_34 (123#) = happyShift action_32
-action_34 (124#) = happyShift action_33
-action_34 (128#) = happyShift action_34
-action_34 (131#) = happyShift action_35
-action_34 (134#) = happyShift action_36
-action_34 (137#) = happyShift action_37
-action_34 (142#) = happyShift action_38
-action_34 (153#) = happyShift action_39
-action_34 (154#) = happyShift action_40
-action_34 (158#) = happyShift action_41
-action_34 (159#) = happyShift action_42
-action_34 (164#) = happyShift action_43
-action_34 (167#) = happyShift action_44
-action_34 (170#) = happyShift action_6
-action_34 (171#) = happyShift action_45
-action_34 (172#) = happyShift action_46
-action_34 (173#) = happyShift action_47
-action_34 (174#) = happyShift action_48
-action_34 (8#) = happyGoto action_7
-action_34 (9#) = happyGoto action_8
-action_34 (10#) = happyGoto action_9
-action_34 (11#) = happyGoto action_10
-action_34 (12#) = happyGoto action_11
-action_34 (58#) = happyGoto action_12
-action_34 (59#) = happyGoto action_13
-action_34 (60#) = happyGoto action_14
-action_34 (61#) = happyGoto action_15
-action_34 (62#) = happyGoto action_16
-action_34 (63#) = happyGoto action_97
-action_34 (64#) = happyGoto action_18
-action_34 (72#) = happyGoto action_19
-action_34 (77#) = happyGoto action_20
-action_34 x = happyTcHack x happyFail
-
-action_35 x = happyTcHack x happyReduce_149
-
-action_36 (167#) = happyShift action_96
-action_36 x = happyTcHack x happyFail
-
-action_37 (97#) = happyShift action_22
-action_37 (98#) = happyShift action_87
-action_37 (111#) = happyShift action_24
-action_37 (115#) = happyShift action_25
-action_37 (118#) = happyShift action_27
-action_37 (119#) = happyShift action_28
-action_37 (120#) = happyShift action_29
-action_37 (121#) = happyShift action_30
-action_37 (122#) = happyShift action_31
-action_37 (123#) = happyShift action_32
-action_37 (131#) = happyShift action_35
-action_37 (167#) = happyShift action_44
-action_37 (170#) = happyShift action_6
-action_37 (171#) = happyShift action_45
-action_37 (172#) = happyShift action_46
-action_37 (173#) = happyShift action_47
-action_37 (174#) = happyShift action_48
-action_37 (8#) = happyGoto action_7
-action_37 (9#) = happyGoto action_8
-action_37 (10#) = happyGoto action_9
-action_37 (11#) = happyGoto action_10
-action_37 (12#) = happyGoto action_84
-action_37 (58#) = happyGoto action_12
-action_37 (59#) = happyGoto action_95
-action_37 (72#) = happyGoto action_19
-action_37 x = happyTcHack x happyFail
-
-action_38 (167#) = happyShift action_94
-action_38 (174#) = happyShift action_48
-action_38 (12#) = happyGoto action_92
-action_38 (53#) = happyGoto action_80
-action_38 (56#) = happyGoto action_81
-action_38 (57#) = happyGoto action_93
-action_38 x = happyTcHack x happyReduce_137
-
-action_39 (97#) = happyShift action_22
-action_39 (98#) = happyShift action_87
-action_39 (111#) = happyShift action_24
-action_39 (115#) = happyShift action_25
-action_39 (118#) = happyShift action_27
-action_39 (119#) = happyShift action_28
-action_39 (120#) = happyShift action_29
-action_39 (121#) = happyShift action_30
-action_39 (122#) = happyShift action_31
-action_39 (123#) = happyShift action_32
-action_39 (131#) = happyShift action_35
-action_39 (167#) = happyShift action_44
-action_39 (170#) = happyShift action_6
-action_39 (171#) = happyShift action_45
-action_39 (172#) = happyShift action_46
-action_39 (173#) = happyShift action_47
-action_39 (174#) = happyShift action_48
-action_39 (8#) = happyGoto action_7
-action_39 (9#) = happyGoto action_8
-action_39 (10#) = happyGoto action_9
-action_39 (11#) = happyGoto action_10
-action_39 (12#) = happyGoto action_84
-action_39 (58#) = happyGoto action_12
-action_39 (59#) = happyGoto action_91
-action_39 (72#) = happyGoto action_19
-action_39 x = happyTcHack x happyFail
-
-action_40 (167#) = happyShift action_90
-action_40 x = happyTcHack x happyFail
-
-action_41 (167#) = happyShift action_89
-action_41 x = happyTcHack x happyFail
-
-action_42 (97#) = happyShift action_86
-action_42 (98#) = happyShift action_87
-action_42 (111#) = happyShift action_24
-action_42 (115#) = happyShift action_25
-action_42 (118#) = happyShift action_27
-action_42 (119#) = happyShift action_28
-action_42 (120#) = happyShift action_29
-action_42 (121#) = happyShift action_30
-action_42 (122#) = happyShift action_31
-action_42 (123#) = happyShift action_32
-action_42 (131#) = happyShift action_35
-action_42 (167#) = happyShift action_88
-action_42 (170#) = happyShift action_6
-action_42 (171#) = happyShift action_45
-action_42 (172#) = happyShift action_46
-action_42 (173#) = happyShift action_47
-action_42 (174#) = happyShift action_48
-action_42 (8#) = happyGoto action_7
-action_42 (9#) = happyGoto action_8
-action_42 (10#) = happyGoto action_9
-action_42 (11#) = happyGoto action_10
-action_42 (12#) = happyGoto action_84
-action_42 (58#) = happyGoto action_85
-action_42 (72#) = happyGoto action_19
-action_42 x = happyTcHack x happyFail
-
-action_43 (167#) = happyShift action_83
-action_43 x = happyTcHack x happyFail
-
-action_44 (174#) = happyShift action_48
-action_44 (12#) = happyGoto action_79
-action_44 (53#) = happyGoto action_80
-action_44 (56#) = happyGoto action_81
-action_44 (57#) = happyGoto action_82
-action_44 x = happyTcHack x happyReduce_137
-
-action_45 x = happyTcHack x happyReduce_6
-
-action_46 x = happyTcHack x happyReduce_7
-
-action_47 x = happyTcHack x happyReduce_8
-
-action_48 x = happyTcHack x happyReduce_9
-
-action_49 (1#) = happyAccept
-action_49 x = happyTcHack x happyFail
-
-action_50 (127#) = happyShift action_63
-action_50 (130#) = happyShift action_64
-action_50 (140#) = happyShift action_65
-action_50 (141#) = happyShift action_66
-action_50 (156#) = happyShift action_67
-action_50 (161#) = happyShift action_68
-action_50 (23#) = happyGoto action_78
-action_50 x = happyTcHack x happyFail
-
-action_51 x = happyTcHack x happyReduce_61
-
-action_52 (176#) = happyAccept
-action_52 x = happyTcHack x happyFail
-
-action_53 (25#) = happyGoto action_77
-action_53 x = happyTcHack x happyReduce_48
-
-action_54 (105#) = happyShift action_74
-action_54 (107#) = happyShift action_75
-action_54 (108#) = happyShift action_76
-action_54 (171#) = happyShift action_45
-action_54 (174#) = happyShift action_48
-action_54 (9#) = happyGoto action_70
-action_54 (12#) = happyGoto action_71
-action_54 (92#) = happyGoto action_72
-action_54 (93#) = happyGoto action_73
-action_54 x = happyTcHack x happyFail
-
-action_55 (110#) = happyShift action_69
-action_55 (176#) = happyAccept
-action_55 x = happyTcHack x happyFail
-
-action_56 (127#) = happyShift action_63
-action_56 (130#) = happyShift action_64
-action_56 (140#) = happyShift action_65
-action_56 (141#) = happyShift action_66
-action_56 (156#) = happyShift action_67
-action_56 (161#) = happyShift action_68
-action_56 (23#) = happyGoto action_62
-action_56 x = happyTcHack x happyFail
-
-action_57 (174#) = happyShift action_48
-action_57 (12#) = happyGoto action_61
-action_57 x = happyTcHack x happyFail
-
-action_58 (176#) = happyAccept
-action_58 x = happyTcHack x happyFail
-
-action_59 (136#) = happyShift action_57
-action_59 (139#) = happyShift action_51
-action_59 (176#) = happyReduce_10
-action_59 (15#) = happyGoto action_60
-action_59 (30#) = happyGoto action_56
-action_59 x = happyTcHack x happyReduce_60
-
-action_60 (110#) = happyShift action_69
-action_60 x = happyTcHack x happyReduce_12
-
-action_61 (112#) = happyShift action_239
-action_61 x = happyTcHack x happyFail
-
-action_62 (112#) = happyShift action_238
-action_62 x = happyTcHack x happyFail
-
-action_63 (174#) = happyShift action_48
-action_63 (12#) = happyGoto action_237
-action_63 x = happyTcHack x happyFail
-
-action_64 (174#) = happyShift action_48
-action_64 (12#) = happyGoto action_236
-action_64 x = happyTcHack x happyFail
-
-action_65 (174#) = happyShift action_48
-action_65 (12#) = happyGoto action_235
-action_65 x = happyTcHack x happyFail
-
-action_66 (174#) = happyShift action_48
-action_66 (12#) = happyGoto action_234
-action_66 x = happyTcHack x happyFail
-
-action_67 (174#) = happyShift action_48
-action_67 (12#) = happyGoto action_233
-action_67 x = happyTcHack x happyFail
-
-action_68 (174#) = happyShift action_48
-action_68 (12#) = happyGoto action_232
-action_68 x = happyTcHack x happyFail
-
-action_69 x = happyTcHack x happyReduce_13
-
-action_70 x = happyTcHack x happyReduce_267
-
-action_71 (105#) = happyShift action_74
-action_71 (107#) = happyShift action_75
-action_71 (108#) = happyShift action_76
-action_71 (171#) = happyShift action_45
-action_71 (174#) = happyShift action_48
-action_71 (9#) = happyGoto action_70
-action_71 (12#) = happyGoto action_71
-action_71 (92#) = happyGoto action_231
-action_71 x = happyTcHack x happyReduce_268
-
-action_72 (110#) = happyShift action_230
-action_72 x = happyTcHack x happyFail
-
-action_73 x = happyTcHack x happyReduce_266
-
-action_74 (105#) = happyShift action_74
-action_74 (107#) = happyShift action_75
-action_74 (108#) = happyShift action_76
-action_74 (171#) = happyShift action_45
-action_74 (174#) = happyShift action_48
-action_74 (9#) = happyGoto action_70
-action_74 (12#) = happyGoto action_71
-action_74 (92#) = happyGoto action_229
-action_74 x = happyTcHack x happyFail
-
-action_75 (105#) = happyShift action_74
-action_75 (107#) = happyShift action_75
-action_75 (108#) = happyShift action_76
-action_75 (171#) = happyShift action_45
-action_75 (174#) = happyShift action_48
-action_75 (9#) = happyGoto action_70
-action_75 (12#) = happyGoto action_71
-action_75 (92#) = happyGoto action_228
-action_75 x = happyTcHack x happyFail
-
-action_76 (105#) = happyShift action_74
-action_76 (107#) = happyShift action_75
-action_76 (108#) = happyShift action_76
-action_76 (171#) = happyShift action_45
-action_76 (174#) = happyShift action_48
-action_76 (9#) = happyGoto action_70
-action_76 (12#) = happyGoto action_71
-action_76 (92#) = happyGoto action_227
-action_76 x = happyTcHack x happyFail
-
-action_77 (129#) = happyShift action_210
-action_77 (131#) = happyShift action_211
-action_77 (132#) = happyShift action_212
-action_77 (133#) = happyShift action_213
-action_77 (135#) = happyShift action_214
-action_77 (143#) = happyShift action_215
-action_77 (144#) = happyShift action_216
-action_77 (145#) = happyShift action_217
-action_77 (146#) = happyShift action_218
-action_77 (149#) = happyShift action_219
-action_77 (151#) = happyShift action_220
-action_77 (152#) = happyShift action_221
-action_77 (153#) = happyShift action_222
-action_77 (155#) = happyShift action_223
-action_77 (160#) = happyShift action_224
-action_77 (161#) = happyShift action_225
-action_77 (163#) = happyShift action_226
-action_77 (35#) = happyGoto action_209
-action_77 x = happyTcHack x happyReduce_264
-
-action_78 (112#) = happyShift action_208
-action_78 x = happyTcHack x happyFail
-
-action_79 (104#) = happyShift action_190
-action_79 (107#) = happyShift action_206
-action_79 (169#) = happyShift action_207
-action_79 x = happyTcHack x happyReduce_128
-
-action_80 (109#) = happyShift action_204
-action_80 (112#) = happyShift action_205
-action_80 x = happyTcHack x happyFail
-
-action_81 (110#) = happyShift action_203
-action_81 x = happyTcHack x happyReduce_138
-
-action_82 (169#) = happyShift action_202
-action_82 x = happyTcHack x happyFail
-
-action_83 (95#) = happyShift action_21
-action_83 (97#) = happyShift action_22
-action_83 (98#) = happyShift action_23
-action_83 (111#) = happyShift action_24
-action_83 (115#) = happyShift action_25
-action_83 (117#) = happyShift action_26
-action_83 (118#) = happyShift action_27
-action_83 (119#) = happyShift action_28
-action_83 (120#) = happyShift action_29
-action_83 (121#) = happyShift action_30
-action_83 (122#) = happyShift action_31
-action_83 (123#) = happyShift action_32
-action_83 (124#) = happyShift action_33
-action_83 (128#) = happyShift action_34
-action_83 (131#) = happyShift action_35
-action_83 (134#) = happyShift action_36
-action_83 (137#) = happyShift action_37
-action_83 (142#) = happyShift action_38
-action_83 (153#) = happyShift action_39
-action_83 (154#) = happyShift action_40
-action_83 (158#) = happyShift action_41
-action_83 (159#) = happyShift action_42
-action_83 (164#) = happyShift action_43
-action_83 (167#) = happyShift action_44
-action_83 (170#) = happyShift action_6
-action_83 (171#) = happyShift action_45
-action_83 (172#) = happyShift action_46
-action_83 (173#) = happyShift action_47
-action_83 (174#) = happyShift action_48
-action_83 (8#) = happyGoto action_7
-action_83 (9#) = happyGoto action_8
-action_83 (10#) = happyGoto action_9
-action_83 (11#) = happyGoto action_10
-action_83 (12#) = happyGoto action_11
-action_83 (58#) = happyGoto action_12
-action_83 (59#) = happyGoto action_13
-action_83 (60#) = happyGoto action_14
-action_83 (61#) = happyGoto action_15
-action_83 (62#) = happyGoto action_16
-action_83 (63#) = happyGoto action_192
-action_83 (64#) = happyGoto action_18
-action_83 (65#) = happyGoto action_201
-action_83 (72#) = happyGoto action_19
-action_83 (77#) = happyGoto action_20
-action_83 x = happyTcHack x happyReduce_193
-
-action_84 x = happyTcHack x happyReduce_140
-
-action_85 (123#) = happyShift action_199
-action_85 (167#) = happyShift action_200
-action_85 x = happyTcHack x happyFail
-
-action_86 (174#) = happyShift action_48
-action_86 (12#) = happyGoto action_198
-action_86 x = happyTcHack x happyFail
-
-action_87 (95#) = happyShift action_21
-action_87 (97#) = happyShift action_22
-action_87 (98#) = happyShift action_23
-action_87 (111#) = happyShift action_24
-action_87 (115#) = happyShift action_25
-action_87 (117#) = happyShift action_26
-action_87 (118#) = happyShift action_27
-action_87 (119#) = happyShift action_28
-action_87 (120#) = happyShift action_29
-action_87 (121#) = happyShift action_30
-action_87 (122#) = happyShift action_31
-action_87 (123#) = happyShift action_32
-action_87 (124#) = happyShift action_33
-action_87 (128#) = happyShift action_34
-action_87 (131#) = happyShift action_35
-action_87 (134#) = happyShift action_36
-action_87 (137#) = happyShift action_113
-action_87 (142#) = happyShift action_38
-action_87 (153#) = happyShift action_39
-action_87 (154#) = happyShift action_40
-action_87 (158#) = happyShift action_41
-action_87 (159#) = happyShift action_42
-action_87 (164#) = happyShift action_43
-action_87 (167#) = happyShift action_44
-action_87 (170#) = happyShift action_6
-action_87 (171#) = happyShift action_45
-action_87 (172#) = happyShift action_46
-action_87 (173#) = happyShift action_47
-action_87 (174#) = happyShift action_48
-action_87 (8#) = happyGoto action_7
-action_87 (9#) = happyGoto action_8
-action_87 (10#) = happyGoto action_9
-action_87 (11#) = happyGoto action_10
-action_87 (12#) = happyGoto action_11
-action_87 (58#) = happyGoto action_12
-action_87 (59#) = happyGoto action_13
-action_87 (60#) = happyGoto action_14
-action_87 (61#) = happyGoto action_15
-action_87 (62#) = happyGoto action_16
-action_87 (63#) = happyGoto action_111
-action_87 (64#) = happyGoto action_18
-action_87 (72#) = happyGoto action_19
-action_87 (77#) = happyGoto action_20
-action_87 x = happyTcHack x happyFail
-
-action_88 (95#) = happyShift action_120
-action_88 (98#) = happyShift action_121
-action_88 (105#) = happyShift action_164
-action_88 (111#) = happyShift action_122
-action_88 (115#) = happyShift action_123
-action_88 (123#) = happyShift action_124
-action_88 (126#) = happyShift action_125
-action_88 (167#) = happyShift action_126
-action_88 (170#) = happyShift action_6
-action_88 (171#) = happyShift action_45
-action_88 (172#) = happyShift action_46
-action_88 (174#) = happyShift action_48
-action_88 (8#) = happyGoto action_115
-action_88 (9#) = happyGoto action_116
-action_88 (10#) = happyGoto action_117
-action_88 (12#) = happyGoto action_194
-action_88 (53#) = happyGoto action_80
-action_88 (56#) = happyGoto action_81
-action_88 (57#) = happyGoto action_82
-action_88 (67#) = happyGoto action_159
-action_88 (68#) = happyGoto action_160
-action_88 (69#) = happyGoto action_195
-action_88 (82#) = happyGoto action_196
-action_88 (83#) = happyGoto action_197
-action_88 x = happyTcHack x happyReduce_137
-
-action_89 (95#) = happyShift action_21
-action_89 (97#) = happyShift action_22
-action_89 (98#) = happyShift action_23
-action_89 (111#) = happyShift action_24
-action_89 (115#) = happyShift action_25
-action_89 (117#) = happyShift action_26
-action_89 (118#) = happyShift action_27
-action_89 (119#) = happyShift action_28
-action_89 (120#) = happyShift action_29
-action_89 (121#) = happyShift action_30
-action_89 (122#) = happyShift action_31
-action_89 (123#) = happyShift action_32
-action_89 (124#) = happyShift action_33
-action_89 (128#) = happyShift action_34
-action_89 (131#) = happyShift action_35
-action_89 (134#) = happyShift action_36
-action_89 (137#) = happyShift action_37
-action_89 (142#) = happyShift action_38
-action_89 (153#) = happyShift action_39
-action_89 (154#) = happyShift action_40
-action_89 (158#) = happyShift action_41
-action_89 (159#) = happyShift action_42
-action_89 (164#) = happyShift action_43
-action_89 (167#) = happyShift action_44
-action_89 (170#) = happyShift action_6
-action_89 (171#) = happyShift action_45
-action_89 (172#) = happyShift action_46
-action_89 (173#) = happyShift action_47
-action_89 (174#) = happyShift action_48
-action_89 (8#) = happyGoto action_7
-action_89 (9#) = happyGoto action_8
-action_89 (10#) = happyGoto action_9
-action_89 (11#) = happyGoto action_10
-action_89 (12#) = happyGoto action_11
-action_89 (58#) = happyGoto action_12
-action_89 (59#) = happyGoto action_13
-action_89 (60#) = happyGoto action_14
-action_89 (61#) = happyGoto action_15
-action_89 (62#) = happyGoto action_16
-action_89 (63#) = happyGoto action_192
-action_89 (64#) = happyGoto action_18
-action_89 (65#) = happyGoto action_193
-action_89 (72#) = happyGoto action_19
-action_89 (77#) = happyGoto action_20
-action_89 x = happyTcHack x happyReduce_193
-
-action_90 (95#) = happyShift action_21
-action_90 (97#) = happyShift action_22
-action_90 (98#) = happyShift action_23
-action_90 (111#) = happyShift action_24
-action_90 (115#) = happyShift action_25
-action_90 (117#) = happyShift action_26
-action_90 (118#) = happyShift action_27
-action_90 (119#) = happyShift action_28
-action_90 (120#) = happyShift action_29
-action_90 (121#) = happyShift action_30
-action_90 (122#) = happyShift action_31
-action_90 (123#) = happyShift action_32
-action_90 (124#) = happyShift action_33
-action_90 (128#) = happyShift action_34
-action_90 (131#) = happyShift action_35
-action_90 (134#) = happyShift action_36
-action_90 (137#) = happyShift action_37
-action_90 (142#) = happyShift action_38
-action_90 (153#) = happyShift action_39
-action_90 (154#) = happyShift action_40
-action_90 (158#) = happyShift action_41
-action_90 (159#) = happyShift action_42
-action_90 (164#) = happyShift action_43
-action_90 (167#) = happyShift action_44
-action_90 (170#) = happyShift action_6
-action_90 (171#) = happyShift action_45
-action_90 (172#) = happyShift action_46
-action_90 (173#) = happyShift action_47
-action_90 (174#) = happyShift action_48
-action_90 (8#) = happyGoto action_7
-action_90 (9#) = happyGoto action_8
-action_90 (10#) = happyGoto action_9
-action_90 (11#) = happyGoto action_10
-action_90 (12#) = happyGoto action_11
-action_90 (58#) = happyGoto action_12
-action_90 (59#) = happyGoto action_13
-action_90 (60#) = happyGoto action_14
-action_90 (61#) = happyGoto action_15
-action_90 (62#) = happyGoto action_16
-action_90 (63#) = happyGoto action_191
-action_90 (64#) = happyGoto action_18
-action_90 (72#) = happyGoto action_19
-action_90 (77#) = happyGoto action_20
-action_90 x = happyTcHack x happyFail
-
-action_91 (107#) = happyShift action_136
-action_91 x = happyTcHack x happyReduce_172
-
-action_92 (104#) = happyShift action_190
-action_92 x = happyTcHack x happyReduce_128
-
-action_93 (137#) = happyShift action_189
-action_93 x = happyTcHack x happyFail
-
-action_94 (174#) = happyShift action_48
-action_94 (12#) = happyGoto action_92
-action_94 (53#) = happyGoto action_80
-action_94 (56#) = happyGoto action_81
-action_94 (57#) = happyGoto action_188
-action_94 x = happyTcHack x happyReduce_137
-
-action_95 (107#) = happyShift action_136
-action_95 (171#) = happyShift action_45
-action_95 (9#) = happyGoto action_187
-action_95 x = happyTcHack x happyFail
-
-action_96 (95#) = happyShift action_120
-action_96 (98#) = happyShift action_121
-action_96 (111#) = happyShift action_122
-action_96 (115#) = happyShift action_123
-action_96 (123#) = happyShift action_124
-action_96 (126#) = happyShift action_125
-action_96 (167#) = happyShift action_126
-action_96 (170#) = happyShift action_6
-action_96 (171#) = happyShift action_45
-action_96 (172#) = happyShift action_46
-action_96 (174#) = happyShift action_48
-action_96 (8#) = happyGoto action_115
-action_96 (9#) = happyGoto action_116
-action_96 (10#) = happyGoto action_117
-action_96 (12#) = happyGoto action_118
-action_96 (67#) = happyGoto action_183
-action_96 (74#) = happyGoto action_184
-action_96 (84#) = happyGoto action_185
-action_96 (85#) = happyGoto action_186
-action_96 x = happyTcHack x happyReduce_253
-
-action_97 (147#) = happyShift action_182
-action_97 x = happyTcHack x happyFail
-
-action_98 x = happyTcHack x happyReduce_234
-
-action_99 (104#) = happyShift action_181
-action_99 x = happyTcHack x happyReduce_237
-
-action_100 (106#) = happyShift action_180
-action_100 x = happyTcHack x happyFail
-
-action_101 (126#) = happyShift action_102
-action_101 (174#) = happyShift action_48
-action_101 (12#) = happyGoto action_98
-action_101 (75#) = happyGoto action_99
-action_101 (76#) = happyGoto action_179
-action_101 x = happyTcHack x happyReduce_236
-
-action_102 x = happyTcHack x happyReduce_235
-
-action_103 (125#) = happyShift action_178
-action_103 x = happyTcHack x happyFail
-
-action_104 (97#) = happyShift action_86
-action_104 (98#) = happyShift action_87
-action_104 (111#) = happyShift action_24
-action_104 (115#) = happyShift action_25
-action_104 (118#) = happyShift action_27
-action_104 (119#) = happyShift action_28
-action_104 (120#) = happyShift action_29
-action_104 (121#) = happyShift action_30
-action_104 (122#) = happyShift action_31
-action_104 (123#) = happyShift action_32
-action_104 (131#) = happyShift action_35
-action_104 (167#) = happyShift action_139
-action_104 (170#) = happyShift action_6
-action_104 (171#) = happyShift action_45
-action_104 (172#) = happyShift action_46
-action_104 (173#) = happyShift action_47
-action_104 (174#) = happyShift action_48
-action_104 (8#) = happyGoto action_7
-action_104 (9#) = happyGoto action_8
-action_104 (10#) = happyGoto action_9
-action_104 (11#) = happyGoto action_10
-action_104 (12#) = happyGoto action_84
-action_104 (58#) = happyGoto action_176
-action_104 (66#) = happyGoto action_177
-action_104 (72#) = happyGoto action_19
-action_104 x = happyTcHack x happyReduce_196
-
-action_105 x = happyTcHack x happyReduce_148
-
-action_106 x = happyTcHack x happyReduce_174
-
-action_107 (109#) = happyShift action_175
-action_107 x = happyTcHack x happyReduce_241
-
-action_108 (104#) = happyShift action_174
-action_108 x = happyTcHack x happyReduce_244
-
-action_109 (114#) = happyShift action_173
-action_109 x = happyTcHack x happyFail
-
-action_110 (104#) = happyReduce_234
-action_110 (109#) = happyReduce_234
-action_110 (116#) = happyShift action_137
-action_110 x = happyTcHack x happyReduce_140
-
-action_111 (99#) = happyShift action_172
-action_111 x = happyTcHack x happyFail
-
-action_112 (109#) = happyShift action_171
-action_112 x = happyTcHack x happyFail
-
-action_113 (97#) = happyShift action_22
-action_113 (98#) = happyShift action_87
-action_113 (111#) = happyShift action_24
-action_113 (115#) = happyShift action_25
-action_113 (118#) = happyShift action_27
-action_113 (119#) = happyShift action_28
-action_113 (120#) = happyShift action_29
-action_113 (121#) = happyShift action_30
-action_113 (122#) = happyShift action_31
-action_113 (123#) = happyShift action_32
-action_113 (131#) = happyShift action_35
-action_113 (167#) = happyShift action_44
-action_113 (170#) = happyShift action_6
-action_113 (171#) = happyShift action_45
-action_113 (172#) = happyShift action_46
-action_113 (173#) = happyShift action_47
-action_113 (174#) = happyShift action_48
-action_113 (8#) = happyGoto action_7
-action_113 (9#) = happyGoto action_8
-action_113 (10#) = happyGoto action_9
-action_113 (11#) = happyGoto action_10
-action_113 (12#) = happyGoto action_170
-action_113 (58#) = happyGoto action_12
-action_113 (59#) = happyGoto action_95
-action_113 (72#) = happyGoto action_19
-action_113 x = happyTcHack x happyFail
-
-action_114 (97#) = happyShift action_168
-action_114 (107#) = happyShift action_169
-action_114 x = happyTcHack x happyFail
-
-action_115 x = happyTcHack x happyReduce_206
-
-action_116 x = happyTcHack x happyReduce_208
-
-action_117 x = happyTcHack x happyReduce_207
-
-action_118 (107#) = happyShift action_167
-action_118 x = happyTcHack x happyReduce_203
-
-action_119 x = happyTcHack x happyReduce_171
-
-action_120 (174#) = happyShift action_48
-action_120 (12#) = happyGoto action_166
-action_120 x = happyTcHack x happyFail
-
-action_121 (95#) = happyShift action_120
-action_121 (98#) = happyShift action_121
-action_121 (105#) = happyShift action_164
-action_121 (111#) = happyShift action_122
-action_121 (115#) = happyShift action_123
-action_121 (123#) = happyShift action_124
-action_121 (126#) = happyShift action_125
-action_121 (167#) = happyShift action_126
-action_121 (170#) = happyShift action_6
-action_121 (171#) = happyShift action_45
-action_121 (172#) = happyShift action_46
-action_121 (174#) = happyShift action_48
-action_121 (8#) = happyGoto action_115
-action_121 (9#) = happyGoto action_116
-action_121 (10#) = happyGoto action_117
-action_121 (12#) = happyGoto action_158
-action_121 (67#) = happyGoto action_159
-action_121 (68#) = happyGoto action_160
-action_121 (69#) = happyGoto action_165
-action_121 x = happyTcHack x happyFail
-
-action_122 (95#) = happyShift action_120
-action_122 (98#) = happyShift action_121
-action_122 (105#) = happyShift action_164
-action_122 (111#) = happyShift action_122
-action_122 (115#) = happyShift action_123
-action_122 (123#) = happyShift action_124
-action_122 (126#) = happyShift action_125
-action_122 (167#) = happyShift action_126
-action_122 (170#) = happyShift action_6
-action_122 (171#) = happyShift action_45
-action_122 (172#) = happyShift action_46
-action_122 (174#) = happyShift action_48
-action_122 (8#) = happyGoto action_115
-action_122 (9#) = happyGoto action_116
-action_122 (10#) = happyGoto action_117
-action_122 (12#) = happyGoto action_158
-action_122 (67#) = happyGoto action_159
-action_122 (68#) = happyGoto action_160
-action_122 (69#) = happyGoto action_161
-action_122 (79#) = happyGoto action_162
-action_122 (81#) = happyGoto action_163
-action_122 x = happyTcHack x happyReduce_246
-
-action_123 x = happyTcHack x happyReduce_198
-
-action_124 (171#) = happyShift action_45
-action_124 (9#) = happyGoto action_157
-action_124 x = happyTcHack x happyFail
-
-action_125 x = happyTcHack x happyReduce_202
-
-action_126 (174#) = happyShift action_48
-action_126 (12#) = happyGoto action_153
-action_126 (53#) = happyGoto action_154
-action_126 (70#) = happyGoto action_155
-action_126 (73#) = happyGoto action_156
-action_126 x = happyTcHack x happyReduce_229
-
-action_127 (95#) = happyShift action_21
-action_127 (97#) = happyShift action_22
-action_127 (98#) = happyShift action_23
-action_127 (111#) = happyShift action_24
-action_127 (115#) = happyShift action_25
-action_127 (117#) = happyShift action_26
-action_127 (118#) = happyShift action_27
-action_127 (119#) = happyShift action_28
-action_127 (120#) = happyShift action_29
-action_127 (121#) = happyShift action_30
-action_127 (122#) = happyShift action_31
-action_127 (123#) = happyShift action_32
-action_127 (124#) = happyShift action_33
-action_127 (128#) = happyShift action_34
-action_127 (131#) = happyShift action_35
-action_127 (134#) = happyShift action_36
-action_127 (137#) = happyShift action_37
-action_127 (142#) = happyShift action_38
-action_127 (153#) = happyShift action_39
-action_127 (154#) = happyShift action_40
-action_127 (158#) = happyShift action_41
-action_127 (159#) = happyShift action_42
-action_127 (164#) = happyShift action_43
-action_127 (167#) = happyShift action_44
-action_127 (170#) = happyShift action_6
-action_127 (171#) = happyShift action_45
-action_127 (172#) = happyShift action_46
-action_127 (173#) = happyShift action_47
-action_127 (174#) = happyShift action_48
-action_127 (8#) = happyGoto action_7
-action_127 (9#) = happyGoto action_8
-action_127 (10#) = happyGoto action_9
-action_127 (11#) = happyGoto action_10
-action_127 (12#) = happyGoto action_11
-action_127 (58#) = happyGoto action_12
-action_127 (59#) = happyGoto action_13
-action_127 (60#) = happyGoto action_14
-action_127 (61#) = happyGoto action_15
-action_127 (62#) = happyGoto action_16
-action_127 (63#) = happyGoto action_152
-action_127 (64#) = happyGoto action_18
-action_127 (72#) = happyGoto action_19
-action_127 (77#) = happyGoto action_20
-action_127 x = happyTcHack x happyFail
-
-action_128 (95#) = happyShift action_21
-action_128 (97#) = happyShift action_22
-action_128 (98#) = happyShift action_87
-action_128 (111#) = happyShift action_24
-action_128 (115#) = happyShift action_25
-action_128 (117#) = happyShift action_26
-action_128 (118#) = happyShift action_27
-action_128 (119#) = happyShift action_28
-action_128 (120#) = happyShift action_29
-action_128 (121#) = happyShift action_30
-action_128 (122#) = happyShift action_31
-action_128 (123#) = happyShift action_32
-action_128 (128#) = happyShift action_34
-action_128 (131#) = happyShift action_35
-action_128 (153#) = happyShift action_39
-action_128 (154#) = happyShift action_40
-action_128 (158#) = happyShift action_41
-action_128 (159#) = happyShift action_42
-action_128 (164#) = happyShift action_43
-action_128 (167#) = happyShift action_44
-action_128 (170#) = happyShift action_6
-action_128 (171#) = happyShift action_45
-action_128 (172#) = happyShift action_46
-action_128 (173#) = happyShift action_47
-action_128 (174#) = happyShift action_48
-action_128 (8#) = happyGoto action_7
-action_128 (9#) = happyGoto action_8
-action_128 (10#) = happyGoto action_9
-action_128 (11#) = happyGoto action_10
-action_128 (12#) = happyGoto action_11
-action_128 (58#) = happyGoto action_12
-action_128 (59#) = happyGoto action_13
-action_128 (60#) = happyGoto action_149
-action_128 (61#) = happyGoto action_150
-action_128 (62#) = happyGoto action_151
-action_128 (64#) = happyGoto action_18
-action_128 (72#) = happyGoto action_19
-action_128 x = happyTcHack x happyFail
-
-action_129 (95#) = happyShift action_21
-action_129 (97#) = happyShift action_22
-action_129 (98#) = happyShift action_23
-action_129 (111#) = happyShift action_24
-action_129 (115#) = happyShift action_25
-action_129 (117#) = happyShift action_26
-action_129 (118#) = happyShift action_27
-action_129 (119#) = happyShift action_28
-action_129 (120#) = happyShift action_29
-action_129 (121#) = happyShift action_30
-action_129 (122#) = happyShift action_31
-action_129 (123#) = happyShift action_32
-action_129 (124#) = happyShift action_33
-action_129 (128#) = happyShift action_34
-action_129 (131#) = happyShift action_35
-action_129 (134#) = happyShift action_36
-action_129 (137#) = happyShift action_37
-action_129 (142#) = happyShift action_38
-action_129 (153#) = happyShift action_39
-action_129 (154#) = happyShift action_40
-action_129 (158#) = happyShift action_41
-action_129 (159#) = happyShift action_42
-action_129 (164#) = happyShift action_43
-action_129 (167#) = happyShift action_44
-action_129 (170#) = happyShift action_6
-action_129 (171#) = happyShift action_45
-action_129 (172#) = happyShift action_46
-action_129 (173#) = happyShift action_47
-action_129 (174#) = happyShift action_48
-action_129 (8#) = happyGoto action_7
-action_129 (9#) = happyGoto action_8
-action_129 (10#) = happyGoto action_9
-action_129 (11#) = happyGoto action_10
-action_129 (12#) = happyGoto action_11
-action_129 (58#) = happyGoto action_12
-action_129 (59#) = happyGoto action_13
-action_129 (60#) = happyGoto action_14
-action_129 (61#) = happyGoto action_15
-action_129 (62#) = happyGoto action_16
-action_129 (63#) = happyGoto action_148
-action_129 (64#) = happyGoto action_18
-action_129 (72#) = happyGoto action_19
-action_129 (77#) = happyGoto action_20
-action_129 x = happyTcHack x happyFail
-
-action_130 (95#) = happyShift action_21
-action_130 (97#) = happyShift action_22
-action_130 (98#) = happyShift action_87
-action_130 (111#) = happyShift action_24
-action_130 (115#) = happyShift action_25
-action_130 (117#) = happyShift action_26
-action_130 (118#) = happyShift action_27
-action_130 (119#) = happyShift action_28
-action_130 (120#) = happyShift action_29
-action_130 (121#) = happyShift action_30
-action_130 (122#) = happyShift action_31
-action_130 (123#) = happyShift action_32
-action_130 (128#) = happyShift action_34
-action_130 (131#) = happyShift action_35
-action_130 (153#) = happyShift action_39
-action_130 (154#) = happyShift action_40
-action_130 (158#) = happyShift action_41
-action_130 (159#) = happyShift action_42
-action_130 (164#) = happyShift action_43
-action_130 (167#) = happyShift action_44
-action_130 (170#) = happyShift action_6
-action_130 (171#) = happyShift action_45
-action_130 (172#) = happyShift action_46
-action_130 (173#) = happyShift action_47
-action_130 (174#) = happyShift action_48
-action_130 (8#) = happyGoto action_7
-action_130 (9#) = happyGoto action_8
-action_130 (10#) = happyGoto action_9
-action_130 (11#) = happyGoto action_10
-action_130 (12#) = happyGoto action_11
-action_130 (58#) = happyGoto action_12
-action_130 (59#) = happyGoto action_13
-action_130 (60#) = happyGoto action_147
-action_130 (72#) = happyGoto action_19
-action_130 x = happyTcHack x happyFail
-
-action_131 (95#) = happyShift action_21
-action_131 (97#) = happyShift action_22
-action_131 (98#) = happyShift action_87
-action_131 (111#) = happyShift action_24
-action_131 (115#) = happyShift action_25
-action_131 (117#) = happyShift action_26
-action_131 (118#) = happyShift action_27
-action_131 (119#) = happyShift action_28
-action_131 (120#) = happyShift action_29
-action_131 (121#) = happyShift action_30
-action_131 (122#) = happyShift action_31
-action_131 (123#) = happyShift action_32
-action_131 (128#) = happyShift action_34
-action_131 (131#) = happyShift action_35
-action_131 (153#) = happyShift action_39
-action_131 (154#) = happyShift action_40
-action_131 (158#) = happyShift action_41
-action_131 (159#) = happyShift action_42
-action_131 (164#) = happyShift action_43
-action_131 (167#) = happyShift action_44
-action_131 (170#) = happyShift action_6
-action_131 (171#) = happyShift action_45
-action_131 (172#) = happyShift action_46
-action_131 (173#) = happyShift action_47
-action_131 (174#) = happyShift action_48
-action_131 (8#) = happyGoto action_7
-action_131 (9#) = happyGoto action_8
-action_131 (10#) = happyGoto action_9
-action_131 (11#) = happyGoto action_10
-action_131 (12#) = happyGoto action_11
-action_131 (58#) = happyGoto action_12
-action_131 (59#) = happyGoto action_13
-action_131 (60#) = happyGoto action_146
-action_131 (72#) = happyGoto action_19
-action_131 x = happyTcHack x happyFail
-
-action_132 (95#) = happyShift action_21
-action_132 (97#) = happyShift action_22
-action_132 (98#) = happyShift action_87
-action_132 (111#) = happyShift action_24
-action_132 (115#) = happyShift action_25
-action_132 (117#) = happyShift action_26
-action_132 (118#) = happyShift action_27
-action_132 (119#) = happyShift action_28
-action_132 (120#) = happyShift action_29
-action_132 (121#) = happyShift action_30
-action_132 (122#) = happyShift action_31
-action_132 (123#) = happyShift action_32
-action_132 (128#) = happyShift action_34
-action_132 (131#) = happyShift action_35
-action_132 (153#) = happyShift action_39
-action_132 (154#) = happyShift action_40
-action_132 (158#) = happyShift action_41
-action_132 (159#) = happyShift action_42
-action_132 (164#) = happyShift action_43
-action_132 (167#) = happyShift action_44
-action_132 (170#) = happyShift action_6
-action_132 (171#) = happyShift action_45
-action_132 (172#) = happyShift action_46
-action_132 (173#) = happyShift action_47
-action_132 (174#) = happyShift action_48
-action_132 (8#) = happyGoto action_7
-action_132 (9#) = happyGoto action_8
-action_132 (10#) = happyGoto action_9
-action_132 (11#) = happyGoto action_10
-action_132 (12#) = happyGoto action_11
-action_132 (58#) = happyGoto action_12
-action_132 (59#) = happyGoto action_13
-action_132 (60#) = happyGoto action_145
-action_132 (72#) = happyGoto action_19
-action_132 x = happyTcHack x happyFail
-
-action_133 (95#) = happyShift action_21
-action_133 (97#) = happyShift action_22
-action_133 (98#) = happyShift action_23
-action_133 (111#) = happyShift action_24
-action_133 (115#) = happyShift action_25
-action_133 (117#) = happyShift action_26
-action_133 (118#) = happyShift action_27
-action_133 (119#) = happyShift action_28
-action_133 (120#) = happyShift action_29
-action_133 (121#) = happyShift action_30
-action_133 (122#) = happyShift action_31
-action_133 (123#) = happyShift action_32
-action_133 (124#) = happyShift action_33
-action_133 (128#) = happyShift action_34
-action_133 (131#) = happyShift action_35
-action_133 (134#) = happyShift action_36
-action_133 (137#) = happyShift action_37
-action_133 (142#) = happyShift action_38
-action_133 (153#) = happyShift action_39
-action_133 (154#) = happyShift action_40
-action_133 (158#) = happyShift action_41
-action_133 (159#) = happyShift action_42
-action_133 (164#) = happyShift action_43
-action_133 (167#) = happyShift action_44
-action_133 (170#) = happyShift action_6
-action_133 (171#) = happyShift action_45
-action_133 (172#) = happyShift action_46
-action_133 (173#) = happyShift action_47
-action_133 (174#) = happyShift action_48
-action_133 (8#) = happyGoto action_7
-action_133 (9#) = happyGoto action_8
-action_133 (10#) = happyGoto action_9
-action_133 (11#) = happyGoto action_10
-action_133 (12#) = happyGoto action_11
-action_133 (58#) = happyGoto action_12
-action_133 (59#) = happyGoto action_13
-action_133 (60#) = happyGoto action_14
-action_133 (61#) = happyGoto action_15
-action_133 (62#) = happyGoto action_16
-action_133 (63#) = happyGoto action_144
-action_133 (64#) = happyGoto action_18
-action_133 (72#) = happyGoto action_19
-action_133 (77#) = happyGoto action_20
-action_133 x = happyTcHack x happyFail
-
-action_134 (167#) = happyShift action_143
-action_134 x = happyTcHack x happyFail
-
-action_135 (107#) = happyShift action_136
-action_135 x = happyTcHack x happyReduce_162
-
-action_136 (96#) = happyShift action_142
-action_136 (174#) = happyShift action_48
-action_136 (12#) = happyGoto action_140
-action_136 (71#) = happyGoto action_141
-action_136 x = happyTcHack x happyFail
-
-action_137 (97#) = happyShift action_86
-action_137 (98#) = happyShift action_87
-action_137 (111#) = happyShift action_24
-action_137 (115#) = happyShift action_25
-action_137 (118#) = happyShift action_27
-action_137 (119#) = happyShift action_28
-action_137 (120#) = happyShift action_29
-action_137 (121#) = happyShift action_30
-action_137 (122#) = happyShift action_31
-action_137 (123#) = happyShift action_32
-action_137 (131#) = happyShift action_35
-action_137 (167#) = happyShift action_139
-action_137 (170#) = happyShift action_6
-action_137 (171#) = happyShift action_45
-action_137 (172#) = happyShift action_46
-action_137 (173#) = happyShift action_47
-action_137 (174#) = happyShift action_48
-action_137 (8#) = happyGoto action_7
-action_137 (9#) = happyGoto action_8
-action_137 (10#) = happyGoto action_9
-action_137 (11#) = happyGoto action_10
-action_137 (12#) = happyGoto action_84
-action_137 (58#) = happyGoto action_138
-action_137 (72#) = happyGoto action_19
-action_137 x = happyTcHack x happyFail
-
-action_138 x = happyTcHack x happyReduce_170
-
-action_139 (174#) = happyShift action_48
-action_139 (12#) = happyGoto action_348
-action_139 (53#) = happyGoto action_80
-action_139 (56#) = happyGoto action_81
-action_139 (57#) = happyGoto action_82
-action_139 x = happyTcHack x happyReduce_137
-
-action_140 x = happyTcHack x happyReduce_222
-
-action_141 x = happyTcHack x happyReduce_158
-
-action_142 (170#) = happyShift action_6
-action_142 (8#) = happyGoto action_347
-action_142 x = happyTcHack x happyFail
-
-action_143 (174#) = happyShift action_48
-action_143 (12#) = happyGoto action_92
-action_143 (53#) = happyGoto action_80
-action_143 (56#) = happyGoto action_81
-action_143 (57#) = happyGoto action_346
-action_143 x = happyTcHack x happyReduce_137
-
-action_144 x = happyTcHack x happyReduce_185
-
-action_145 (97#) = happyShift action_22
-action_145 (98#) = happyShift action_87
-action_145 (111#) = happyShift action_24
-action_145 (115#) = happyShift action_25
-action_145 (118#) = happyShift action_27
-action_145 (119#) = happyShift action_28
-action_145 (120#) = happyShift action_29
-action_145 (121#) = happyShift action_30
-action_145 (122#) = happyShift action_31
-action_145 (123#) = happyShift action_32
-action_145 (131#) = happyShift action_35
-action_145 (167#) = happyShift action_44
-action_145 (170#) = happyShift action_6
-action_145 (171#) = happyShift action_45
-action_145 (172#) = happyShift action_46
-action_145 (173#) = happyShift action_47
-action_145 (174#) = happyShift action_48
-action_145 (8#) = happyGoto action_7
-action_145 (9#) = happyGoto action_8
-action_145 (10#) = happyGoto action_9
-action_145 (11#) = happyGoto action_10
-action_145 (12#) = happyGoto action_84
-action_145 (58#) = happyGoto action_12
-action_145 (59#) = happyGoto action_135
-action_145 (72#) = happyGoto action_19
-action_145 x = happyTcHack x happyReduce_177
-
-action_146 (97#) = happyShift action_22
-action_146 (98#) = happyShift action_87
-action_146 (111#) = happyShift action_24
-action_146 (115#) = happyShift action_25
-action_146 (118#) = happyShift action_27
-action_146 (119#) = happyShift action_28
-action_146 (120#) = happyShift action_29
-action_146 (121#) = happyShift action_30
-action_146 (122#) = happyShift action_31
-action_146 (123#) = happyShift action_32
-action_146 (131#) = happyShift action_35
-action_146 (167#) = happyShift action_44
-action_146 (170#) = happyShift action_6
-action_146 (171#) = happyShift action_45
-action_146 (172#) = happyShift action_46
-action_146 (173#) = happyShift action_47
-action_146 (174#) = happyShift action_48
-action_146 (8#) = happyGoto action_7
-action_146 (9#) = happyGoto action_8
-action_146 (10#) = happyGoto action_9
-action_146 (11#) = happyGoto action_10
-action_146 (12#) = happyGoto action_84
-action_146 (58#) = happyGoto action_12
-action_146 (59#) = happyGoto action_135
-action_146 (72#) = happyGoto action_19
-action_146 x = happyTcHack x happyReduce_176
-
-action_147 (97#) = happyShift action_22
-action_147 (98#) = happyShift action_87
-action_147 (111#) = happyShift action_24
-action_147 (115#) = happyShift action_25
-action_147 (118#) = happyShift action_27
-action_147 (119#) = happyShift action_28
-action_147 (120#) = happyShift action_29
-action_147 (121#) = happyShift action_30
-action_147 (122#) = happyShift action_31
-action_147 (123#) = happyShift action_32
-action_147 (131#) = happyShift action_35
-action_147 (167#) = happyShift action_44
-action_147 (170#) = happyShift action_6
-action_147 (171#) = happyShift action_45
-action_147 (172#) = happyShift action_46
-action_147 (173#) = happyShift action_47
-action_147 (174#) = happyShift action_48
-action_147 (8#) = happyGoto action_7
-action_147 (9#) = happyGoto action_8
-action_147 (10#) = happyGoto action_9
-action_147 (11#) = happyGoto action_10
-action_147 (12#) = happyGoto action_84
-action_147 (58#) = happyGoto action_12
-action_147 (59#) = happyGoto action_135
-action_147 (72#) = happyGoto action_19
-action_147 x = happyTcHack x happyReduce_175
-
-action_148 x = happyTcHack x happyReduce_181
-
-action_149 (97#) = happyShift action_22
-action_149 (98#) = happyShift action_87
-action_149 (111#) = happyShift action_24
-action_149 (115#) = happyShift action_25
-action_149 (118#) = happyShift action_27
-action_149 (119#) = happyShift action_28
-action_149 (120#) = happyShift action_29
-action_149 (121#) = happyShift action_30
-action_149 (122#) = happyShift action_31
-action_149 (123#) = happyShift action_32
-action_149 (131#) = happyShift action_35
-action_149 (167#) = happyShift action_44
-action_149 (170#) = happyShift action_6
-action_149 (171#) = happyShift action_45
-action_149 (172#) = happyShift action_46
-action_149 (173#) = happyShift action_47
-action_149 (174#) = happyShift action_48
-action_149 (8#) = happyGoto action_7
-action_149 (9#) = happyGoto action_8
-action_149 (10#) = happyGoto action_9
-action_149 (11#) = happyGoto action_10
-action_149 (12#) = happyGoto action_84
-action_149 (58#) = happyGoto action_12
-action_149 (59#) = happyGoto action_135
-action_149 (72#) = happyGoto action_19
-action_149 x = happyTcHack x happyReduce_178
-
-action_150 (94#) = happyShift action_130
-action_150 (100#) = happyShift action_131
-action_150 (101#) = happyShift action_132
-action_150 x = happyTcHack x happyReduce_192
-
-action_151 x = happyTcHack x happyReduce_179
-
-action_152 x = happyTcHack x happyReduce_184
-
-action_153 (104#) = happyShift action_190
-action_153 (169#) = happyShift action_345
-action_153 x = happyTcHack x happyReduce_128
-
-action_154 (112#) = happyShift action_344
-action_154 x = happyTcHack x happyFail
-
-action_155 (110#) = happyShift action_343
-action_155 x = happyTcHack x happyReduce_230
-
-action_156 (169#) = happyShift action_342
-action_156 x = happyTcHack x happyFail
-
-action_157 (125#) = happyShift action_341
-action_157 x = happyTcHack x happyFail
-
-action_158 (95#) = happyShift action_120
-action_158 (98#) = happyShift action_121
-action_158 (107#) = happyShift action_310
-action_158 (111#) = happyShift action_122
-action_158 (115#) = happyShift action_123
-action_158 (116#) = happyShift action_311
-action_158 (123#) = happyShift action_124
-action_158 (126#) = happyShift action_125
-action_158 (167#) = happyShift action_126
-action_158 (170#) = happyShift action_6
-action_158 (171#) = happyShift action_45
-action_158 (172#) = happyShift action_46
-action_158 (174#) = happyShift action_48
-action_158 (8#) = happyGoto action_115
-action_158 (9#) = happyGoto action_116
-action_158 (10#) = happyGoto action_117
-action_158 (12#) = happyGoto action_118
-action_158 (67#) = happyGoto action_183
-action_158 (74#) = happyGoto action_309
-action_158 x = happyTcHack x happyReduce_203
-
-action_159 (100#) = happyShift action_340
-action_159 x = happyTcHack x happyReduce_217
-
-action_160 x = happyTcHack x happyReduce_220
-
-action_161 (102#) = happyShift action_306
-action_161 (168#) = happyShift action_308
-action_161 x = happyTcHack x happyReduce_242
-
-action_162 (104#) = happyShift action_339
-action_162 x = happyTcHack x happyReduce_247
-
-action_163 (114#) = happyShift action_338
-action_163 x = happyTcHack x happyFail
-
-action_164 (95#) = happyShift action_120
-action_164 (98#) = happyShift action_121
-action_164 (111#) = happyShift action_122
-action_164 (115#) = happyShift action_123
-action_164 (123#) = happyShift action_124
-action_164 (126#) = happyShift action_125
-action_164 (167#) = happyShift action_126
-action_164 (170#) = happyShift action_6
-action_164 (171#) = happyShift action_45
-action_164 (172#) = happyShift action_46
-action_164 (174#) = happyShift action_48
-action_164 (8#) = happyGoto action_115
-action_164 (9#) = happyGoto action_116
-action_164 (10#) = happyGoto action_117
-action_164 (12#) = happyGoto action_118
-action_164 (67#) = happyGoto action_337
-action_164 x = happyTcHack x happyFail
-
-action_165 (99#) = happyShift action_336
-action_165 (102#) = happyShift action_306
-action_165 (168#) = happyShift action_308
-action_165 x = happyTcHack x happyFail
-
-action_166 (107#) = happyShift action_335
-action_166 x = happyTcHack x happyReduce_200
-
-action_167 (174#) = happyShift action_48
-action_167 (12#) = happyGoto action_334
-action_167 x = happyTcHack x happyFail
-
-action_168 x = happyTcHack x happyReduce_142
-
-action_169 (174#) = happyShift action_48
-action_169 (12#) = happyGoto action_333
-action_169 x = happyTcHack x happyFail
-
-action_170 (99#) = happyShift action_332
-action_170 x = happyTcHack x happyReduce_140
-
-action_171 (95#) = happyShift action_21
-action_171 (97#) = happyShift action_22
-action_171 (98#) = happyShift action_23
-action_171 (111#) = happyShift action_24
-action_171 (115#) = happyShift action_25
-action_171 (117#) = happyShift action_26
-action_171 (118#) = happyShift action_27
-action_171 (119#) = happyShift action_28
-action_171 (120#) = happyShift action_29
-action_171 (121#) = happyShift action_30
-action_171 (122#) = happyShift action_31
-action_171 (123#) = happyShift action_32
-action_171 (124#) = happyShift action_33
-action_171 (128#) = happyShift action_34
-action_171 (131#) = happyShift action_35
-action_171 (134#) = happyShift action_36
-action_171 (137#) = happyShift action_37
-action_171 (142#) = happyShift action_38
-action_171 (153#) = happyShift action_39
-action_171 (154#) = happyShift action_40
-action_171 (158#) = happyShift action_41
-action_171 (159#) = happyShift action_42
-action_171 (164#) = happyShift action_43
-action_171 (167#) = happyShift action_44
-action_171 (170#) = happyShift action_6
-action_171 (171#) = happyShift action_45
-action_171 (172#) = happyShift action_46
-action_171 (173#) = happyShift action_47
-action_171 (174#) = happyShift action_48
-action_171 (8#) = happyGoto action_7
-action_171 (9#) = happyGoto action_8
-action_171 (10#) = happyGoto action_9
-action_171 (11#) = happyGoto action_10
-action_171 (12#) = happyGoto action_11
-action_171 (58#) = happyGoto action_12
-action_171 (59#) = happyGoto action_13
-action_171 (60#) = happyGoto action_14
-action_171 (61#) = happyGoto action_15
-action_171 (62#) = happyGoto action_16
-action_171 (63#) = happyGoto action_331
-action_171 (64#) = happyGoto action_18
-action_171 (72#) = happyGoto action_19
-action_171 (77#) = happyGoto action_20
-action_171 x = happyTcHack x happyFail
-
-action_172 x = happyTcHack x happyReduce_156
-
-action_173 x = happyTcHack x happyReduce_153
-
-action_174 (95#) = happyShift action_21
-action_174 (97#) = happyShift action_22
-action_174 (98#) = happyShift action_23
-action_174 (111#) = happyShift action_24
-action_174 (115#) = happyShift action_25
-action_174 (117#) = happyShift action_26
-action_174 (118#) = happyShift action_27
-action_174 (119#) = happyShift action_28
-action_174 (120#) = happyShift action_29
-action_174 (121#) = happyShift action_30
-action_174 (122#) = happyShift action_31
-action_174 (123#) = happyShift action_32
-action_174 (124#) = happyShift action_33
-action_174 (128#) = happyShift action_34
-action_174 (131#) = happyShift action_35
-action_174 (134#) = happyShift action_36
-action_174 (137#) = happyShift action_37
-action_174 (142#) = happyShift action_38
-action_174 (153#) = happyShift action_39
-action_174 (154#) = happyShift action_40
-action_174 (158#) = happyShift action_41
-action_174 (159#) = happyShift action_42
-action_174 (164#) = happyShift action_43
-action_174 (167#) = happyShift action_44
-action_174 (170#) = happyShift action_6
-action_174 (171#) = happyShift action_45
-action_174 (172#) = happyShift action_46
-action_174 (173#) = happyShift action_47
-action_174 (174#) = happyShift action_48
-action_174 (8#) = happyGoto action_7
-action_174 (9#) = happyGoto action_8
-action_174 (10#) = happyGoto action_9
-action_174 (11#) = happyGoto action_10
-action_174 (12#) = happyGoto action_11
-action_174 (58#) = happyGoto action_12
-action_174 (59#) = happyGoto action_13
-action_174 (60#) = happyGoto action_14
-action_174 (61#) = happyGoto action_15
-action_174 (62#) = happyGoto action_16
-action_174 (63#) = happyGoto action_329
-action_174 (64#) = happyGoto action_18
-action_174 (72#) = happyGoto action_19
-action_174 (77#) = happyGoto action_20
-action_174 (78#) = happyGoto action_108
-action_174 (80#) = happyGoto action_330
-action_174 x = happyTcHack x happyReduce_243
-
-action_175 (95#) = happyShift action_21
-action_175 (97#) = happyShift action_22
-action_175 (98#) = happyShift action_23
-action_175 (111#) = happyShift action_24
-action_175 (115#) = happyShift action_25
-action_175 (117#) = happyShift action_26
-action_175 (118#) = happyShift action_27
-action_175 (119#) = happyShift action_28
-action_175 (120#) = happyShift action_29
-action_175 (121#) = happyShift action_30
-action_175 (122#) = happyShift action_31
-action_175 (123#) = happyShift action_32
-action_175 (124#) = happyShift action_33
-action_175 (128#) = happyShift action_34
-action_175 (131#) = happyShift action_35
-action_175 (134#) = happyShift action_36
-action_175 (137#) = happyShift action_37
-action_175 (142#) = happyShift action_38
-action_175 (153#) = happyShift action_39
-action_175 (154#) = happyShift action_40
-action_175 (158#) = happyShift action_41
-action_175 (159#) = happyShift action_42
-action_175 (164#) = happyShift action_43
-action_175 (167#) = happyShift action_44
-action_175 (170#) = happyShift action_6
-action_175 (171#) = happyShift action_45
-action_175 (172#) = happyShift action_46
-action_175 (173#) = happyShift action_47
-action_175 (174#) = happyShift action_48
-action_175 (8#) = happyGoto action_7
-action_175 (9#) = happyGoto action_8
-action_175 (10#) = happyGoto action_9
-action_175 (11#) = happyGoto action_10
-action_175 (12#) = happyGoto action_11
-action_175 (58#) = happyGoto action_12
-action_175 (59#) = happyGoto action_13
-action_175 (60#) = happyGoto action_14
-action_175 (61#) = happyGoto action_15
-action_175 (62#) = happyGoto action_16
-action_175 (63#) = happyGoto action_328
-action_175 (64#) = happyGoto action_18
-action_175 (72#) = happyGoto action_19
-action_175 (77#) = happyGoto action_20
-action_175 x = happyTcHack x happyFail
-
-action_176 (97#) = happyShift action_86
-action_176 (98#) = happyShift action_87
-action_176 (111#) = happyShift action_24
-action_176 (115#) = happyShift action_25
-action_176 (118#) = happyShift action_27
-action_176 (119#) = happyShift action_28
-action_176 (120#) = happyShift action_29
-action_176 (121#) = happyShift action_30
-action_176 (122#) = happyShift action_31
-action_176 (123#) = happyShift action_32
-action_176 (131#) = happyShift action_35
-action_176 (167#) = happyShift action_139
-action_176 (170#) = happyShift action_6
-action_176 (171#) = happyShift action_45
-action_176 (172#) = happyShift action_46
-action_176 (173#) = happyShift action_47
-action_176 (174#) = happyShift action_48
-action_176 (8#) = happyGoto action_7
-action_176 (9#) = happyGoto action_8
-action_176 (10#) = happyGoto action_9
-action_176 (11#) = happyGoto action_10
-action_176 (12#) = happyGoto action_84
-action_176 (58#) = happyGoto action_176
-action_176 (66#) = happyGoto action_327
-action_176 (72#) = happyGoto action_19
-action_176 x = happyTcHack x happyReduce_196
-
-action_177 (125#) = happyShift action_326
-action_177 x = happyTcHack x happyFail
-
-action_178 x = happyTcHack x happyReduce_151
-
-action_179 (113#) = happyShift action_325
-action_179 x = happyTcHack x happyFail
-
-action_180 (95#) = happyShift action_21
-action_180 (97#) = happyShift action_22
-action_180 (98#) = happyShift action_23
-action_180 (111#) = happyShift action_24
-action_180 (115#) = happyShift action_25
-action_180 (117#) = happyShift action_26
-action_180 (118#) = happyShift action_27
-action_180 (119#) = happyShift action_28
-action_180 (120#) = happyShift action_29
-action_180 (121#) = happyShift action_30
-action_180 (122#) = happyShift action_31
-action_180 (123#) = happyShift action_32
-action_180 (124#) = happyShift action_33
-action_180 (128#) = happyShift action_34
-action_180 (131#) = happyShift action_35
-action_180 (134#) = happyShift action_36
-action_180 (137#) = happyShift action_37
-action_180 (142#) = happyShift action_38
-action_180 (153#) = happyShift action_39
-action_180 (154#) = happyShift action_40
-action_180 (158#) = happyShift action_41
-action_180 (159#) = happyShift action_42
-action_180 (164#) = happyShift action_43
-action_180 (167#) = happyShift action_44
-action_180 (170#) = happyShift action_6
-action_180 (171#) = happyShift action_45
-action_180 (172#) = happyShift action_46
-action_180 (173#) = happyShift action_47
-action_180 (174#) = happyShift action_48
-action_180 (8#) = happyGoto action_7
-action_180 (9#) = happyGoto action_8
-action_180 (10#) = happyGoto action_9
-action_180 (11#) = happyGoto action_10
-action_180 (12#) = happyGoto action_11
-action_180 (58#) = happyGoto action_12
-action_180 (59#) = happyGoto action_13
-action_180 (60#) = happyGoto action_14
-action_180 (61#) = happyGoto action_15
-action_180 (62#) = happyGoto action_16
-action_180 (63#) = happyGoto action_324
-action_180 (64#) = happyGoto action_18
-action_180 (72#) = happyGoto action_19
-action_180 (77#) = happyGoto action_20
-action_180 x = happyTcHack x happyFail
-
-action_181 (126#) = happyShift action_102
-action_181 (174#) = happyShift action_48
-action_181 (12#) = happyGoto action_98
-action_181 (75#) = happyGoto action_99
-action_181 (76#) = happyGoto action_323
-action_181 x = happyTcHack x happyReduce_236
-
-action_182 (167#) = happyShift action_322
-action_182 x = happyTcHack x happyFail
-
-action_183 (95#) = happyShift action_120
-action_183 (98#) = happyShift action_121
-action_183 (111#) = happyShift action_122
-action_183 (115#) = happyShift action_123
-action_183 (123#) = happyShift action_124
-action_183 (126#) = happyShift action_125
-action_183 (167#) = happyShift action_126
-action_183 (170#) = happyShift action_6
-action_183 (171#) = happyShift action_45
-action_183 (172#) = happyShift action_46
-action_183 (174#) = happyShift action_48
-action_183 (8#) = happyGoto action_115
-action_183 (9#) = happyGoto action_116
-action_183 (10#) = happyGoto action_117
-action_183 (12#) = happyGoto action_118
-action_183 (67#) = happyGoto action_183
-action_183 (74#) = happyGoto action_321
-action_183 x = happyTcHack x happyReduce_232
-
-action_184 (106#) = happyShift action_320
-action_184 x = happyTcHack x happyFail
-
-action_185 (110#) = happyShift action_319
-action_185 x = happyTcHack x happyReduce_254
-
-action_186 (169#) = happyShift action_318
-action_186 x = happyTcHack x happyFail
-
-action_187 x = happyTcHack x happyReduce_190
-
-action_188 (169#) = happyShift action_317
-action_188 x = happyTcHack x happyFail
-
-action_189 (95#) = happyShift action_21
-action_189 (97#) = happyShift action_22
-action_189 (98#) = happyShift action_23
-action_189 (111#) = happyShift action_24
-action_189 (115#) = happyShift action_25
-action_189 (117#) = happyShift action_26
-action_189 (118#) = happyShift action_27
-action_189 (119#) = happyShift action_28
-action_189 (120#) = happyShift action_29
-action_189 (121#) = happyShift action_30
-action_189 (122#) = happyShift action_31
-action_189 (123#) = happyShift action_32
-action_189 (124#) = happyShift action_33
-action_189 (128#) = happyShift action_34
-action_189 (131#) = happyShift action_35
-action_189 (134#) = happyShift action_36
-action_189 (137#) = happyShift action_37
-action_189 (142#) = happyShift action_38
-action_189 (153#) = happyShift action_39
-action_189 (154#) = happyShift action_40
-action_189 (158#) = happyShift action_41
-action_189 (159#) = happyShift action_42
-action_189 (164#) = happyShift action_43
-action_189 (167#) = happyShift action_44
-action_189 (170#) = happyShift action_6
-action_189 (171#) = happyShift action_45
-action_189 (172#) = happyShift action_46
-action_189 (173#) = happyShift action_47
-action_189 (174#) = happyShift action_48
-action_189 (8#) = happyGoto action_7
-action_189 (9#) = happyGoto action_8
-action_189 (10#) = happyGoto action_9
-action_189 (11#) = happyGoto action_10
-action_189 (12#) = happyGoto action_11
-action_189 (58#) = happyGoto action_12
-action_189 (59#) = happyGoto action_13
-action_189 (60#) = happyGoto action_14
-action_189 (61#) = happyGoto action_15
-action_189 (62#) = happyGoto action_16
-action_189 (63#) = happyGoto action_316
-action_189 (64#) = happyGoto action_18
-action_189 (72#) = happyGoto action_19
-action_189 (77#) = happyGoto action_20
-action_189 x = happyTcHack x happyFail
-
-action_190 (174#) = happyShift action_48
-action_190 (12#) = happyGoto action_92
-action_190 (53#) = happyGoto action_315
-action_190 x = happyTcHack x happyFail
-
-action_191 (110#) = happyShift action_314
-action_191 x = happyTcHack x happyFail
-
-action_192 (110#) = happyShift action_313
-action_192 x = happyTcHack x happyReduce_194
-
-action_193 (169#) = happyShift action_312
-action_193 x = happyTcHack x happyFail
-
-action_194 (95#) = happyShift action_120
-action_194 (98#) = happyShift action_121
-action_194 (104#) = happyShift action_190
-action_194 (107#) = happyShift action_310
-action_194 (109#) = happyReduce_128
-action_194 (111#) = happyShift action_122
-action_194 (112#) = happyReduce_128
-action_194 (115#) = happyShift action_123
-action_194 (116#) = happyShift action_311
-action_194 (123#) = happyShift action_124
-action_194 (126#) = happyShift action_125
-action_194 (167#) = happyShift action_126
-action_194 (169#) = happyShift action_207
-action_194 (170#) = happyShift action_6
-action_194 (171#) = happyShift action_45
-action_194 (172#) = happyShift action_46
-action_194 (174#) = happyShift action_48
-action_194 (8#) = happyGoto action_115
-action_194 (9#) = happyGoto action_116
-action_194 (10#) = happyGoto action_117
-action_194 (12#) = happyGoto action_118
-action_194 (67#) = happyGoto action_183
-action_194 (74#) = happyGoto action_309
-action_194 x = happyTcHack x happyReduce_203
-
-action_195 (102#) = happyShift action_306
-action_195 (113#) = happyShift action_307
-action_195 (168#) = happyShift action_308
-action_195 x = happyTcHack x happyFail
-
-action_196 (110#) = happyShift action_305
-action_196 x = happyTcHack x happyReduce_250
-
-action_197 (169#) = happyShift action_304
-action_197 x = happyTcHack x happyFail
-
-action_198 (97#) = happyShift action_168
-action_198 x = happyTcHack x happyFail
-
-action_199 (95#) = happyShift action_21
-action_199 (97#) = happyShift action_22
-action_199 (98#) = happyShift action_23
-action_199 (111#) = happyShift action_24
-action_199 (115#) = happyShift action_25
-action_199 (117#) = happyShift action_26
-action_199 (118#) = happyShift action_27
-action_199 (119#) = happyShift action_28
-action_199 (120#) = happyShift action_29
-action_199 (121#) = happyShift action_30
-action_199 (122#) = happyShift action_31
-action_199 (123#) = happyShift action_32
-action_199 (124#) = happyShift action_33
-action_199 (128#) = happyShift action_34
-action_199 (131#) = happyShift action_35
-action_199 (134#) = happyShift action_36
-action_199 (137#) = happyShift action_37
-action_199 (142#) = happyShift action_38
-action_199 (153#) = happyShift action_39
-action_199 (154#) = happyShift action_40
-action_199 (158#) = happyShift action_41
-action_199 (159#) = happyShift action_42
-action_199 (164#) = happyShift action_43
-action_199 (167#) = happyShift action_44
-action_199 (170#) = happyShift action_6
-action_199 (171#) = happyShift action_45
-action_199 (172#) = happyShift action_46
-action_199 (173#) = happyShift action_47
-action_199 (174#) = happyShift action_48
-action_199 (8#) = happyGoto action_7
-action_199 (9#) = happyGoto action_8
-action_199 (10#) = happyGoto action_9
-action_199 (11#) = happyGoto action_10
-action_199 (12#) = happyGoto action_11
-action_199 (58#) = happyGoto action_12
-action_199 (59#) = happyGoto action_13
-action_199 (60#) = happyGoto action_14
-action_199 (61#) = happyGoto action_15
-action_199 (62#) = happyGoto action_16
-action_199 (63#) = happyGoto action_192
-action_199 (64#) = happyGoto action_18
-action_199 (65#) = happyGoto action_303
-action_199 (72#) = happyGoto action_19
-action_199 (77#) = happyGoto action_20
-action_199 x = happyTcHack x happyReduce_193
-
-action_200 (95#) = happyShift action_120
-action_200 (98#) = happyShift action_121
-action_200 (105#) = happyShift action_164
-action_200 (111#) = happyShift action_122
-action_200 (115#) = happyShift action_123
-action_200 (123#) = happyShift action_124
-action_200 (126#) = happyShift action_125
-action_200 (167#) = happyShift action_126
-action_200 (170#) = happyShift action_6
-action_200 (171#) = happyShift action_45
-action_200 (172#) = happyShift action_46
-action_200 (174#) = happyShift action_48
-action_200 (8#) = happyGoto action_115
-action_200 (9#) = happyGoto action_116
-action_200 (10#) = happyGoto action_117
-action_200 (12#) = happyGoto action_158
-action_200 (67#) = happyGoto action_159
-action_200 (68#) = happyGoto action_160
-action_200 (69#) = happyGoto action_195
-action_200 (82#) = happyGoto action_196
-action_200 (83#) = happyGoto action_302
-action_200 x = happyTcHack x happyFail
-
-action_201 (169#) = happyShift action_301
-action_201 x = happyTcHack x happyFail
-
-action_202 x = happyTcHack x happyReduce_152
-
-action_203 (174#) = happyShift action_48
-action_203 (12#) = happyGoto action_92
-action_203 (53#) = happyGoto action_80
-action_203 (56#) = happyGoto action_81
-action_203 (57#) = happyGoto action_300
-action_203 x = happyTcHack x happyReduce_137
-
-action_204 (95#) = happyShift action_21
-action_204 (97#) = happyShift action_22
-action_204 (98#) = happyShift action_23
-action_204 (111#) = happyShift action_24
-action_204 (115#) = happyShift action_25
-action_204 (117#) = happyShift action_26
-action_204 (118#) = happyShift action_27
-action_204 (119#) = happyShift action_28
-action_204 (120#) = happyShift action_29
-action_204 (121#) = happyShift action_30
-action_204 (122#) = happyShift action_31
-action_204 (123#) = happyShift action_32
-action_204 (124#) = happyShift action_33
-action_204 (128#) = happyShift action_34
-action_204 (131#) = happyShift action_35
-action_204 (134#) = happyShift action_36
-action_204 (137#) = happyShift action_37
-action_204 (142#) = happyShift action_38
-action_204 (153#) = happyShift action_39
-action_204 (154#) = happyShift action_40
-action_204 (158#) = happyShift action_41
-action_204 (159#) = happyShift action_42
-action_204 (164#) = happyShift action_43
-action_204 (167#) = happyShift action_44
-action_204 (170#) = happyShift action_6
-action_204 (171#) = happyShift action_45
-action_204 (172#) = happyShift action_46
-action_204 (173#) = happyShift action_47
-action_204 (174#) = happyShift action_48
-action_204 (8#) = happyGoto action_7
-action_204 (9#) = happyGoto action_8
-action_204 (10#) = happyGoto action_9
-action_204 (11#) = happyGoto action_10
-action_204 (12#) = happyGoto action_11
-action_204 (58#) = happyGoto action_12
-action_204 (59#) = happyGoto action_13
-action_204 (60#) = happyGoto action_14
-action_204 (61#) = happyGoto action_15
-action_204 (62#) = happyGoto action_16
-action_204 (63#) = happyGoto action_299
-action_204 (64#) = happyGoto action_18
-action_204 (72#) = happyGoto action_19
-action_204 (77#) = happyGoto action_20
-action_204 x = happyTcHack x happyFail
-
-action_205 (95#) = happyShift action_21
-action_205 (97#) = happyShift action_22
-action_205 (98#) = happyShift action_23
-action_205 (111#) = happyShift action_24
-action_205 (115#) = happyShift action_25
-action_205 (117#) = happyShift action_26
-action_205 (118#) = happyShift action_27
-action_205 (119#) = happyShift action_28
-action_205 (120#) = happyShift action_29
-action_205 (121#) = happyShift action_30
-action_205 (122#) = happyShift action_31
-action_205 (123#) = happyShift action_32
-action_205 (124#) = happyShift action_33
-action_205 (128#) = happyShift action_34
-action_205 (131#) = happyShift action_35
-action_205 (134#) = happyShift action_36
-action_205 (137#) = happyShift action_37
-action_205 (142#) = happyShift action_38
-action_205 (153#) = happyShift action_39
-action_205 (154#) = happyShift action_40
-action_205 (158#) = happyShift action_41
-action_205 (159#) = happyShift action_42
-action_205 (164#) = happyShift action_43
-action_205 (167#) = happyShift action_44
-action_205 (170#) = happyShift action_6
-action_205 (171#) = happyShift action_45
-action_205 (172#) = happyShift action_46
-action_205 (173#) = happyShift action_47
-action_205 (174#) = happyShift action_48
-action_205 (8#) = happyGoto action_7
-action_205 (9#) = happyGoto action_8
-action_205 (10#) = happyGoto action_9
-action_205 (11#) = happyGoto action_10
-action_205 (12#) = happyGoto action_11
-action_205 (58#) = happyGoto action_12
-action_205 (59#) = happyGoto action_13
-action_205 (60#) = happyGoto action_14
-action_205 (61#) = happyGoto action_15
-action_205 (62#) = happyGoto action_16
-action_205 (63#) = happyGoto action_298
-action_205 (64#) = happyGoto action_18
-action_205 (72#) = happyGoto action_19
-action_205 (77#) = happyGoto action_20
-action_205 x = happyTcHack x happyFail
-
-action_206 (174#) = happyShift action_48
-action_206 (12#) = happyGoto action_297
-action_206 x = happyTcHack x happyFail
-
-action_207 x = happyTcHack x happyReduce_141
-
-action_208 (1#) = happyReduce_65
-action_208 (101#) = happyReduce_65
-action_208 (148#) = happyReduce_51
-action_208 (157#) = happyShift action_295
-action_208 (162#) = happyShift action_296
-action_208 (174#) = happyShift action_48
-action_208 (12#) = happyGoto action_241
-action_208 (22#) = happyGoto action_291
-action_208 (26#) = happyGoto action_292
-action_208 (32#) = happyGoto action_293
-action_208 (33#) = happyGoto action_294
-action_208 x = happyTcHack x happyReduce_65
-
-action_209 x = happyTcHack x happyReduce_49
-
-action_210 (123#) = happyShift action_290
-action_210 (174#) = happyShift action_48
-action_210 (12#) = happyGoto action_287
-action_210 (36#) = happyGoto action_288
-action_210 (46#) = happyGoto action_289
-action_210 x = happyTcHack x happyFail
-
-action_211 (174#) = happyShift action_48
-action_211 (12#) = happyGoto action_283
-action_211 (37#) = happyGoto action_276
-action_211 (38#) = happyGoto action_284
-action_211 (47#) = happyGoto action_285
-action_211 (48#) = happyGoto action_286
-action_211 (53#) = happyGoto action_278
-action_211 x = happyTcHack x happyFail
-
-action_212 (123#) = happyShift action_257
-action_212 (174#) = happyShift action_48
-action_212 (12#) = happyGoto action_252
-action_212 (34#) = happyGoto action_253
-action_212 (45#) = happyGoto action_282
-action_212 (54#) = happyGoto action_255
-action_212 (55#) = happyGoto action_256
-action_212 x = happyTcHack x happyFail
-
-action_213 (174#) = happyShift action_48
-action_213 (12#) = happyGoto action_279
-action_213 (44#) = happyGoto action_280
-action_213 (51#) = happyGoto action_281
-action_213 x = happyTcHack x happyFail
-
-action_214 (174#) = happyShift action_48
-action_214 (12#) = happyGoto action_92
-action_214 (37#) = happyGoto action_276
-action_214 (47#) = happyGoto action_277
-action_214 (53#) = happyGoto action_278
-action_214 x = happyTcHack x happyFail
-
-action_215 (123#) = happyShift action_257
-action_215 (174#) = happyShift action_48
-action_215 (12#) = happyGoto action_252
-action_215 (34#) = happyGoto action_253
-action_215 (45#) = happyGoto action_275
-action_215 (54#) = happyGoto action_255
-action_215 (55#) = happyGoto action_256
-action_215 x = happyTcHack x happyFail
-
-action_216 (123#) = happyShift action_257
-action_216 (174#) = happyShift action_48
-action_216 (12#) = happyGoto action_252
-action_216 (43#) = happyGoto action_260
-action_216 (50#) = happyGoto action_274
-action_216 (54#) = happyGoto action_262
-action_216 (55#) = happyGoto action_263
-action_216 x = happyTcHack x happyFail
-
-action_217 (123#) = happyShift action_257
-action_217 (174#) = happyShift action_48
-action_217 (12#) = happyGoto action_252
-action_217 (34#) = happyGoto action_253
-action_217 (45#) = happyGoto action_273
-action_217 (54#) = happyGoto action_255
-action_217 (55#) = happyGoto action_256
-action_217 x = happyTcHack x happyFail
-
-action_218 (123#) = happyShift action_257
-action_218 (174#) = happyShift action_48
-action_218 (12#) = happyGoto action_252
-action_218 (34#) = happyGoto action_253
-action_218 (45#) = happyGoto action_272
-action_218 (54#) = happyGoto action_255
-action_218 (55#) = happyGoto action_256
-action_218 x = happyTcHack x happyFail
-
-action_219 (123#) = happyShift action_257
-action_219 (174#) = happyShift action_48
-action_219 (12#) = happyGoto action_252
-action_219 (34#) = happyGoto action_253
-action_219 (45#) = happyGoto action_271
-action_219 (54#) = happyGoto action_255
-action_219 (55#) = happyGoto action_256
-action_219 x = happyTcHack x happyFail
-
-action_220 (174#) = happyShift action_48
-action_220 (12#) = happyGoto action_270
-action_220 x = happyTcHack x happyFail
-
-action_221 (174#) = happyShift action_48
-action_221 (12#) = happyGoto action_267
-action_221 (41#) = happyGoto action_268
-action_221 (49#) = happyGoto action_269
-action_221 x = happyTcHack x happyFail
-
-action_222 (123#) = happyShift action_257
-action_222 (174#) = happyShift action_48
-action_222 (12#) = happyGoto action_252
-action_222 (34#) = happyGoto action_253
-action_222 (45#) = happyGoto action_266
-action_222 (54#) = happyGoto action_255
-action_222 (55#) = happyGoto action_256
-action_222 x = happyTcHack x happyFail
-
-action_223 (123#) = happyShift action_257
-action_223 (129#) = happyShift action_264
-action_223 (135#) = happyShift action_265
-action_223 (174#) = happyShift action_48
-action_223 (12#) = happyGoto action_252
-action_223 (43#) = happyGoto action_260
-action_223 (50#) = happyGoto action_261
-action_223 (54#) = happyGoto action_262
-action_223 (55#) = happyGoto action_263
-action_223 x = happyTcHack x happyFail
-
-action_224 (174#) = happyShift action_48
-action_224 (12#) = happyGoto action_259
-action_224 x = happyTcHack x happyFail
-
-action_225 (123#) = happyShift action_257
-action_225 (174#) = happyShift action_48
-action_225 (12#) = happyGoto action_252
-action_225 (34#) = happyGoto action_253
-action_225 (45#) = happyGoto action_258
-action_225 (54#) = happyGoto action_255
-action_225 (55#) = happyGoto action_256
-action_225 x = happyTcHack x happyFail
-
-action_226 (123#) = happyShift action_257
-action_226 (174#) = happyShift action_48
-action_226 (12#) = happyGoto action_252
-action_226 (34#) = happyGoto action_253
-action_226 (45#) = happyGoto action_254
-action_226 (54#) = happyGoto action_255
-action_226 (55#) = happyGoto action_256
-action_226 x = happyTcHack x happyFail
-
-action_227 x = happyTcHack x happyReduce_269
-
-action_228 x = happyTcHack x happyReduce_270
-
-action_229 x = happyTcHack x happyReduce_271
-
-action_230 (105#) = happyShift action_74
-action_230 (107#) = happyShift action_75
-action_230 (108#) = happyShift action_76
-action_230 (171#) = happyShift action_45
-action_230 (174#) = happyShift action_48
-action_230 (9#) = happyGoto action_70
-action_230 (12#) = happyGoto action_71
-action_230 (92#) = happyGoto action_72
-action_230 (93#) = happyGoto action_251
-action_230 x = happyTcHack x happyReduce_273
-
-action_231 x = happyTcHack x happyReduce_272
-
-action_232 (109#) = happyShift action_250
-action_232 x = happyTcHack x happyFail
-
-action_233 x = happyTcHack x happyReduce_35
-
-action_234 x = happyTcHack x happyReduce_36
-
-action_235 (147#) = happyShift action_249
-action_235 x = happyTcHack x happyFail
-
-action_236 (147#) = happyShift action_248
-action_236 x = happyTcHack x happyFail
-
-action_237 x = happyTcHack x happyReduce_34
-
-action_238 (148#) = happyReduce_51
-action_238 (157#) = happyShift action_246
-action_238 (162#) = happyShift action_247
-action_238 (167#) = happyReduce_51
-action_238 (174#) = happyShift action_48
-action_238 (12#) = happyGoto action_241
-action_238 (24#) = happyGoto action_242
-action_238 (26#) = happyGoto action_243
-action_238 (32#) = happyGoto action_244
-action_238 (33#) = happyGoto action_245
-action_238 x = happyTcHack x happyReduce_65
-
-action_239 (167#) = happyShift action_240
-action_239 x = happyTcHack x happyFail
-
-action_240 (127#) = happyShift action_418
-action_240 x = happyTcHack x happyFail
-
-action_241 (105#) = happyShift action_416
-action_241 (123#) = happyShift action_417
-action_241 x = happyTcHack x happyReduce_68
-
-action_242 x = happyTcHack x happyReduce_15
-
-action_243 (148#) = happyShift action_382
-action_243 (28#) = happyGoto action_415
-action_243 x = happyTcHack x happyReduce_55
-
-action_244 (101#) = happyShift action_414
-action_244 x = happyTcHack x happyReduce_41
-
-action_245 (104#) = happyShift action_378
-action_245 (166#) = happyShift action_413
-action_245 x = happyTcHack x happyReduce_66
-
-action_246 (174#) = happyShift action_48
-action_246 (12#) = happyGoto action_412
-action_246 x = happyTcHack x happyFail
-
-action_247 (174#) = happyShift action_48
-action_247 (12#) = happyGoto action_241
-action_247 (32#) = happyGoto action_411
-action_247 (33#) = happyGoto action_376
-action_247 x = happyTcHack x happyReduce_65
-
-action_248 (174#) = happyShift action_48
-action_248 (12#) = happyGoto action_410
-action_248 x = happyTcHack x happyFail
-
-action_249 (174#) = happyShift action_48
-action_249 (12#) = happyGoto action_409
-action_249 x = happyTcHack x happyFail
-
-action_250 (98#) = happyShift action_408
-action_250 (174#) = happyShift action_48
-action_250 (12#) = happyGoto action_406
-action_250 (29#) = happyGoto action_407
-action_250 x = happyTcHack x happyFail
-
-action_251 x = happyTcHack x happyReduce_274
-
-action_252 x = happyTcHack x happyReduce_130
-
-action_253 (110#) = happyShift action_405
-action_253 x = happyTcHack x happyFail
-
-action_254 x = happyTcHack x happyReduce_93
-
-action_255 (95#) = happyShift action_120
-action_255 (98#) = happyShift action_121
-action_255 (104#) = happyShift action_398
-action_255 (111#) = happyShift action_122
-action_255 (115#) = happyShift action_123
-action_255 (123#) = happyShift action_124
-action_255 (126#) = happyShift action_125
-action_255 (167#) = happyShift action_126
-action_255 (170#) = happyShift action_6
-action_255 (171#) = happyShift action_45
-action_255 (172#) = happyShift action_46
-action_255 (174#) = happyShift action_48
-action_255 (8#) = happyGoto action_115
-action_255 (9#) = happyGoto action_116
-action_255 (10#) = happyGoto action_117
-action_255 (12#) = happyGoto action_118
-action_255 (67#) = happyGoto action_183
-action_255 (74#) = happyGoto action_404
-action_255 x = happyTcHack x happyReduce_132
-
-action_256 (109#) = happyShift action_402
-action_256 (112#) = happyShift action_403
-action_256 x = happyTcHack x happyFail
-
-action_257 (174#) = happyShift action_48
-action_257 (12#) = happyGoto action_401
-action_257 x = happyTcHack x happyFail
-
-action_258 x = happyTcHack x happyReduce_80
-
-action_259 (110#) = happyShift action_400
-action_259 x = happyTcHack x happyFail
-
-action_260 (110#) = happyShift action_399
-action_260 x = happyTcHack x happyFail
-
-action_261 x = happyTcHack x happyReduce_89
-
-action_262 (104#) = happyShift action_398
-action_262 x = happyTcHack x happyReduce_132
-
-action_263 (112#) = happyShift action_397
-action_263 x = happyTcHack x happyFail
-
-action_264 (123#) = happyShift action_257
-action_264 (174#) = happyShift action_48
-action_264 (12#) = happyGoto action_252
-action_264 (43#) = happyGoto action_260
-action_264 (50#) = happyGoto action_396
-action_264 (54#) = happyGoto action_262
-action_264 (55#) = happyGoto action_263
-action_264 x = happyTcHack x happyFail
-
-action_265 (123#) = happyShift action_257
-action_265 (174#) = happyShift action_48
-action_265 (12#) = happyGoto action_252
-action_265 (43#) = happyGoto action_260
-action_265 (50#) = happyGoto action_395
-action_265 (54#) = happyGoto action_262
-action_265 (55#) = happyGoto action_263
-action_265 x = happyTcHack x happyFail
-
-action_266 x = happyTcHack x happyReduce_91
-
-action_267 (112#) = happyShift action_394
-action_267 x = happyTcHack x happyReduce_107
-
-action_268 (110#) = happyShift action_393
-action_268 x = happyTcHack x happyFail
-
-action_269 x = happyTcHack x happyReduce_81
-
-action_270 (112#) = happyShift action_392
-action_270 x = happyTcHack x happyFail
-
-action_271 x = happyTcHack x happyReduce_82
-
-action_272 x = happyTcHack x happyReduce_90
-
-action_273 x = happyTcHack x happyReduce_84
-
-action_274 x = happyTcHack x happyReduce_83
-
-action_275 x = happyTcHack x happyReduce_85
-
-action_276 (110#) = happyShift action_391
-action_276 x = happyTcHack x happyFail
-
-action_277 x = happyTcHack x happyReduce_76
-
-action_278 (109#) = happyShift action_390
-action_278 x = happyTcHack x happyFail
-
-action_279 (112#) = happyShift action_389
-action_279 x = happyTcHack x happyFail
-
-action_280 (110#) = happyShift action_388
-action_280 x = happyTcHack x happyFail
-
-action_281 x = happyTcHack x happyReduce_88
-
-action_282 x = happyTcHack x happyReduce_78
-
-action_283 (104#) = happyShift action_190
-action_283 (112#) = happyShift action_387
-action_283 x = happyTcHack x happyReduce_128
-
-action_284 (110#) = happyShift action_386
-action_284 x = happyTcHack x happyFail
-
-action_285 x = happyTcHack x happyReduce_77
-
-action_286 x = happyTcHack x happyReduce_79
-
-action_287 (89#) = happyGoto action_385
-action_287 x = happyTcHack x happyReduce_262
-
-action_288 (110#) = happyShift action_384
-action_288 x = happyTcHack x happyFail
-
-action_289 x = happyTcHack x happyReduce_75
-
-action_290 (174#) = happyShift action_48
-action_290 (12#) = happyGoto action_383
-action_290 x = happyTcHack x happyFail
-
-action_291 x = happyTcHack x happyReduce_25
-
-action_292 (148#) = happyShift action_382
-action_292 (28#) = happyGoto action_381
-action_292 x = happyTcHack x happyReduce_55
-
-action_293 (101#) = happyShift action_380
-action_293 x = happyTcHack x happyReduce_27
-
-action_294 (104#) = happyShift action_378
-action_294 (166#) = happyShift action_379
-action_294 x = happyTcHack x happyReduce_66
-
-action_295 (174#) = happyShift action_48
-action_295 (12#) = happyGoto action_377
-action_295 x = happyTcHack x happyFail
-
-action_296 (174#) = happyShift action_48
-action_296 (12#) = happyGoto action_241
-action_296 (32#) = happyGoto action_375
-action_296 (33#) = happyGoto action_376
-action_296 x = happyTcHack x happyReduce_65
-
-action_297 (169#) = happyShift action_374
-action_297 x = happyTcHack x happyFail
-
-action_298 x = happyTcHack x happyReduce_135
-
-action_299 (112#) = happyShift action_373
-action_299 x = happyTcHack x happyReduce_134
-
-action_300 x = happyTcHack x happyReduce_139
-
-action_301 x = happyTcHack x happyReduce_167
-
-action_302 (169#) = happyShift action_372
-action_302 x = happyTcHack x happyFail
-
-action_303 (125#) = happyShift action_371
-action_303 x = happyTcHack x happyFail
-
-action_304 x = happyTcHack x happyReduce_163
-
-action_305 (95#) = happyShift action_120
-action_305 (98#) = happyShift action_121
-action_305 (105#) = happyShift action_164
-action_305 (111#) = happyShift action_122
-action_305 (115#) = happyShift action_123
-action_305 (123#) = happyShift action_124
-action_305 (126#) = happyShift action_125
-action_305 (167#) = happyShift action_126
-action_305 (170#) = happyShift action_6
-action_305 (171#) = happyShift action_45
-action_305 (172#) = happyShift action_46
-action_305 (174#) = happyShift action_48
-action_305 (8#) = happyGoto action_115
-action_305 (9#) = happyGoto action_116
-action_305 (10#) = happyGoto action_117
-action_305 (12#) = happyGoto action_158
-action_305 (67#) = happyGoto action_159
-action_305 (68#) = happyGoto action_160
-action_305 (69#) = happyGoto action_195
-action_305 (82#) = happyGoto action_196
-action_305 (83#) = happyGoto action_370
-action_305 x = happyTcHack x happyFail
-
-action_306 (95#) = happyShift action_120
-action_306 (98#) = happyShift action_121
-action_306 (105#) = happyShift action_164
-action_306 (111#) = happyShift action_122
-action_306 (115#) = happyShift action_123
-action_306 (123#) = happyShift action_124
-action_306 (126#) = happyShift action_125
-action_306 (167#) = happyShift action_126
-action_306 (170#) = happyShift action_6
-action_306 (171#) = happyShift action_45
-action_306 (172#) = happyShift action_46
-action_306 (174#) = happyShift action_48
-action_306 (8#) = happyGoto action_115
-action_306 (9#) = happyGoto action_116
-action_306 (10#) = happyGoto action_117
-action_306 (12#) = happyGoto action_158
-action_306 (67#) = happyGoto action_159
-action_306 (68#) = happyGoto action_369
-action_306 x = happyTcHack x happyFail
-
-action_307 (95#) = happyShift action_21
-action_307 (97#) = happyShift action_22
-action_307 (98#) = happyShift action_23
-action_307 (111#) = happyShift action_24
-action_307 (115#) = happyShift action_25
-action_307 (117#) = happyShift action_26
-action_307 (118#) = happyShift action_27
-action_307 (119#) = happyShift action_28
-action_307 (120#) = happyShift action_29
-action_307 (121#) = happyShift action_30
-action_307 (122#) = happyShift action_31
-action_307 (123#) = happyShift action_32
-action_307 (124#) = happyShift action_33
-action_307 (128#) = happyShift action_34
-action_307 (131#) = happyShift action_35
-action_307 (134#) = happyShift action_36
-action_307 (137#) = happyShift action_37
-action_307 (142#) = happyShift action_38
-action_307 (153#) = happyShift action_39
-action_307 (154#) = happyShift action_40
-action_307 (158#) = happyShift action_41
-action_307 (159#) = happyShift action_42
-action_307 (164#) = happyShift action_43
-action_307 (167#) = happyShift action_44
-action_307 (170#) = happyShift action_6
-action_307 (171#) = happyShift action_45
-action_307 (172#) = happyShift action_46
-action_307 (173#) = happyShift action_47
-action_307 (174#) = happyShift action_48
-action_307 (8#) = happyGoto action_7
-action_307 (9#) = happyGoto action_8
-action_307 (10#) = happyGoto action_9
-action_307 (11#) = happyGoto action_10
-action_307 (12#) = happyGoto action_11
-action_307 (58#) = happyGoto action_12
-action_307 (59#) = happyGoto action_13
-action_307 (60#) = happyGoto action_14
-action_307 (61#) = happyGoto action_15
-action_307 (62#) = happyGoto action_16
-action_307 (63#) = happyGoto action_368
-action_307 (64#) = happyGoto action_18
-action_307 (72#) = happyGoto action_19
-action_307 (77#) = happyGoto action_20
-action_307 x = happyTcHack x happyFail
-
-action_308 (95#) = happyShift action_120
-action_308 (98#) = happyShift action_121
-action_308 (105#) = happyShift action_164
-action_308 (111#) = happyShift action_122
-action_308 (115#) = happyShift action_123
-action_308 (123#) = happyShift action_124
-action_308 (126#) = happyShift action_125
-action_308 (167#) = happyShift action_126
-action_308 (170#) = happyShift action_6
-action_308 (171#) = happyShift action_45
-action_308 (172#) = happyShift action_46
-action_308 (174#) = happyShift action_48
-action_308 (8#) = happyGoto action_115
-action_308 (9#) = happyGoto action_116
-action_308 (10#) = happyGoto action_117
-action_308 (12#) = happyGoto action_158
-action_308 (67#) = happyGoto action_159
-action_308 (68#) = happyGoto action_367
-action_308 x = happyTcHack x happyFail
-
-action_309 x = happyTcHack x happyReduce_212
-
-action_310 (174#) = happyShift action_48
-action_310 (12#) = happyGoto action_366
-action_310 x = happyTcHack x happyFail
-
-action_311 (95#) = happyShift action_120
-action_311 (98#) = happyShift action_121
-action_311 (111#) = happyShift action_122
-action_311 (115#) = happyShift action_123
-action_311 (123#) = happyShift action_124
-action_311 (126#) = happyShift action_125
-action_311 (167#) = happyShift action_126
-action_311 (170#) = happyShift action_6
-action_311 (171#) = happyShift action_45
-action_311 (172#) = happyShift action_46
-action_311 (174#) = happyShift action_48
-action_311 (8#) = happyGoto action_115
-action_311 (9#) = happyGoto action_116
-action_311 (10#) = happyGoto action_117
-action_311 (12#) = happyGoto action_118
-action_311 (67#) = happyGoto action_365
-action_311 x = happyTcHack x happyFail
-
-action_312 x = happyTcHack x happyReduce_169
-
-action_313 (95#) = happyShift action_21
-action_313 (97#) = happyShift action_22
-action_313 (98#) = happyShift action_23
-action_313 (111#) = happyShift action_24
-action_313 (115#) = happyShift action_25
-action_313 (117#) = happyShift action_26
-action_313 (118#) = happyShift action_27
-action_313 (119#) = happyShift action_28
-action_313 (120#) = happyShift action_29
-action_313 (121#) = happyShift action_30
-action_313 (122#) = happyShift action_31
-action_313 (123#) = happyShift action_32
-action_313 (124#) = happyShift action_33
-action_313 (128#) = happyShift action_34
-action_313 (131#) = happyShift action_35
-action_313 (134#) = happyShift action_36
-action_313 (137#) = happyShift action_37
-action_313 (142#) = happyShift action_38
-action_313 (153#) = happyShift action_39
-action_313 (154#) = happyShift action_40
-action_313 (158#) = happyShift action_41
-action_313 (159#) = happyShift action_42
-action_313 (164#) = happyShift action_43
-action_313 (167#) = happyShift action_44
-action_313 (170#) = happyShift action_6
-action_313 (171#) = happyShift action_45
-action_313 (172#) = happyShift action_46
-action_313 (173#) = happyShift action_47
-action_313 (174#) = happyShift action_48
-action_313 (8#) = happyGoto action_7
-action_313 (9#) = happyGoto action_8
-action_313 (10#) = happyGoto action_9
-action_313 (11#) = happyGoto action_10
-action_313 (12#) = happyGoto action_11
-action_313 (58#) = happyGoto action_12
-action_313 (59#) = happyGoto action_13
-action_313 (60#) = happyGoto action_14
-action_313 (61#) = happyGoto action_15
-action_313 (62#) = happyGoto action_16
-action_313 (63#) = happyGoto action_192
-action_313 (64#) = happyGoto action_18
-action_313 (65#) = happyGoto action_364
-action_313 (72#) = happyGoto action_19
-action_313 (77#) = happyGoto action_20
-action_313 x = happyTcHack x happyReduce_193
-
-action_314 (95#) = happyShift action_21
-action_314 (97#) = happyShift action_22
-action_314 (98#) = happyShift action_23
-action_314 (111#) = happyShift action_24
-action_314 (115#) = happyShift action_25
-action_314 (117#) = happyShift action_26
-action_314 (118#) = happyShift action_27
-action_314 (119#) = happyShift action_28
-action_314 (120#) = happyShift action_29
-action_314 (121#) = happyShift action_30
-action_314 (122#) = happyShift action_31
-action_314 (123#) = happyShift action_32
-action_314 (124#) = happyShift action_33
-action_314 (128#) = happyShift action_34
-action_314 (131#) = happyShift action_35
-action_314 (134#) = happyShift action_36
-action_314 (137#) = happyShift action_37
-action_314 (142#) = happyShift action_38
-action_314 (153#) = happyShift action_39
-action_314 (154#) = happyShift action_40
-action_314 (158#) = happyShift action_41
-action_314 (159#) = happyShift action_42
-action_314 (164#) = happyShift action_43
-action_314 (167#) = happyShift action_44
-action_314 (170#) = happyShift action_6
-action_314 (171#) = happyShift action_45
-action_314 (172#) = happyShift action_46
-action_314 (173#) = happyShift action_47
-action_314 (174#) = happyShift action_48
-action_314 (8#) = happyGoto action_7
-action_314 (9#) = happyGoto action_8
-action_314 (10#) = happyGoto action_9
-action_314 (11#) = happyGoto action_10
-action_314 (12#) = happyGoto action_11
-action_314 (58#) = happyGoto action_12
-action_314 (59#) = happyGoto action_13
-action_314 (60#) = happyGoto action_14
-action_314 (61#) = happyGoto action_15
-action_314 (62#) = happyGoto action_16
-action_314 (63#) = happyGoto action_361
-action_314 (64#) = happyGoto action_18
-action_314 (72#) = happyGoto action_19
-action_314 (77#) = happyGoto action_20
-action_314 (86#) = happyGoto action_362
-action_314 (87#) = happyGoto action_363
-action_314 x = happyTcHack x happyReduce_257
-
-action_315 x = happyTcHack x happyReduce_129
-
-action_316 x = happyTcHack x happyReduce_187
-
-action_317 (137#) = happyShift action_360
-action_317 x = happyTcHack x happyFail
-
-action_318 x = happyTcHack x happyReduce_189
-
-action_319 (95#) = happyShift action_120
-action_319 (98#) = happyShift action_121
-action_319 (111#) = happyShift action_122
-action_319 (115#) = happyShift action_123
-action_319 (123#) = happyShift action_124
-action_319 (126#) = happyShift action_125
-action_319 (167#) = happyShift action_126
-action_319 (170#) = happyShift action_6
-action_319 (171#) = happyShift action_45
-action_319 (172#) = happyShift action_46
-action_319 (174#) = happyShift action_48
-action_319 (8#) = happyGoto action_115
-action_319 (9#) = happyGoto action_116
-action_319 (10#) = happyGoto action_117
-action_319 (12#) = happyGoto action_118
-action_319 (67#) = happyGoto action_183
-action_319 (74#) = happyGoto action_184
-action_319 (84#) = happyGoto action_185
-action_319 (85#) = happyGoto action_359
-action_319 x = happyTcHack x happyReduce_253
-
-action_320 (95#) = happyShift action_21
-action_320 (97#) = happyShift action_22
-action_320 (98#) = happyShift action_23
-action_320 (111#) = happyShift action_24
-action_320 (115#) = happyShift action_25
-action_320 (117#) = happyShift action_26
-action_320 (118#) = happyShift action_27
-action_320 (119#) = happyShift action_28
-action_320 (120#) = happyShift action_29
-action_320 (121#) = happyShift action_30
-action_320 (122#) = happyShift action_31
-action_320 (123#) = happyShift action_32
-action_320 (124#) = happyShift action_33
-action_320 (128#) = happyShift action_34
-action_320 (131#) = happyShift action_35
-action_320 (134#) = happyShift action_36
-action_320 (137#) = happyShift action_37
-action_320 (142#) = happyShift action_38
-action_320 (153#) = happyShift action_39
-action_320 (154#) = happyShift action_40
-action_320 (158#) = happyShift action_41
-action_320 (159#) = happyShift action_42
-action_320 (164#) = happyShift action_43
-action_320 (167#) = happyShift action_44
-action_320 (170#) = happyShift action_6
-action_320 (171#) = happyShift action_45
-action_320 (172#) = happyShift action_46
-action_320 (173#) = happyShift action_47
-action_320 (174#) = happyShift action_48
-action_320 (8#) = happyGoto action_7
-action_320 (9#) = happyGoto action_8
-action_320 (10#) = happyGoto action_9
-action_320 (11#) = happyGoto action_10
-action_320 (12#) = happyGoto action_11
-action_320 (58#) = happyGoto action_12
-action_320 (59#) = happyGoto action_13
-action_320 (60#) = happyGoto action_14
-action_320 (61#) = happyGoto action_15
-action_320 (62#) = happyGoto action_16
-action_320 (63#) = happyGoto action_358
-action_320 (64#) = happyGoto action_18
-action_320 (72#) = happyGoto action_19
-action_320 (77#) = happyGoto action_20
-action_320 x = happyTcHack x happyFail
-
-action_321 x = happyTcHack x happyReduce_233
-
-action_322 (95#) = happyShift action_120
-action_322 (98#) = happyShift action_121
-action_322 (105#) = happyShift action_164
-action_322 (111#) = happyShift action_122
-action_322 (115#) = happyShift action_123
-action_322 (123#) = happyShift action_124
-action_322 (126#) = happyShift action_125
-action_322 (167#) = happyShift action_126
-action_322 (170#) = happyShift action_6
-action_322 (171#) = happyShift action_45
-action_322 (172#) = happyShift action_46
-action_322 (174#) = happyShift action_48
-action_322 (8#) = happyGoto action_115
-action_322 (9#) = happyGoto action_116
-action_322 (10#) = happyGoto action_117
-action_322 (12#) = happyGoto action_158
-action_322 (67#) = happyGoto action_159
-action_322 (68#) = happyGoto action_160
-action_322 (69#) = happyGoto action_195
-action_322 (82#) = happyGoto action_196
-action_322 (83#) = happyGoto action_357
-action_322 x = happyTcHack x happyFail
-
-action_323 x = happyTcHack x happyReduce_238
-
-action_324 x = happyTcHack x happyReduce_182
-
-action_325 (95#) = happyShift action_21
-action_325 (97#) = happyShift action_22
-action_325 (98#) = happyShift action_23
-action_325 (111#) = happyShift action_24
-action_325 (115#) = happyShift action_25
-action_325 (117#) = happyShift action_26
-action_325 (118#) = happyShift action_27
-action_325 (119#) = happyShift action_28
-action_325 (120#) = happyShift action_29
-action_325 (121#) = happyShift action_30
-action_325 (122#) = happyShift action_31
-action_325 (123#) = happyShift action_32
-action_325 (124#) = happyShift action_33
-action_325 (128#) = happyShift action_34
-action_325 (131#) = happyShift action_35
-action_325 (134#) = happyShift action_36
-action_325 (137#) = happyShift action_37
-action_325 (142#) = happyShift action_38
-action_325 (153#) = happyShift action_39
-action_325 (154#) = happyShift action_40
-action_325 (158#) = happyShift action_41
-action_325 (159#) = happyShift action_42
-action_325 (164#) = happyShift action_43
-action_325 (167#) = happyShift action_44
-action_325 (170#) = happyShift action_6
-action_325 (171#) = happyShift action_45
-action_325 (172#) = happyShift action_46
-action_325 (173#) = happyShift action_47
-action_325 (174#) = happyShift action_48
-action_325 (8#) = happyGoto action_7
-action_325 (9#) = happyGoto action_8
-action_325 (10#) = happyGoto action_9
-action_325 (11#) = happyGoto action_10
-action_325 (12#) = happyGoto action_11
-action_325 (58#) = happyGoto action_12
-action_325 (59#) = happyGoto action_13
-action_325 (60#) = happyGoto action_14
-action_325 (61#) = happyGoto action_15
-action_325 (62#) = happyGoto action_16
-action_325 (63#) = happyGoto action_356
-action_325 (64#) = happyGoto action_18
-action_325 (72#) = happyGoto action_19
-action_325 (77#) = happyGoto action_20
-action_325 x = happyTcHack x happyFail
-
-action_326 x = happyTcHack x happyReduce_150
-
-action_327 x = happyTcHack x happyReduce_197
-
-action_328 (114#) = happyShift action_355
-action_328 x = happyTcHack x happyFail
-
-action_329 x = happyTcHack x happyReduce_241
-
-action_330 x = happyTcHack x happyReduce_245
-
-action_331 (99#) = happyShift action_354
-action_331 x = happyTcHack x happyFail
-
-action_332 x = happyTcHack x happyReduce_154
-
-action_333 x = happyTcHack x happyReduce_160
-
-action_334 x = happyTcHack x happyReduce_205
-
-action_335 (174#) = happyShift action_48
-action_335 (12#) = happyGoto action_353
-action_335 x = happyTcHack x happyFail
-
-action_336 x = happyTcHack x happyReduce_211
-
-action_337 x = happyTcHack x happyReduce_216
-
-action_338 x = happyTcHack x happyReduce_210
-
-action_339 (95#) = happyShift action_120
-action_339 (98#) = happyShift action_121
-action_339 (105#) = happyShift action_164
-action_339 (111#) = happyShift action_122
-action_339 (115#) = happyShift action_123
-action_339 (123#) = happyShift action_124
-action_339 (126#) = happyShift action_125
-action_339 (167#) = happyShift action_126
-action_339 (170#) = happyShift action_6
-action_339 (171#) = happyShift action_45
-action_339 (172#) = happyShift action_46
-action_339 (174#) = happyShift action_48
-action_339 (8#) = happyGoto action_115
-action_339 (9#) = happyGoto action_116
-action_339 (10#) = happyGoto action_117
-action_339 (12#) = happyGoto action_158
-action_339 (67#) = happyGoto action_159
-action_339 (68#) = happyGoto action_160
-action_339 (69#) = happyGoto action_161
-action_339 (79#) = happyGoto action_162
-action_339 (81#) = happyGoto action_352
-action_339 x = happyTcHack x happyReduce_246
-
-action_340 x = happyTcHack x happyReduce_214
-
-action_341 x = happyTcHack x happyReduce_199
-
-action_342 x = happyTcHack x happyReduce_209
-
-action_343 (174#) = happyShift action_48
-action_343 (12#) = happyGoto action_92
-action_343 (53#) = happyGoto action_154
-action_343 (70#) = happyGoto action_155
-action_343 (73#) = happyGoto action_351
-action_343 x = happyTcHack x happyReduce_229
-
-action_344 (95#) = happyShift action_120
-action_344 (98#) = happyShift action_121
-action_344 (105#) = happyShift action_164
-action_344 (111#) = happyShift action_122
-action_344 (115#) = happyShift action_123
-action_344 (123#) = happyShift action_124
-action_344 (126#) = happyShift action_125
-action_344 (167#) = happyShift action_126
-action_344 (170#) = happyShift action_6
-action_344 (171#) = happyShift action_45
-action_344 (172#) = happyShift action_46
-action_344 (174#) = happyShift action_48
-action_344 (8#) = happyGoto action_115
-action_344 (9#) = happyGoto action_116
-action_344 (10#) = happyGoto action_117
-action_344 (12#) = happyGoto action_158
-action_344 (67#) = happyGoto action_159
-action_344 (68#) = happyGoto action_160
-action_344 (69#) = happyGoto action_350
-action_344 x = happyTcHack x happyFail
-
-action_345 x = happyTcHack x happyReduce_204
-
-action_346 (169#) = happyShift action_349
-action_346 x = happyTcHack x happyFail
-
-action_347 x = happyTcHack x happyReduce_223
-
-action_348 (104#) = happyShift action_190
-action_348 (169#) = happyShift action_207
-action_348 x = happyTcHack x happyReduce_128
-
-action_349 x = happyTcHack x happyReduce_188
-
-action_350 (102#) = happyShift action_306
-action_350 (168#) = happyShift action_308
-action_350 x = happyTcHack x happyReduce_221
-
-action_351 x = happyTcHack x happyReduce_231
-
-action_352 x = happyTcHack x happyReduce_248
-
-action_353 x = happyTcHack x happyReduce_201
-
-action_354 x = happyTcHack x happyReduce_239
-
-action_355 x = happyTcHack x happyReduce_155
-
-action_356 x = happyTcHack x happyReduce_183
-
-action_357 (169#) = happyShift action_468
-action_357 x = happyTcHack x happyFail
-
-action_358 x = happyTcHack x happyReduce_252
-
-action_359 x = happyTcHack x happyReduce_255
-
-action_360 (95#) = happyShift action_21
-action_360 (97#) = happyShift action_22
-action_360 (98#) = happyShift action_23
-action_360 (111#) = happyShift action_24
-action_360 (115#) = happyShift action_25
-action_360 (117#) = happyShift action_26
-action_360 (118#) = happyShift action_27
-action_360 (119#) = happyShift action_28
-action_360 (120#) = happyShift action_29
-action_360 (121#) = happyShift action_30
-action_360 (122#) = happyShift action_31
-action_360 (123#) = happyShift action_32
-action_360 (124#) = happyShift action_33
-action_360 (128#) = happyShift action_34
-action_360 (131#) = happyShift action_35
-action_360 (134#) = happyShift action_36
-action_360 (137#) = happyShift action_37
-action_360 (142#) = happyShift action_38
-action_360 (153#) = happyShift action_39
-action_360 (154#) = happyShift action_40
-action_360 (158#) = happyShift action_41
-action_360 (159#) = happyShift action_42
-action_360 (164#) = happyShift action_43
-action_360 (167#) = happyShift action_44
-action_360 (170#) = happyShift action_6
-action_360 (171#) = happyShift action_45
-action_360 (172#) = happyShift action_46
-action_360 (173#) = happyShift action_47
-action_360 (174#) = happyShift action_48
-action_360 (8#) = happyGoto action_7
-action_360 (9#) = happyGoto action_8
-action_360 (10#) = happyGoto action_9
-action_360 (11#) = happyGoto action_10
-action_360 (12#) = happyGoto action_11
-action_360 (58#) = happyGoto action_12
-action_360 (59#) = happyGoto action_13
-action_360 (60#) = happyGoto action_14
-action_360 (61#) = happyGoto action_15
-action_360 (62#) = happyGoto action_16
-action_360 (63#) = happyGoto action_467
-action_360 (64#) = happyGoto action_18
-action_360 (72#) = happyGoto action_19
-action_360 (77#) = happyGoto action_20
-action_360 x = happyTcHack x happyFail
-
-action_361 (108#) = happyShift action_466
-action_361 x = happyTcHack x happyFail
-
-action_362 (110#) = happyShift action_465
-action_362 x = happyTcHack x happyReduce_258
-
-action_363 (169#) = happyShift action_464
-action_363 x = happyTcHack x happyFail
-
-action_364 x = happyTcHack x happyReduce_195
-
-action_365 x = happyTcHack x happyReduce_215
-
-action_366 (95#) = happyShift action_120
-action_366 (98#) = happyShift action_121
-action_366 (111#) = happyShift action_122
-action_366 (115#) = happyShift action_123
-action_366 (123#) = happyShift action_124
-action_366 (126#) = happyShift action_125
-action_366 (167#) = happyShift action_126
-action_366 (170#) = happyShift action_6
-action_366 (171#) = happyShift action_45
-action_366 (172#) = happyShift action_46
-action_366 (174#) = happyShift action_48
-action_366 (8#) = happyGoto action_115
-action_366 (9#) = happyGoto action_116
-action_366 (10#) = happyGoto action_117
-action_366 (12#) = happyGoto action_118
-action_366 (67#) = happyGoto action_183
-action_366 (74#) = happyGoto action_463
-action_366 x = happyTcHack x happyReduce_205
-
-action_367 x = happyTcHack x happyReduce_218
-
-action_368 x = happyTcHack x happyReduce_249
-
-action_369 x = happyTcHack x happyReduce_219
-
-action_370 x = happyTcHack x happyReduce_251
-
-action_371 x = happyTcHack x happyReduce_165
-
-action_372 x = happyTcHack x happyReduce_164
-
-action_373 (95#) = happyShift action_21
-action_373 (97#) = happyShift action_22
-action_373 (98#) = happyShift action_23
-action_373 (111#) = happyShift action_24
-action_373 (115#) = happyShift action_25
-action_373 (117#) = happyShift action_26
-action_373 (118#) = happyShift action_27
-action_373 (119#) = happyShift action_28
-action_373 (120#) = happyShift action_29
-action_373 (121#) = happyShift action_30
-action_373 (122#) = happyShift action_31
-action_373 (123#) = happyShift action_32
-action_373 (124#) = happyShift action_33
-action_373 (128#) = happyShift action_34
-action_373 (131#) = happyShift action_35
-action_373 (134#) = happyShift action_36
-action_373 (137#) = happyShift action_37
-action_373 (142#) = happyShift action_38
-action_373 (153#) = happyShift action_39
-action_373 (154#) = happyShift action_40
-action_373 (158#) = happyShift action_41
-action_373 (159#) = happyShift action_42
-action_373 (164#) = happyShift action_43
-action_373 (167#) = happyShift action_44
-action_373 (170#) = happyShift action_6
-action_373 (171#) = happyShift action_45
-action_373 (172#) = happyShift action_46
-action_373 (173#) = happyShift action_47
-action_373 (174#) = happyShift action_48
-action_373 (8#) = happyGoto action_7
-action_373 (9#) = happyGoto action_8
-action_373 (10#) = happyGoto action_9
-action_373 (11#) = happyGoto action_10
-action_373 (12#) = happyGoto action_11
-action_373 (58#) = happyGoto action_12
-action_373 (59#) = happyGoto action_13
-action_373 (60#) = happyGoto action_14
-action_373 (61#) = happyGoto action_15
-action_373 (62#) = happyGoto action_16
-action_373 (63#) = happyGoto action_462
-action_373 (64#) = happyGoto action_18
-action_373 (72#) = happyGoto action_19
-action_373 (77#) = happyGoto action_20
-action_373 x = happyTcHack x happyFail
-
-action_374 x = happyTcHack x happyReduce_159
-
-action_375 x = happyTcHack x happyReduce_33
-
-action_376 (104#) = happyShift action_378
-action_376 x = happyTcHack x happyReduce_66
-
-action_377 x = happyTcHack x happyReduce_32
-
-action_378 (174#) = happyShift action_48
-action_378 (12#) = happyGoto action_241
-action_378 (32#) = happyGoto action_461
-action_378 (33#) = happyGoto action_376
-action_378 x = happyTcHack x happyReduce_65
-
-action_379 (98#) = happyShift action_408
-action_379 (174#) = happyShift action_48
-action_379 (12#) = happyGoto action_406
-action_379 (27#) = happyGoto action_460
-action_379 (29#) = happyGoto action_425
-action_379 x = happyTcHack x happyReduce_52
-
-action_380 (174#) = happyShift action_48
-action_380 (12#) = happyGoto action_241
-action_380 (33#) = happyGoto action_459
-action_380 x = happyTcHack x happyReduce_50
-
-action_381 x = happyTcHack x happyReduce_26
-
-action_382 (98#) = happyShift action_408
-action_382 (174#) = happyShift action_48
-action_382 (12#) = happyGoto action_406
-action_382 (27#) = happyGoto action_458
-action_382 (29#) = happyGoto action_425
-action_382 x = happyTcHack x happyReduce_52
-
-action_383 (89#) = happyGoto action_457
-action_383 x = happyTcHack x happyReduce_262
-
-action_384 (123#) = happyShift action_290
-action_384 (174#) = happyShift action_48
-action_384 (12#) = happyGoto action_287
-action_384 (36#) = happyGoto action_288
-action_384 (46#) = happyGoto action_456
-action_384 x = happyTcHack x happyReduce_113
-
-action_385 (97#) = happyShift action_86
-action_385 (98#) = happyShift action_455
-action_385 (111#) = happyShift action_24
-action_385 (115#) = happyShift action_25
-action_385 (118#) = happyShift action_27
-action_385 (119#) = happyShift action_28
-action_385 (120#) = happyShift action_29
-action_385 (121#) = happyShift action_30
-action_385 (122#) = happyShift action_31
-action_385 (123#) = happyShift action_32
-action_385 (131#) = happyShift action_35
-action_385 (167#) = happyShift action_139
-action_385 (170#) = happyShift action_6
-action_385 (171#) = happyShift action_45
-action_385 (172#) = happyShift action_46
-action_385 (173#) = happyShift action_47
-action_385 (174#) = happyShift action_48
-action_385 (8#) = happyGoto action_7
-action_385 (9#) = happyGoto action_8
-action_385 (10#) = happyGoto action_9
-action_385 (11#) = happyGoto action_10
-action_385 (12#) = happyGoto action_84
-action_385 (58#) = happyGoto action_453
-action_385 (72#) = happyGoto action_19
-action_385 (88#) = happyGoto action_454
-action_385 x = happyTcHack x happyReduce_95
-
-action_386 (174#) = happyShift action_48
-action_386 (12#) = happyGoto action_451
-action_386 (38#) = happyGoto action_284
-action_386 (48#) = happyGoto action_452
-action_386 x = happyTcHack x happyReduce_117
-
-action_387 (174#) = happyShift action_48
-action_387 (12#) = happyGoto action_448
-action_387 (39#) = happyGoto action_449
-action_387 (40#) = happyGoto action_450
-action_387 x = happyTcHack x happyReduce_102
-
-action_388 (174#) = happyShift action_48
-action_388 (12#) = happyGoto action_279
-action_388 (44#) = happyGoto action_280
-action_388 (51#) = happyGoto action_447
-action_388 x = happyTcHack x happyReduce_123
-
-action_389 (174#) = happyShift action_48
-action_389 (12#) = happyGoto action_446
-action_389 x = happyTcHack x happyFail
-
-action_390 (95#) = happyShift action_21
-action_390 (97#) = happyShift action_22
-action_390 (98#) = happyShift action_23
-action_390 (111#) = happyShift action_24
-action_390 (115#) = happyShift action_25
-action_390 (117#) = happyShift action_26
-action_390 (118#) = happyShift action_27
-action_390 (119#) = happyShift action_28
-action_390 (120#) = happyShift action_29
-action_390 (121#) = happyShift action_30
-action_390 (122#) = happyShift action_31
-action_390 (123#) = happyShift action_32
-action_390 (124#) = happyShift action_33
-action_390 (128#) = happyShift action_34
-action_390 (131#) = happyShift action_35
-action_390 (134#) = happyShift action_36
-action_390 (137#) = happyShift action_37
-action_390 (142#) = happyShift action_38
-action_390 (153#) = happyShift action_39
-action_390 (154#) = happyShift action_40
-action_390 (158#) = happyShift action_41
-action_390 (159#) = happyShift action_42
-action_390 (164#) = happyShift action_43
-action_390 (167#) = happyShift action_44
-action_390 (170#) = happyShift action_6
-action_390 (171#) = happyShift action_45
-action_390 (172#) = happyShift action_46
-action_390 (173#) = happyShift action_47
-action_390 (174#) = happyShift action_48
-action_390 (8#) = happyGoto action_7
-action_390 (9#) = happyGoto action_8
-action_390 (10#) = happyGoto action_9
-action_390 (11#) = happyGoto action_10
-action_390 (12#) = happyGoto action_11
-action_390 (58#) = happyGoto action_12
-action_390 (59#) = happyGoto action_13
-action_390 (60#) = happyGoto action_14
-action_390 (61#) = happyGoto action_15
-action_390 (62#) = happyGoto action_16
-action_390 (63#) = happyGoto action_445
-action_390 (64#) = happyGoto action_18
-action_390 (72#) = happyGoto action_19
-action_390 (77#) = happyGoto action_20
-action_390 x = happyTcHack x happyFail
-
-action_391 (174#) = happyShift action_48
-action_391 (12#) = happyGoto action_92
-action_391 (37#) = happyGoto action_276
-action_391 (47#) = happyGoto action_444
-action_391 (53#) = happyGoto action_278
-action_391 x = happyTcHack x happyReduce_115
-
-action_392 (167#) = happyShift action_443
-action_392 x = happyTcHack x happyFail
-
-action_393 (174#) = happyShift action_48
-action_393 (12#) = happyGoto action_267
-action_393 (41#) = happyGoto action_268
-action_393 (49#) = happyGoto action_442
-action_393 x = happyTcHack x happyReduce_119
-
-action_394 (98#) = happyShift action_441
-action_394 (174#) = happyShift action_48
-action_394 (12#) = happyGoto action_438
-action_394 (42#) = happyGoto action_439
-action_394 (52#) = happyGoto action_440
-action_394 x = happyTcHack x happyReduce_125
-
-action_395 x = happyTcHack x happyReduce_87
-
-action_396 x = happyTcHack x happyReduce_86
-
-action_397 (95#) = happyShift action_21
-action_397 (97#) = happyShift action_22
-action_397 (98#) = happyShift action_23
-action_397 (111#) = happyShift action_24
-action_397 (115#) = happyShift action_25
-action_397 (117#) = happyShift action_26
-action_397 (118#) = happyShift action_27
-action_397 (119#) = happyShift action_28
-action_397 (120#) = happyShift action_29
-action_397 (121#) = happyShift action_30
-action_397 (122#) = happyShift action_31
-action_397 (123#) = happyShift action_32
-action_397 (124#) = happyShift action_33
-action_397 (128#) = happyShift action_34
-action_397 (131#) = happyShift action_35
-action_397 (134#) = happyShift action_36
-action_397 (137#) = happyShift action_37
-action_397 (142#) = happyShift action_38
-action_397 (153#) = happyShift action_39
-action_397 (154#) = happyShift action_40
-action_397 (158#) = happyShift action_41
-action_397 (159#) = happyShift action_42
-action_397 (164#) = happyShift action_43
-action_397 (167#) = happyShift action_44
-action_397 (170#) = happyShift action_6
-action_397 (171#) = happyShift action_45
-action_397 (172#) = happyShift action_46
-action_397 (173#) = happyShift action_47
-action_397 (174#) = happyShift action_48
-action_397 (8#) = happyGoto action_7
-action_397 (9#) = happyGoto action_8
-action_397 (10#) = happyGoto action_9
-action_397 (11#) = happyGoto action_10
-action_397 (12#) = happyGoto action_11
-action_397 (58#) = happyGoto action_12
-action_397 (59#) = happyGoto action_13
-action_397 (60#) = happyGoto action_14
-action_397 (61#) = happyGoto action_15
-action_397 (62#) = happyGoto action_16
-action_397 (63#) = happyGoto action_437
-action_397 (64#) = happyGoto action_18
-action_397 (72#) = happyGoto action_19
-action_397 (77#) = happyGoto action_20
-action_397 x = happyTcHack x happyFail
-
-action_398 (123#) = happyShift action_257
-action_398 (174#) = happyShift action_48
-action_398 (12#) = happyGoto action_252
-action_398 (54#) = happyGoto action_262
-action_398 (55#) = happyGoto action_436
-action_398 x = happyTcHack x happyFail
-
-action_399 (123#) = happyShift action_257
-action_399 (174#) = happyShift action_48
-action_399 (12#) = happyGoto action_252
-action_399 (43#) = happyGoto action_260
-action_399 (50#) = happyGoto action_435
-action_399 (54#) = happyGoto action_262
-action_399 (55#) = happyGoto action_263
-action_399 x = happyTcHack x happyReduce_121
-
-action_400 x = happyTcHack x happyReduce_94
-
-action_401 (125#) = happyShift action_434
-action_401 x = happyTcHack x happyFail
-
-action_402 (95#) = happyShift action_21
-action_402 (97#) = happyShift action_22
-action_402 (98#) = happyShift action_23
-action_402 (111#) = happyShift action_24
-action_402 (115#) = happyShift action_25
-action_402 (117#) = happyShift action_26
-action_402 (118#) = happyShift action_27
-action_402 (119#) = happyShift action_28
-action_402 (120#) = happyShift action_29
-action_402 (121#) = happyShift action_30
-action_402 (122#) = happyShift action_31
-action_402 (123#) = happyShift action_32
-action_402 (124#) = happyShift action_33
-action_402 (128#) = happyShift action_34
-action_402 (131#) = happyShift action_35
-action_402 (134#) = happyShift action_36
-action_402 (137#) = happyShift action_37
-action_402 (142#) = happyShift action_38
-action_402 (153#) = happyShift action_39
-action_402 (154#) = happyShift action_40
-action_402 (158#) = happyShift action_41
-action_402 (159#) = happyShift action_42
-action_402 (164#) = happyShift action_43
-action_402 (167#) = happyShift action_44
-action_402 (170#) = happyShift action_6
-action_402 (171#) = happyShift action_45
-action_402 (172#) = happyShift action_46
-action_402 (173#) = happyShift action_47
-action_402 (174#) = happyShift action_48
-action_402 (8#) = happyGoto action_7
-action_402 (9#) = happyGoto action_8
-action_402 (10#) = happyGoto action_9
-action_402 (11#) = happyGoto action_10
-action_402 (12#) = happyGoto action_11
-action_402 (58#) = happyGoto action_12
-action_402 (59#) = happyGoto action_13
-action_402 (60#) = happyGoto action_14
-action_402 (61#) = happyGoto action_15
-action_402 (62#) = happyGoto action_16
-action_402 (63#) = happyGoto action_433
-action_402 (64#) = happyGoto action_18
-action_402 (72#) = happyGoto action_19
-action_402 (77#) = happyGoto action_20
-action_402 x = happyTcHack x happyFail
-
-action_403 (95#) = happyShift action_21
-action_403 (97#) = happyShift action_22
-action_403 (98#) = happyShift action_23
-action_403 (111#) = happyShift action_24
-action_403 (115#) = happyShift action_25
-action_403 (117#) = happyShift action_26
-action_403 (118#) = happyShift action_27
-action_403 (119#) = happyShift action_28
-action_403 (120#) = happyShift action_29
-action_403 (121#) = happyShift action_30
-action_403 (122#) = happyShift action_31
-action_403 (123#) = happyShift action_32
-action_403 (124#) = happyShift action_33
-action_403 (128#) = happyShift action_34
-action_403 (131#) = happyShift action_35
-action_403 (134#) = happyShift action_36
-action_403 (137#) = happyShift action_37
-action_403 (142#) = happyShift action_38
-action_403 (153#) = happyShift action_39
-action_403 (154#) = happyShift action_40
-action_403 (158#) = happyShift action_41
-action_403 (159#) = happyShift action_42
-action_403 (164#) = happyShift action_43
-action_403 (167#) = happyShift action_44
-action_403 (170#) = happyShift action_6
-action_403 (171#) = happyShift action_45
-action_403 (172#) = happyShift action_46
-action_403 (173#) = happyShift action_47
-action_403 (174#) = happyShift action_48
-action_403 (8#) = happyGoto action_7
-action_403 (9#) = happyGoto action_8
-action_403 (10#) = happyGoto action_9
-action_403 (11#) = happyGoto action_10
-action_403 (12#) = happyGoto action_11
-action_403 (58#) = happyGoto action_12
-action_403 (59#) = happyGoto action_13
-action_403 (60#) = happyGoto action_14
-action_403 (61#) = happyGoto action_15
-action_403 (62#) = happyGoto action_16
-action_403 (63#) = happyGoto action_432
-action_403 (64#) = happyGoto action_18
-action_403 (72#) = happyGoto action_19
-action_403 (77#) = happyGoto action_20
-action_403 x = happyTcHack x happyFail
-
-action_404 (112#) = happyShift action_431
-action_404 x = happyTcHack x happyFail
-
-action_405 (123#) = happyShift action_257
-action_405 (174#) = happyShift action_48
-action_405 (12#) = happyGoto action_252
-action_405 (34#) = happyGoto action_253
-action_405 (45#) = happyGoto action_430
-action_405 (54#) = happyGoto action_255
-action_405 (55#) = happyGoto action_256
-action_405 x = happyTcHack x happyReduce_111
-
-action_406 x = happyTcHack x happyReduce_57
-
-action_407 (106#) = happyShift action_429
-action_407 x = happyTcHack x happyFail
-
-action_408 (139#) = happyShift action_427
-action_408 (141#) = happyShift action_428
-action_408 (31#) = happyGoto action_426
-action_408 x = happyTcHack x happyReduce_62
-
-action_409 x = happyTcHack x happyReduce_38
-
-action_410 x = happyTcHack x happyReduce_37
-
-action_411 x = happyTcHack x happyReduce_47
-
-action_412 x = happyTcHack x happyReduce_46
-
-action_413 (98#) = happyShift action_408
-action_413 (174#) = happyShift action_48
-action_413 (12#) = happyGoto action_406
-action_413 (27#) = happyGoto action_424
-action_413 (29#) = happyGoto action_425
-action_413 x = happyTcHack x happyReduce_52
-
-action_414 (174#) = happyShift action_48
-action_414 (12#) = happyGoto action_241
-action_414 (33#) = happyGoto action_423
-action_414 x = happyTcHack x happyReduce_50
-
-action_415 (167#) = happyShift action_422
-action_415 x = happyTcHack x happyFail
-
-action_416 (123#) = happyShift action_421
-action_416 x = happyTcHack x happyFail
-
-action_417 (174#) = happyShift action_48
-action_417 (12#) = happyGoto action_92
-action_417 (53#) = happyGoto action_420
-action_417 x = happyTcHack x happyFail
-
-action_418 (112#) = happyShift action_419
-action_418 x = happyTcHack x happyFail
-
-action_419 (174#) = happyShift action_48
-action_419 (12#) = happyGoto action_492
-action_419 x = happyTcHack x happyFail
-
-action_420 (125#) = happyShift action_491
-action_420 x = happyTcHack x happyFail
-
-action_421 (174#) = happyShift action_48
-action_421 (12#) = happyGoto action_92
-action_421 (53#) = happyGoto action_490
-action_421 x = happyTcHack x happyFail
-
-action_422 (25#) = happyGoto action_489
-action_422 x = happyTcHack x happyReduce_48
-
-action_423 (166#) = happyShift action_488
-action_423 x = happyTcHack x happyFail
-
-action_424 (101#) = happyShift action_487
-action_424 x = happyTcHack x happyReduce_42
-
-action_425 (104#) = happyShift action_486
-action_425 x = happyTcHack x happyReduce_53
-
-action_426 (174#) = happyShift action_48
-action_426 (12#) = happyGoto action_485
-action_426 x = happyTcHack x happyFail
-
-action_427 x = happyTcHack x happyReduce_63
-
-action_428 x = happyTcHack x happyReduce_64
-
-action_429 (98#) = happyShift action_408
-action_429 (174#) = happyShift action_48
-action_429 (12#) = happyGoto action_406
-action_429 (29#) = happyGoto action_484
-action_429 x = happyTcHack x happyFail
-
-action_430 x = happyTcHack x happyReduce_112
-
-action_431 (95#) = happyShift action_21
-action_431 (97#) = happyShift action_22
-action_431 (98#) = happyShift action_23
-action_431 (111#) = happyShift action_24
-action_431 (115#) = happyShift action_25
-action_431 (117#) = happyShift action_26
-action_431 (118#) = happyShift action_27
-action_431 (119#) = happyShift action_28
-action_431 (120#) = happyShift action_29
-action_431 (121#) = happyShift action_30
-action_431 (122#) = happyShift action_31
-action_431 (123#) = happyShift action_32
-action_431 (124#) = happyShift action_33
-action_431 (128#) = happyShift action_34
-action_431 (131#) = happyShift action_35
-action_431 (134#) = happyShift action_36
-action_431 (137#) = happyShift action_37
-action_431 (142#) = happyShift action_38
-action_431 (153#) = happyShift action_39
-action_431 (154#) = happyShift action_40
-action_431 (158#) = happyShift action_41
-action_431 (159#) = happyShift action_42
-action_431 (164#) = happyShift action_43
-action_431 (167#) = happyShift action_44
-action_431 (170#) = happyShift action_6
-action_431 (171#) = happyShift action_45
-action_431 (172#) = happyShift action_46
-action_431 (173#) = happyShift action_47
-action_431 (174#) = happyShift action_48
-action_431 (8#) = happyGoto action_7
-action_431 (9#) = happyGoto action_8
-action_431 (10#) = happyGoto action_9
-action_431 (11#) = happyGoto action_10
-action_431 (12#) = happyGoto action_11
-action_431 (58#) = happyGoto action_12
-action_431 (59#) = happyGoto action_13
-action_431 (60#) = happyGoto action_14
-action_431 (61#) = happyGoto action_15
-action_431 (62#) = happyGoto action_16
-action_431 (63#) = happyGoto action_483
-action_431 (64#) = happyGoto action_18
-action_431 (72#) = happyGoto action_19
-action_431 (77#) = happyGoto action_20
-action_431 x = happyTcHack x happyFail
-
-action_432 x = happyTcHack x happyReduce_72
-
-action_433 (112#) = happyShift action_482
-action_433 x = happyTcHack x happyReduce_71
-
-action_434 x = happyTcHack x happyReduce_131
-
-action_435 x = happyTcHack x happyReduce_122
-
-action_436 x = happyTcHack x happyReduce_133
-
-action_437 x = happyTcHack x happyReduce_109
-
-action_438 (89#) = happyGoto action_481
-action_438 x = happyTcHack x happyReduce_262
-
-action_439 (168#) = happyShift action_480
-action_439 x = happyTcHack x happyReduce_126
-
-action_440 x = happyTcHack x happyReduce_105
-
-action_441 (137#) = happyShift action_479
-action_441 x = happyTcHack x happyFail
-
-action_442 x = happyTcHack x happyReduce_120
-
-action_443 (25#) = happyGoto action_478
-action_443 x = happyTcHack x happyReduce_48
-
-action_444 x = happyTcHack x happyReduce_116
-
-action_445 x = happyTcHack x happyReduce_98
-
-action_446 x = happyTcHack x happyReduce_110
-
-action_447 x = happyTcHack x happyReduce_124
-
-action_448 (107#) = happyShift action_477
-action_448 x = happyTcHack x happyReduce_100
-
-action_449 (168#) = happyShift action_476
-action_449 x = happyTcHack x happyReduce_103
-
-action_450 x = happyTcHack x happyReduce_99
-
-action_451 (112#) = happyShift action_387
-action_451 x = happyTcHack x happyFail
-
-action_452 x = happyTcHack x happyReduce_118
-
-action_453 x = happyTcHack x happyReduce_261
-
-action_454 x = happyTcHack x happyReduce_263
-
-action_455 (95#) = happyShift action_21
-action_455 (97#) = happyShift action_22
-action_455 (98#) = happyShift action_23
-action_455 (111#) = happyShift action_24
-action_455 (115#) = happyShift action_25
-action_455 (117#) = happyShift action_26
-action_455 (118#) = happyShift action_27
-action_455 (119#) = happyShift action_28
-action_455 (120#) = happyShift action_29
-action_455 (121#) = happyShift action_30
-action_455 (122#) = happyShift action_31
-action_455 (123#) = happyShift action_32
-action_455 (124#) = happyShift action_33
-action_455 (126#) = happyShift action_102
-action_455 (128#) = happyShift action_34
-action_455 (131#) = happyShift action_35
-action_455 (134#) = happyShift action_36
-action_455 (137#) = happyShift action_113
-action_455 (142#) = happyShift action_38
-action_455 (153#) = happyShift action_39
-action_455 (154#) = happyShift action_40
-action_455 (158#) = happyShift action_41
-action_455 (159#) = happyShift action_42
-action_455 (164#) = happyShift action_43
-action_455 (167#) = happyShift action_44
-action_455 (170#) = happyShift action_6
-action_455 (171#) = happyShift action_45
-action_455 (172#) = happyShift action_46
-action_455 (173#) = happyShift action_47
-action_455 (174#) = happyShift action_48
-action_455 (8#) = happyGoto action_7
-action_455 (9#) = happyGoto action_8
-action_455 (10#) = happyGoto action_9
-action_455 (11#) = happyGoto action_10
-action_455 (12#) = happyGoto action_110
-action_455 (58#) = happyGoto action_12
-action_455 (59#) = happyGoto action_13
-action_455 (60#) = happyGoto action_14
-action_455 (61#) = happyGoto action_15
-action_455 (62#) = happyGoto action_16
-action_455 (63#) = happyGoto action_111
-action_455 (64#) = happyGoto action_18
-action_455 (72#) = happyGoto action_19
-action_455 (75#) = happyGoto action_99
-action_455 (76#) = happyGoto action_475
-action_455 (77#) = happyGoto action_20
-action_455 x = happyTcHack x happyReduce_236
-
-action_456 x = happyTcHack x happyReduce_114
-
-action_457 (97#) = happyShift action_86
-action_457 (98#) = happyShift action_455
-action_457 (111#) = happyShift action_24
-action_457 (115#) = happyShift action_25
-action_457 (118#) = happyShift action_27
-action_457 (119#) = happyShift action_28
-action_457 (120#) = happyShift action_29
-action_457 (121#) = happyShift action_30
-action_457 (122#) = happyShift action_31
-action_457 (123#) = happyShift action_32
-action_457 (125#) = happyShift action_474
-action_457 (131#) = happyShift action_35
-action_457 (167#) = happyShift action_139
-action_457 (170#) = happyShift action_6
-action_457 (171#) = happyShift action_45
-action_457 (172#) = happyShift action_46
-action_457 (173#) = happyShift action_47
-action_457 (174#) = happyShift action_48
-action_457 (8#) = happyGoto action_7
-action_457 (9#) = happyGoto action_8
-action_457 (10#) = happyGoto action_9
-action_457 (11#) = happyGoto action_10
-action_457 (12#) = happyGoto action_84
-action_457 (58#) = happyGoto action_453
-action_457 (72#) = happyGoto action_19
-action_457 (88#) = happyGoto action_454
-action_457 x = happyTcHack x happyFail
-
-action_458 (137#) = happyShift action_473
-action_458 x = happyTcHack x happyFail
-
-action_459 (166#) = happyShift action_472
-action_459 x = happyTcHack x happyFail
-
-action_460 (101#) = happyShift action_471
-action_460 x = happyTcHack x happyReduce_28
-
-action_461 x = happyTcHack x happyReduce_67
-
-action_462 x = happyTcHack x happyReduce_136
-
-action_463 x = happyTcHack x happyReduce_213
-
-action_464 x = happyTcHack x happyReduce_168
-
-action_465 (95#) = happyShift action_21
-action_465 (97#) = happyShift action_22
-action_465 (98#) = happyShift action_23
-action_465 (111#) = happyShift action_24
-action_465 (115#) = happyShift action_25
-action_465 (117#) = happyShift action_26
-action_465 (118#) = happyShift action_27
-action_465 (119#) = happyShift action_28
-action_465 (120#) = happyShift action_29
-action_465 (121#) = happyShift action_30
-action_465 (122#) = happyShift action_31
-action_465 (123#) = happyShift action_32
-action_465 (124#) = happyShift action_33
-action_465 (128#) = happyShift action_34
-action_465 (131#) = happyShift action_35
-action_465 (134#) = happyShift action_36
-action_465 (137#) = happyShift action_37
-action_465 (142#) = happyShift action_38
-action_465 (153#) = happyShift action_39
-action_465 (154#) = happyShift action_40
-action_465 (158#) = happyShift action_41
-action_465 (159#) = happyShift action_42
-action_465 (164#) = happyShift action_43
-action_465 (167#) = happyShift action_44
-action_465 (170#) = happyShift action_6
-action_465 (171#) = happyShift action_45
-action_465 (172#) = happyShift action_46
-action_465 (173#) = happyShift action_47
-action_465 (174#) = happyShift action_48
-action_465 (8#) = happyGoto action_7
-action_465 (9#) = happyGoto action_8
-action_465 (10#) = happyGoto action_9
-action_465 (11#) = happyGoto action_10
-action_465 (12#) = happyGoto action_11
-action_465 (58#) = happyGoto action_12
-action_465 (59#) = happyGoto action_13
-action_465 (60#) = happyGoto action_14
-action_465 (61#) = happyGoto action_15
-action_465 (62#) = happyGoto action_16
-action_465 (63#) = happyGoto action_361
-action_465 (64#) = happyGoto action_18
-action_465 (72#) = happyGoto action_19
-action_465 (77#) = happyGoto action_20
-action_465 (86#) = happyGoto action_362
-action_465 (87#) = happyGoto action_470
-action_465 x = happyTcHack x happyReduce_257
-
-action_466 (95#) = happyShift action_21
-action_466 (97#) = happyShift action_22
-action_466 (98#) = happyShift action_23
-action_466 (111#) = happyShift action_24
-action_466 (115#) = happyShift action_25
-action_466 (117#) = happyShift action_26
-action_466 (118#) = happyShift action_27
-action_466 (119#) = happyShift action_28
-action_466 (120#) = happyShift action_29
-action_466 (121#) = happyShift action_30
-action_466 (122#) = happyShift action_31
-action_466 (123#) = happyShift action_32
-action_466 (124#) = happyShift action_33
-action_466 (128#) = happyShift action_34
-action_466 (131#) = happyShift action_35
-action_466 (134#) = happyShift action_36
-action_466 (137#) = happyShift action_37
-action_466 (142#) = happyShift action_38
-action_466 (153#) = happyShift action_39
-action_466 (154#) = happyShift action_40
-action_466 (158#) = happyShift action_41
-action_466 (159#) = happyShift action_42
-action_466 (164#) = happyShift action_43
-action_466 (167#) = happyShift action_44
-action_466 (170#) = happyShift action_6
-action_466 (171#) = happyShift action_45
-action_466 (172#) = happyShift action_46
-action_466 (173#) = happyShift action_47
-action_466 (174#) = happyShift action_48
-action_466 (8#) = happyGoto action_7
-action_466 (9#) = happyGoto action_8
-action_466 (10#) = happyGoto action_9
-action_466 (11#) = happyGoto action_10
-action_466 (12#) = happyGoto action_11
-action_466 (58#) = happyGoto action_12
-action_466 (59#) = happyGoto action_13
-action_466 (60#) = happyGoto action_14
-action_466 (61#) = happyGoto action_15
-action_466 (62#) = happyGoto action_16
-action_466 (63#) = happyGoto action_469
-action_466 (64#) = happyGoto action_18
-action_466 (72#) = happyGoto action_19
-action_466 (77#) = happyGoto action_20
-action_466 x = happyTcHack x happyFail
-
-action_467 x = happyTcHack x happyReduce_186
-
-action_468 x = happyTcHack x happyReduce_166
-
-action_469 x = happyTcHack x happyReduce_256
-
-action_470 x = happyTcHack x happyReduce_259
-
-action_471 (148#) = happyShift action_382
-action_471 (28#) = happyGoto action_510
-action_471 x = happyTcHack x happyReduce_55
-
-action_472 (98#) = happyShift action_408
-action_472 (174#) = happyShift action_48
-action_472 (12#) = happyGoto action_406
-action_472 (27#) = happyGoto action_509
-action_472 (29#) = happyGoto action_425
-action_472 x = happyTcHack x happyReduce_52
-
-action_473 x = happyTcHack x happyReduce_56
-
-action_474 (167#) = happyShift action_508
-action_474 x = happyTcHack x happyReduce_96
-
-action_475 (109#) = happyShift action_507
-action_475 x = happyTcHack x happyFail
-
-action_476 (174#) = happyShift action_48
-action_476 (12#) = happyGoto action_448
-action_476 (39#) = happyGoto action_449
-action_476 (40#) = happyGoto action_506
-action_476 x = happyTcHack x happyReduce_102
-
-action_477 (174#) = happyShift action_48
-action_477 (12#) = happyGoto action_505
-action_477 x = happyTcHack x happyFail
-
-action_478 (129#) = happyShift action_210
-action_478 (131#) = happyShift action_211
-action_478 (132#) = happyShift action_212
-action_478 (133#) = happyShift action_213
-action_478 (135#) = happyShift action_214
-action_478 (143#) = happyShift action_215
-action_478 (144#) = happyShift action_216
-action_478 (145#) = happyShift action_217
-action_478 (146#) = happyShift action_218
-action_478 (149#) = happyShift action_219
-action_478 (151#) = happyShift action_220
-action_478 (152#) = happyShift action_221
-action_478 (153#) = happyShift action_222
-action_478 (155#) = happyShift action_223
-action_478 (160#) = happyShift action_224
-action_478 (161#) = happyShift action_225
-action_478 (163#) = happyShift action_226
-action_478 (169#) = happyShift action_504
-action_478 (35#) = happyGoto action_209
-action_478 x = happyTcHack x happyFail
-
-action_479 (174#) = happyShift action_48
-action_479 (12#) = happyGoto action_503
-action_479 x = happyTcHack x happyFail
-
-action_480 (174#) = happyShift action_48
-action_480 (12#) = happyGoto action_438
-action_480 (42#) = happyGoto action_439
-action_480 (52#) = happyGoto action_502
-action_480 x = happyTcHack x happyReduce_125
-
-action_481 (97#) = happyShift action_86
-action_481 (98#) = happyShift action_455
-action_481 (111#) = happyShift action_24
-action_481 (115#) = happyShift action_25
-action_481 (118#) = happyShift action_27
-action_481 (119#) = happyShift action_28
-action_481 (120#) = happyShift action_29
-action_481 (121#) = happyShift action_30
-action_481 (122#) = happyShift action_31
-action_481 (123#) = happyShift action_32
-action_481 (131#) = happyShift action_35
-action_481 (167#) = happyShift action_139
-action_481 (170#) = happyShift action_6
-action_481 (171#) = happyShift action_45
-action_481 (172#) = happyShift action_46
-action_481 (173#) = happyShift action_47
-action_481 (174#) = happyShift action_48
-action_481 (8#) = happyGoto action_7
-action_481 (9#) = happyGoto action_8
-action_481 (10#) = happyGoto action_9
-action_481 (11#) = happyGoto action_10
-action_481 (12#) = happyGoto action_84
-action_481 (58#) = happyGoto action_453
-action_481 (72#) = happyGoto action_19
-action_481 (88#) = happyGoto action_454
-action_481 x = happyTcHack x happyReduce_108
-
-action_482 (95#) = happyShift action_21
-action_482 (97#) = happyShift action_22
-action_482 (98#) = happyShift action_23
-action_482 (111#) = happyShift action_24
-action_482 (115#) = happyShift action_25
-action_482 (117#) = happyShift action_26
-action_482 (118#) = happyShift action_27
-action_482 (119#) = happyShift action_28
-action_482 (120#) = happyShift action_29
-action_482 (121#) = happyShift action_30
-action_482 (122#) = happyShift action_31
-action_482 (123#) = happyShift action_32
-action_482 (124#) = happyShift action_33
-action_482 (128#) = happyShift action_34
-action_482 (131#) = happyShift action_35
-action_482 (134#) = happyShift action_36
-action_482 (137#) = happyShift action_37
-action_482 (142#) = happyShift action_38
-action_482 (153#) = happyShift action_39
-action_482 (154#) = happyShift action_40
-action_482 (158#) = happyShift action_41
-action_482 (159#) = happyShift action_42
-action_482 (164#) = happyShift action_43
-action_482 (167#) = happyShift action_44
-action_482 (170#) = happyShift action_6
-action_482 (171#) = happyShift action_45
-action_482 (172#) = happyShift action_46
-action_482 (173#) = happyShift action_47
-action_482 (174#) = happyShift action_48
-action_482 (8#) = happyGoto action_7
-action_482 (9#) = happyGoto action_8
-action_482 (10#) = happyGoto action_9
-action_482 (11#) = happyGoto action_10
-action_482 (12#) = happyGoto action_11
-action_482 (58#) = happyGoto action_12
-action_482 (59#) = happyGoto action_13
-action_482 (60#) = happyGoto action_14
-action_482 (61#) = happyGoto action_15
-action_482 (62#) = happyGoto action_16
-action_482 (63#) = happyGoto action_501
-action_482 (64#) = happyGoto action_18
-action_482 (72#) = happyGoto action_19
-action_482 (77#) = happyGoto action_20
-action_482 x = happyTcHack x happyFail
-
-action_483 x = happyTcHack x happyReduce_73
-
-action_484 x = happyTcHack x happyReduce_39
-
-action_485 (99#) = happyShift action_499
-action_485 (112#) = happyShift action_500
-action_485 x = happyTcHack x happyFail
-
-action_486 (98#) = happyShift action_408
-action_486 (174#) = happyShift action_48
-action_486 (12#) = happyGoto action_406
-action_486 (27#) = happyGoto action_498
-action_486 (29#) = happyGoto action_425
-action_486 x = happyTcHack x happyReduce_52
-
-action_487 (148#) = happyShift action_382
-action_487 (28#) = happyGoto action_497
-action_487 x = happyTcHack x happyReduce_55
-
-action_488 (98#) = happyShift action_408
-action_488 (174#) = happyShift action_48
-action_488 (12#) = happyGoto action_406
-action_488 (27#) = happyGoto action_496
-action_488 (29#) = happyGoto action_425
-action_488 x = happyTcHack x happyReduce_52
-
-action_489 (129#) = happyShift action_210
-action_489 (131#) = happyShift action_211
-action_489 (132#) = happyShift action_212
-action_489 (133#) = happyShift action_213
-action_489 (135#) = happyShift action_214
-action_489 (143#) = happyShift action_215
-action_489 (144#) = happyShift action_216
-action_489 (145#) = happyShift action_217
-action_489 (146#) = happyShift action_218
-action_489 (149#) = happyShift action_219
-action_489 (151#) = happyShift action_220
-action_489 (152#) = happyShift action_221
-action_489 (153#) = happyShift action_222
-action_489 (155#) = happyShift action_223
-action_489 (160#) = happyShift action_224
-action_489 (161#) = happyShift action_225
-action_489 (163#) = happyShift action_226
-action_489 (169#) = happyShift action_495
-action_489 (35#) = happyGoto action_209
-action_489 x = happyTcHack x happyFail
-
-action_490 (125#) = happyShift action_494
-action_490 x = happyTcHack x happyFail
-
-action_491 x = happyTcHack x happyReduce_69
-
-action_492 (110#) = happyShift action_493
-action_492 x = happyTcHack x happyFail
-
-action_493 (174#) = happyShift action_48
-action_493 (12#) = happyGoto action_519
-action_493 (16#) = happyGoto action_520
-action_493 (17#) = happyGoto action_521
-action_493 x = happyTcHack x happyReduce_17
-
-action_494 x = happyTcHack x happyReduce_70
-
-action_495 x = happyTcHack x happyReduce_40
-
-action_496 (101#) = happyShift action_518
-action_496 x = happyTcHack x happyReduce_44
-
-action_497 (167#) = happyShift action_517
-action_497 x = happyTcHack x happyFail
-
-action_498 x = happyTcHack x happyReduce_54
-
-action_499 x = happyTcHack x happyReduce_58
-
-action_500 (174#) = happyShift action_48
-action_500 (12#) = happyGoto action_516
-action_500 x = happyTcHack x happyFail
-
-action_501 x = happyTcHack x happyReduce_74
-
-action_502 x = happyTcHack x happyReduce_127
-
-action_503 (99#) = happyShift action_515
-action_503 x = happyTcHack x happyFail
-
-action_504 (110#) = happyShift action_514
-action_504 x = happyTcHack x happyFail
-
-action_505 x = happyTcHack x happyReduce_101
-
-action_506 x = happyTcHack x happyReduce_104
-
-action_507 (95#) = happyShift action_21
-action_507 (97#) = happyShift action_22
-action_507 (98#) = happyShift action_23
-action_507 (111#) = happyShift action_24
-action_507 (115#) = happyShift action_25
-action_507 (117#) = happyShift action_26
-action_507 (118#) = happyShift action_27
-action_507 (119#) = happyShift action_28
-action_507 (120#) = happyShift action_29
-action_507 (121#) = happyShift action_30
-action_507 (122#) = happyShift action_31
-action_507 (123#) = happyShift action_32
-action_507 (124#) = happyShift action_33
-action_507 (128#) = happyShift action_34
-action_507 (131#) = happyShift action_35
-action_507 (134#) = happyShift action_36
-action_507 (137#) = happyShift action_37
-action_507 (142#) = happyShift action_38
-action_507 (153#) = happyShift action_39
-action_507 (154#) = happyShift action_40
-action_507 (158#) = happyShift action_41
-action_507 (159#) = happyShift action_42
-action_507 (164#) = happyShift action_43
-action_507 (167#) = happyShift action_44
-action_507 (170#) = happyShift action_6
-action_507 (171#) = happyShift action_45
-action_507 (172#) = happyShift action_46
-action_507 (173#) = happyShift action_47
-action_507 (174#) = happyShift action_48
-action_507 (8#) = happyGoto action_7
-action_507 (9#) = happyGoto action_8
-action_507 (10#) = happyGoto action_9
-action_507 (11#) = happyGoto action_10
-action_507 (12#) = happyGoto action_11
-action_507 (58#) = happyGoto action_12
-action_507 (59#) = happyGoto action_13
-action_507 (60#) = happyGoto action_14
-action_507 (61#) = happyGoto action_15
-action_507 (62#) = happyGoto action_16
-action_507 (63#) = happyGoto action_513
-action_507 (64#) = happyGoto action_18
-action_507 (72#) = happyGoto action_19
-action_507 (77#) = happyGoto action_20
-action_507 x = happyTcHack x happyFail
-
-action_508 (170#) = happyShift action_6
-action_508 (8#) = happyGoto action_512
-action_508 x = happyTcHack x happyFail
-
-action_509 (101#) = happyShift action_511
-action_509 x = happyTcHack x happyReduce_30
-
-action_510 x = happyTcHack x happyReduce_29
-
-action_511 (148#) = happyShift action_382
-action_511 (28#) = happyGoto action_530
-action_511 x = happyTcHack x happyReduce_55
-
-action_512 (169#) = happyShift action_529
-action_512 x = happyTcHack x happyFail
-
-action_513 (99#) = happyShift action_528
-action_513 x = happyTcHack x happyFail
-
-action_514 x = happyTcHack x happyReduce_92
-
-action_515 x = happyTcHack x happyReduce_106
-
-action_516 (99#) = happyShift action_527
-action_516 x = happyTcHack x happyFail
-
-action_517 (25#) = happyGoto action_526
-action_517 x = happyTcHack x happyReduce_48
-
-action_518 (148#) = happyShift action_382
-action_518 (28#) = happyGoto action_525
-action_518 x = happyTcHack x happyReduce_55
-
-action_519 (112#) = happyShift action_524
-action_519 x = happyTcHack x happyFail
-
-action_520 (110#) = happyShift action_523
-action_520 x = happyTcHack x happyReduce_18
-
-action_521 (169#) = happyShift action_522
-action_521 x = happyTcHack x happyFail
-
-action_522 x = happyTcHack x happyReduce_14
-
-action_523 (174#) = happyShift action_48
-action_523 (12#) = happyGoto action_519
-action_523 (16#) = happyGoto action_520
-action_523 (17#) = happyGoto action_535
-action_523 x = happyTcHack x happyReduce_17
-
-action_524 (174#) = happyShift action_48
-action_524 (12#) = happyGoto action_533
-action_524 (18#) = happyGoto action_534
-action_524 x = happyTcHack x happyFail
-
-action_525 (167#) = happyShift action_532
-action_525 x = happyTcHack x happyFail
-
-action_526 (129#) = happyShift action_210
-action_526 (131#) = happyShift action_211
-action_526 (132#) = happyShift action_212
-action_526 (133#) = happyShift action_213
-action_526 (135#) = happyShift action_214
-action_526 (143#) = happyShift action_215
-action_526 (144#) = happyShift action_216
-action_526 (145#) = happyShift action_217
-action_526 (146#) = happyShift action_218
-action_526 (149#) = happyShift action_219
-action_526 (151#) = happyShift action_220
-action_526 (152#) = happyShift action_221
-action_526 (153#) = happyShift action_222
-action_526 (155#) = happyShift action_223
-action_526 (160#) = happyShift action_224
-action_526 (161#) = happyShift action_225
-action_526 (163#) = happyShift action_226
-action_526 (169#) = happyShift action_531
-action_526 (35#) = happyGoto action_209
-action_526 x = happyTcHack x happyFail
-
-action_527 x = happyTcHack x happyReduce_59
-
-action_528 x = happyTcHack x happyReduce_260
-
-action_529 x = happyTcHack x happyReduce_97
-
-action_530 x = happyTcHack x happyReduce_31
-
-action_531 x = happyTcHack x happyReduce_43
-
-action_532 (25#) = happyGoto action_537
-action_532 x = happyTcHack x happyReduce_48
-
-action_533 (19#) = happyGoto action_536
-action_533 x = happyTcHack x happyReduce_21
-
-action_534 x = happyTcHack x happyReduce_16
-
-action_535 x = happyTcHack x happyReduce_19
-
-action_536 (98#) = happyShift action_540
-action_536 (20#) = happyGoto action_539
-action_536 x = happyTcHack x happyReduce_20
-
-action_537 (129#) = happyShift action_210
-action_537 (131#) = happyShift action_211
-action_537 (132#) = happyShift action_212
-action_537 (133#) = happyShift action_213
-action_537 (135#) = happyShift action_214
-action_537 (143#) = happyShift action_215
-action_537 (144#) = happyShift action_216
-action_537 (145#) = happyShift action_217
-action_537 (146#) = happyShift action_218
-action_537 (149#) = happyShift action_219
-action_537 (151#) = happyShift action_220
-action_537 (152#) = happyShift action_221
-action_537 (153#) = happyShift action_222
-action_537 (155#) = happyShift action_223
-action_537 (160#) = happyShift action_224
-action_537 (161#) = happyShift action_225
-action_537 (163#) = happyShift action_226
-action_537 (169#) = happyShift action_538
-action_537 (35#) = happyGoto action_209
-action_537 x = happyTcHack x happyFail
-
-action_538 x = happyTcHack x happyReduce_45
-
-action_539 x = happyTcHack x happyReduce_22
-
-action_540 (161#) = happyShift action_541
-action_540 x = happyTcHack x happyFail
-
-action_541 (137#) = happyShift action_542
-action_541 (150#) = happyShift action_543
-action_541 x = happyTcHack x happyFail
-
-action_542 (98#) = happyShift action_408
-action_542 (174#) = happyShift action_48
-action_542 (12#) = happyGoto action_406
-action_542 (29#) = happyGoto action_545
-action_542 x = happyTcHack x happyFail
-
-action_543 (98#) = happyShift action_408
-action_543 (174#) = happyShift action_48
-action_543 (12#) = happyGoto action_406
-action_543 (29#) = happyGoto action_544
-action_543 x = happyTcHack x happyFail
-
-action_544 (99#) = happyShift action_547
-action_544 x = happyTcHack x happyFail
-
-action_545 (99#) = happyShift action_546
-action_545 x = happyTcHack x happyFail
-
-action_546 x = happyTcHack x happyReduce_23
-
-action_547 x = happyTcHack x happyReduce_24
-
-happyReduce_5 = happySpecReduce_1 8# happyReduction_5
-happyReduction_5 (HappyTerminal (PT _ (TI happy_var_1)))
- = HappyAbsSyn8
- ((read (BS.unpack happy_var_1)) :: Integer
- )
-happyReduction_5 _ = notHappyAtAll
-
-happyReduce_6 = happySpecReduce_1 9# happyReduction_6
-happyReduction_6 (HappyTerminal (PT _ (TL happy_var_1)))
- = HappyAbsSyn9
- (BS.unpack happy_var_1
- )
-happyReduction_6 _ = notHappyAtAll
-
-happyReduce_7 = happySpecReduce_1 10# happyReduction_7
-happyReduction_7 (HappyTerminal (PT _ (TD happy_var_1)))
- = HappyAbsSyn10
- ((read (BS.unpack happy_var_1)) :: Double
- )
-happyReduction_7 _ = notHappyAtAll
-
-happyReduce_8 = happySpecReduce_1 11# happyReduction_8
-happyReduction_8 (HappyTerminal (PT _ (T_LString happy_var_1)))
- = HappyAbsSyn11
- (LString (happy_var_1)
- )
-happyReduction_8 _ = notHappyAtAll
-
-happyReduce_9 = happySpecReduce_1 12# happyReduction_9
-happyReduction_9 (HappyTerminal happy_var_1)
- = HappyAbsSyn12
- (PIdent (mkPosToken happy_var_1)
- )
-happyReduction_9 _ = notHappyAtAll
-
-happyReduce_10 = happySpecReduce_1 13# happyReduction_10
-happyReduction_10 (HappyAbsSyn14 happy_var_1)
- = HappyAbsSyn13
- (Gr (reverse happy_var_1)
- )
-happyReduction_10 _ = notHappyAtAll
-
-happyReduce_11 = happySpecReduce_0 14# happyReduction_11
-happyReduction_11 = HappyAbsSyn14
- ([]
- )
-
-happyReduce_12 = happySpecReduce_2 14# happyReduction_12
-happyReduction_12 (HappyAbsSyn15 happy_var_2)
- (HappyAbsSyn14 happy_var_1)
- = HappyAbsSyn14
- (flip (:) happy_var_1 happy_var_2
- )
-happyReduction_12 _ _ = notHappyAtAll
-
-happyReduce_13 = happySpecReduce_2 15# happyReduction_13
-happyReduction_13 _
- (HappyAbsSyn15 happy_var_1)
- = HappyAbsSyn15
- (happy_var_1
- )
-happyReduction_13 _ _ = notHappyAtAll
-
-happyReduce_14 = happyReduce 10# 15# happyReduction_14
-happyReduction_14 (_ `HappyStk`
- (HappyAbsSyn17 happy_var_9) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn12 happy_var_7) `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn12 happy_var_2) `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn15
- (MMain happy_var_2 happy_var_7 happy_var_9
- ) `HappyStk` happyRest
-
-happyReduce_15 = happyReduce 4# 15# happyReduction_15
-happyReduction_15 ((HappyAbsSyn22 happy_var_4) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn23 happy_var_2) `HappyStk`
- (HappyAbsSyn30 happy_var_1) `HappyStk`
- happyRest)
- = HappyAbsSyn15
- (MModule happy_var_1 happy_var_2 happy_var_4
- ) `HappyStk` happyRest
-
-happyReduce_16 = happySpecReduce_3 16# happyReduction_16
-happyReduction_16 (HappyAbsSyn18 happy_var_3)
- _
- (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn16
- (ConcSpec happy_var_1 happy_var_3
- )
-happyReduction_16 _ _ _ = notHappyAtAll
-
-happyReduce_17 = happySpecReduce_0 17# happyReduction_17
-happyReduction_17 = HappyAbsSyn17
- ([]
- )
-
-happyReduce_18 = happySpecReduce_1 17# happyReduction_18
-happyReduction_18 (HappyAbsSyn16 happy_var_1)
- = HappyAbsSyn17
- ((:[]) happy_var_1
- )
-happyReduction_18 _ = notHappyAtAll
-
-happyReduce_19 = happySpecReduce_3 17# happyReduction_19
-happyReduction_19 (HappyAbsSyn17 happy_var_3)
- _
- (HappyAbsSyn16 happy_var_1)
- = HappyAbsSyn17
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_19 _ _ _ = notHappyAtAll
-
-happyReduce_20 = happySpecReduce_2 18# happyReduction_20
-happyReduction_20 (HappyAbsSyn19 happy_var_2)
- (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn18
- (ConcExp happy_var_1 (reverse happy_var_2)
- )
-happyReduction_20 _ _ = notHappyAtAll
-
-happyReduce_21 = happySpecReduce_0 19# happyReduction_21
-happyReduction_21 = HappyAbsSyn19
- ([]
- )
-
-happyReduce_22 = happySpecReduce_2 19# happyReduction_22
-happyReduction_22 (HappyAbsSyn20 happy_var_2)
- (HappyAbsSyn19 happy_var_1)
- = HappyAbsSyn19
- (flip (:) happy_var_1 happy_var_2
- )
-happyReduction_22 _ _ = notHappyAtAll
-
-happyReduce_23 = happyReduce 5# 20# happyReduction_23
-happyReduction_23 (_ `HappyStk`
- (HappyAbsSyn29 happy_var_4) `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn20
- (TransferIn happy_var_4
- ) `HappyStk` happyRest
-
-happyReduce_24 = happyReduce 5# 20# happyReduction_24
-happyReduction_24 (_ `HappyStk`
- (HappyAbsSyn29 happy_var_4) `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn20
- (TransferOut happy_var_4
- ) `HappyStk` happyRest
-
-happyReduce_25 = happyReduce 4# 21# happyReduction_25
-happyReduction_25 ((HappyAbsSyn22 happy_var_4) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn23 happy_var_2) `HappyStk`
- (HappyAbsSyn30 happy_var_1) `HappyStk`
- happyRest)
- = HappyAbsSyn15
- (MModule happy_var_1 happy_var_2 happy_var_4
- ) `HappyStk` happyRest
-
-happyReduce_26 = happySpecReduce_2 22# happyReduction_26
-happyReduction_26 (HappyAbsSyn28 happy_var_2)
- (HappyAbsSyn26 happy_var_1)
- = HappyAbsSyn22
- (MBody happy_var_1 happy_var_2 []
- )
-happyReduction_26 _ _ = notHappyAtAll
-
-happyReduce_27 = happySpecReduce_1 22# happyReduction_27
-happyReduction_27 (HappyAbsSyn32 happy_var_1)
- = HappyAbsSyn22
- (MNoBody happy_var_1
- )
-happyReduction_27 _ = notHappyAtAll
-
-happyReduce_28 = happySpecReduce_3 22# happyReduction_28
-happyReduction_28 (HappyAbsSyn27 happy_var_3)
- _
- (HappyAbsSyn33 happy_var_1)
- = HappyAbsSyn22
- (MWith happy_var_1 happy_var_3
- )
-happyReduction_28 _ _ _ = notHappyAtAll
-
-happyReduce_29 = happyReduce 5# 22# happyReduction_29
-happyReduction_29 ((HappyAbsSyn28 happy_var_5) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn27 happy_var_3) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn33 happy_var_1) `HappyStk`
- happyRest)
- = HappyAbsSyn22
- (MWithBody happy_var_1 happy_var_3 happy_var_5 []
- ) `HappyStk` happyRest
-
-happyReduce_30 = happyReduce 5# 22# happyReduction_30
-happyReduction_30 ((HappyAbsSyn27 happy_var_5) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn33 happy_var_3) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn32 happy_var_1) `HappyStk`
- happyRest)
- = HappyAbsSyn22
- (MWithE happy_var_1 happy_var_3 happy_var_5
- ) `HappyStk` happyRest
-
-happyReduce_31 = happyReduce 7# 22# happyReduction_31
-happyReduction_31 ((HappyAbsSyn28 happy_var_7) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn27 happy_var_5) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn33 happy_var_3) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn32 happy_var_1) `HappyStk`
- happyRest)
- = HappyAbsSyn22
- (MWithEBody happy_var_1 happy_var_3 happy_var_5 happy_var_7 []
- ) `HappyStk` happyRest
-
-happyReduce_32 = happySpecReduce_2 22# happyReduction_32
-happyReduction_32 (HappyAbsSyn12 happy_var_2)
- _
- = HappyAbsSyn22
- (MReuse happy_var_2
- )
-happyReduction_32 _ _ = notHappyAtAll
-
-happyReduce_33 = happySpecReduce_2 22# happyReduction_33
-happyReduction_33 (HappyAbsSyn32 happy_var_2)
- _
- = HappyAbsSyn22
- (MUnion happy_var_2
- )
-happyReduction_33 _ _ = notHappyAtAll
-
-happyReduce_34 = happySpecReduce_2 23# happyReduction_34
-happyReduction_34 (HappyAbsSyn12 happy_var_2)
- _
- = HappyAbsSyn23
- (MTAbstract happy_var_2
- )
-happyReduction_34 _ _ = notHappyAtAll
-
-happyReduce_35 = happySpecReduce_2 23# happyReduction_35
-happyReduction_35 (HappyAbsSyn12 happy_var_2)
- _
- = HappyAbsSyn23
- (MTResource happy_var_2
- )
-happyReduction_35 _ _ = notHappyAtAll
-
-happyReduce_36 = happySpecReduce_2 23# happyReduction_36
-happyReduction_36 (HappyAbsSyn12 happy_var_2)
- _
- = HappyAbsSyn23
- (MTInterface happy_var_2
- )
-happyReduction_36 _ _ = notHappyAtAll
-
-happyReduce_37 = happyReduce 4# 23# happyReduction_37
-happyReduction_37 ((HappyAbsSyn12 happy_var_4) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn12 happy_var_2) `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn23
- (MTConcrete happy_var_2 happy_var_4
- ) `HappyStk` happyRest
-
-happyReduce_38 = happyReduce 4# 23# happyReduction_38
-happyReduction_38 ((HappyAbsSyn12 happy_var_4) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn12 happy_var_2) `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn23
- (MTInstance happy_var_2 happy_var_4
- ) `HappyStk` happyRest
-
-happyReduce_39 = happyReduce 6# 23# happyReduction_39
-happyReduction_39 ((HappyAbsSyn29 happy_var_6) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn29 happy_var_4) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn12 happy_var_2) `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn23
- (MTTransfer happy_var_2 happy_var_4 happy_var_6
- ) `HappyStk` happyRest
-
-happyReduce_40 = happyReduce 5# 24# happyReduction_40
-happyReduction_40 (_ `HappyStk`
- (HappyAbsSyn25 happy_var_4) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn28 happy_var_2) `HappyStk`
- (HappyAbsSyn26 happy_var_1) `HappyStk`
- happyRest)
- = HappyAbsSyn22
- (MBody happy_var_1 happy_var_2 (reverse happy_var_4)
- ) `HappyStk` happyRest
-
-happyReduce_41 = happySpecReduce_1 24# happyReduction_41
-happyReduction_41 (HappyAbsSyn32 happy_var_1)
- = HappyAbsSyn22
- (MNoBody happy_var_1
- )
-happyReduction_41 _ = notHappyAtAll
-
-happyReduce_42 = happySpecReduce_3 24# happyReduction_42
-happyReduction_42 (HappyAbsSyn27 happy_var_3)
- _
- (HappyAbsSyn33 happy_var_1)
- = HappyAbsSyn22
- (MWith happy_var_1 happy_var_3
- )
-happyReduction_42 _ _ _ = notHappyAtAll
-
-happyReduce_43 = happyReduce 8# 24# happyReduction_43
-happyReduction_43 (_ `HappyStk`
- (HappyAbsSyn25 happy_var_7) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn28 happy_var_5) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn27 happy_var_3) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn33 happy_var_1) `HappyStk`
- happyRest)
- = HappyAbsSyn22
- (MWithBody happy_var_1 happy_var_3 happy_var_5 (reverse happy_var_7)
- ) `HappyStk` happyRest
-
-happyReduce_44 = happyReduce 5# 24# happyReduction_44
-happyReduction_44 ((HappyAbsSyn27 happy_var_5) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn33 happy_var_3) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn32 happy_var_1) `HappyStk`
- happyRest)
- = HappyAbsSyn22
- (MWithE happy_var_1 happy_var_3 happy_var_5
- ) `HappyStk` happyRest
-
-happyReduce_45 = happyReduce 10# 24# happyReduction_45
-happyReduction_45 (_ `HappyStk`
- (HappyAbsSyn25 happy_var_9) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn28 happy_var_7) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn27 happy_var_5) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn33 happy_var_3) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn32 happy_var_1) `HappyStk`
- happyRest)
- = HappyAbsSyn22
- (MWithEBody happy_var_1 happy_var_3 happy_var_5 happy_var_7 (reverse happy_var_9)
- ) `HappyStk` happyRest
-
-happyReduce_46 = happySpecReduce_2 24# happyReduction_46
-happyReduction_46 (HappyAbsSyn12 happy_var_2)
- _
- = HappyAbsSyn22
- (MReuse happy_var_2
- )
-happyReduction_46 _ _ = notHappyAtAll
-
-happyReduce_47 = happySpecReduce_2 24# happyReduction_47
-happyReduction_47 (HappyAbsSyn32 happy_var_2)
- _
- = HappyAbsSyn22
- (MUnion happy_var_2
- )
-happyReduction_47 _ _ = notHappyAtAll
-
-happyReduce_48 = happySpecReduce_0 25# happyReduction_48
-happyReduction_48 = HappyAbsSyn25
- ([]
- )
-
-happyReduce_49 = happySpecReduce_2 25# happyReduction_49
-happyReduction_49 (HappyAbsSyn35 happy_var_2)
- (HappyAbsSyn25 happy_var_1)
- = HappyAbsSyn25
- (flip (:) happy_var_1 happy_var_2
- )
-happyReduction_49 _ _ = notHappyAtAll
-
-happyReduce_50 = happySpecReduce_2 26# happyReduction_50
-happyReduction_50 _
- (HappyAbsSyn32 happy_var_1)
- = HappyAbsSyn26
- (Ext happy_var_1
- )
-happyReduction_50 _ _ = notHappyAtAll
-
-happyReduce_51 = happySpecReduce_0 26# happyReduction_51
-happyReduction_51 = HappyAbsSyn26
- (NoExt
- )
-
-happyReduce_52 = happySpecReduce_0 27# happyReduction_52
-happyReduction_52 = HappyAbsSyn27
- ([]
- )
-
-happyReduce_53 = happySpecReduce_1 27# happyReduction_53
-happyReduction_53 (HappyAbsSyn29 happy_var_1)
- = HappyAbsSyn27
- ((:[]) happy_var_1
- )
-happyReduction_53 _ = notHappyAtAll
-
-happyReduce_54 = happySpecReduce_3 27# happyReduction_54
-happyReduction_54 (HappyAbsSyn27 happy_var_3)
- _
- (HappyAbsSyn29 happy_var_1)
- = HappyAbsSyn27
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_54 _ _ _ = notHappyAtAll
-
-happyReduce_55 = happySpecReduce_0 28# happyReduction_55
-happyReduction_55 = HappyAbsSyn28
- (NoOpens
- )
-
-happyReduce_56 = happySpecReduce_3 28# happyReduction_56
-happyReduction_56 _
- (HappyAbsSyn27 happy_var_2)
- _
- = HappyAbsSyn28
- (OpenIn happy_var_2
- )
-happyReduction_56 _ _ _ = notHappyAtAll
-
-happyReduce_57 = happySpecReduce_1 29# happyReduction_57
-happyReduction_57 (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn29
- (OName happy_var_1
- )
-happyReduction_57 _ = notHappyAtAll
-
-happyReduce_58 = happyReduce 4# 29# happyReduction_58
-happyReduction_58 (_ `HappyStk`
- (HappyAbsSyn12 happy_var_3) `HappyStk`
- (HappyAbsSyn31 happy_var_2) `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn29
- (OQualQO happy_var_2 happy_var_3
- ) `HappyStk` happyRest
-
-happyReduce_59 = happyReduce 6# 29# happyReduction_59
-happyReduction_59 (_ `HappyStk`
- (HappyAbsSyn12 happy_var_5) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn12 happy_var_3) `HappyStk`
- (HappyAbsSyn31 happy_var_2) `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn29
- (OQual happy_var_2 happy_var_3 happy_var_5
- ) `HappyStk` happyRest
-
-happyReduce_60 = happySpecReduce_0 30# happyReduction_60
-happyReduction_60 = HappyAbsSyn30
- (CMCompl
- )
-
-happyReduce_61 = happySpecReduce_1 30# happyReduction_61
-happyReduction_61 _
- = HappyAbsSyn30
- (CMIncompl
- )
-
-happyReduce_62 = happySpecReduce_0 31# happyReduction_62
-happyReduction_62 = HappyAbsSyn31
- (QOCompl
- )
-
-happyReduce_63 = happySpecReduce_1 31# happyReduction_63
-happyReduction_63 _
- = HappyAbsSyn31
- (QOIncompl
- )
-
-happyReduce_64 = happySpecReduce_1 31# happyReduction_64
-happyReduction_64 _
- = HappyAbsSyn31
- (QOInterface
- )
-
-happyReduce_65 = happySpecReduce_0 32# happyReduction_65
-happyReduction_65 = HappyAbsSyn32
- ([]
- )
-
-happyReduce_66 = happySpecReduce_1 32# happyReduction_66
-happyReduction_66 (HappyAbsSyn33 happy_var_1)
- = HappyAbsSyn32
- ((:[]) happy_var_1
- )
-happyReduction_66 _ = notHappyAtAll
-
-happyReduce_67 = happySpecReduce_3 32# happyReduction_67
-happyReduction_67 (HappyAbsSyn32 happy_var_3)
- _
- (HappyAbsSyn33 happy_var_1)
- = HappyAbsSyn32
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_67 _ _ _ = notHappyAtAll
-
-happyReduce_68 = happySpecReduce_1 33# happyReduction_68
-happyReduction_68 (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn33
- (IAll happy_var_1
- )
-happyReduction_68 _ = notHappyAtAll
-
-happyReduce_69 = happyReduce 4# 33# happyReduction_69
-happyReduction_69 (_ `HappyStk`
- (HappyAbsSyn53 happy_var_3) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn12 happy_var_1) `HappyStk`
- happyRest)
- = HappyAbsSyn33
- (ISome happy_var_1 happy_var_3
- ) `HappyStk` happyRest
-
-happyReduce_70 = happyReduce 5# 33# happyReduction_70
-happyReduction_70 (_ `HappyStk`
- (HappyAbsSyn53 happy_var_4) `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn12 happy_var_1) `HappyStk`
- happyRest)
- = HappyAbsSyn33
- (IMinus happy_var_1 happy_var_4
- ) `HappyStk` happyRest
-
-happyReduce_71 = happySpecReduce_3 34# happyReduction_71
-happyReduction_71 (HappyAbsSyn58 happy_var_3)
- _
- (HappyAbsSyn55 happy_var_1)
- = HappyAbsSyn34
- (DDecl happy_var_1 happy_var_3
- )
-happyReduction_71 _ _ _ = notHappyAtAll
-
-happyReduce_72 = happySpecReduce_3 34# happyReduction_72
-happyReduction_72 (HappyAbsSyn58 happy_var_3)
- _
- (HappyAbsSyn55 happy_var_1)
- = HappyAbsSyn34
- (DDef happy_var_1 happy_var_3
- )
-happyReduction_72 _ _ _ = notHappyAtAll
-
-happyReduce_73 = happyReduce 4# 34# happyReduction_73
-happyReduction_73 ((HappyAbsSyn58 happy_var_4) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn74 happy_var_2) `HappyStk`
- (HappyAbsSyn54 happy_var_1) `HappyStk`
- happyRest)
- = HappyAbsSyn34
- (DPatt happy_var_1 happy_var_2 happy_var_4
- ) `HappyStk` happyRest
-
-happyReduce_74 = happyReduce 5# 34# happyReduction_74
-happyReduction_74 ((HappyAbsSyn58 happy_var_5) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn58 happy_var_3) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn55 happy_var_1) `HappyStk`
- happyRest)
- = HappyAbsSyn34
- (DFull happy_var_1 happy_var_3 happy_var_5
- ) `HappyStk` happyRest
-
-happyReduce_75 = happySpecReduce_2 35# happyReduction_75
-happyReduction_75 (HappyAbsSyn46 happy_var_2)
- _
- = HappyAbsSyn35
- (DefCat happy_var_2
- )
-happyReduction_75 _ _ = notHappyAtAll
-
-happyReduce_76 = happySpecReduce_2 35# happyReduction_76
-happyReduction_76 (HappyAbsSyn47 happy_var_2)
- _
- = HappyAbsSyn35
- (DefFun happy_var_2
- )
-happyReduction_76 _ _ = notHappyAtAll
-
-happyReduce_77 = happySpecReduce_2 35# happyReduction_77
-happyReduction_77 (HappyAbsSyn47 happy_var_2)
- _
- = HappyAbsSyn35
- (DefFunData happy_var_2
- )
-happyReduction_77 _ _ = notHappyAtAll
-
-happyReduce_78 = happySpecReduce_2 35# happyReduction_78
-happyReduction_78 (HappyAbsSyn45 happy_var_2)
- _
- = HappyAbsSyn35
- (DefDef happy_var_2
- )
-happyReduction_78 _ _ = notHappyAtAll
-
-happyReduce_79 = happySpecReduce_2 35# happyReduction_79
-happyReduction_79 (HappyAbsSyn48 happy_var_2)
- _
- = HappyAbsSyn35
- (DefData happy_var_2
- )
-happyReduction_79 _ _ = notHappyAtAll
-
-happyReduce_80 = happySpecReduce_2 35# happyReduction_80
-happyReduction_80 (HappyAbsSyn45 happy_var_2)
- _
- = HappyAbsSyn35
- (DefTrans happy_var_2
- )
-happyReduction_80 _ _ = notHappyAtAll
-
-happyReduce_81 = happySpecReduce_2 35# happyReduction_81
-happyReduction_81 (HappyAbsSyn49 happy_var_2)
- _
- = HappyAbsSyn35
- (DefPar happy_var_2
- )
-happyReduction_81 _ _ = notHappyAtAll
-
-happyReduce_82 = happySpecReduce_2 35# happyReduction_82
-happyReduction_82 (HappyAbsSyn45 happy_var_2)
- _
- = HappyAbsSyn35
- (DefOper happy_var_2
- )
-happyReduction_82 _ _ = notHappyAtAll
-
-happyReduce_83 = happySpecReduce_2 35# happyReduction_83
-happyReduction_83 (HappyAbsSyn50 happy_var_2)
- _
- = HappyAbsSyn35
- (DefLincat happy_var_2
- )
-happyReduction_83 _ _ = notHappyAtAll
-
-happyReduce_84 = happySpecReduce_2 35# happyReduction_84
-happyReduction_84 (HappyAbsSyn45 happy_var_2)
- _
- = HappyAbsSyn35
- (DefLindef happy_var_2
- )
-happyReduction_84 _ _ = notHappyAtAll
-
-happyReduce_85 = happySpecReduce_2 35# happyReduction_85
-happyReduction_85 (HappyAbsSyn45 happy_var_2)
- _
- = HappyAbsSyn35
- (DefLin happy_var_2
- )
-happyReduction_85 _ _ = notHappyAtAll
-
-happyReduce_86 = happySpecReduce_3 35# happyReduction_86
-happyReduction_86 (HappyAbsSyn50 happy_var_3)
- _
- _
- = HappyAbsSyn35
- (DefPrintCat happy_var_3
- )
-happyReduction_86 _ _ _ = notHappyAtAll
-
-happyReduce_87 = happySpecReduce_3 35# happyReduction_87
-happyReduction_87 (HappyAbsSyn50 happy_var_3)
- _
- _
- = HappyAbsSyn35
- (DefPrintFun happy_var_3
- )
-happyReduction_87 _ _ _ = notHappyAtAll
-
-happyReduce_88 = happySpecReduce_2 35# happyReduction_88
-happyReduction_88 (HappyAbsSyn51 happy_var_2)
- _
- = HappyAbsSyn35
- (DefFlag happy_var_2
- )
-happyReduction_88 _ _ = notHappyAtAll
-
-happyReduce_89 = happySpecReduce_2 35# happyReduction_89
-happyReduction_89 (HappyAbsSyn50 happy_var_2)
- _
- = HappyAbsSyn35
- (DefPrintOld happy_var_2
- )
-happyReduction_89 _ _ = notHappyAtAll
-
-happyReduce_90 = happySpecReduce_2 35# happyReduction_90
-happyReduction_90 (HappyAbsSyn45 happy_var_2)
- _
- = HappyAbsSyn35
- (DefLintype happy_var_2
- )
-happyReduction_90 _ _ = notHappyAtAll
-
-happyReduce_91 = happySpecReduce_2 35# happyReduction_91
-happyReduction_91 (HappyAbsSyn45 happy_var_2)
- _
- = HappyAbsSyn35
- (DefPattern happy_var_2
- )
-happyReduction_91 _ _ = notHappyAtAll
-
-happyReduce_92 = happyReduce 7# 35# happyReduction_92
-happyReduction_92 (_ `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn25 happy_var_5) `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn12 happy_var_2) `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn35
- (DefPackage happy_var_2 (reverse happy_var_5)
- ) `HappyStk` happyRest
-
-happyReduce_93 = happySpecReduce_2 35# happyReduction_93
-happyReduction_93 (HappyAbsSyn45 happy_var_2)
- _
- = HappyAbsSyn35
- (DefVars happy_var_2
- )
-happyReduction_93 _ _ = notHappyAtAll
-
-happyReduce_94 = happySpecReduce_3 35# happyReduction_94
-happyReduction_94 _
- (HappyAbsSyn12 happy_var_2)
- _
- = HappyAbsSyn35
- (DefTokenizer happy_var_2
- )
-happyReduction_94 _ _ _ = notHappyAtAll
-
-happyReduce_95 = happySpecReduce_2 36# happyReduction_95
-happyReduction_95 (HappyAbsSyn89 happy_var_2)
- (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn36
- (SimpleCatDef happy_var_1 (reverse happy_var_2)
- )
-happyReduction_95 _ _ = notHappyAtAll
-
-happyReduce_96 = happyReduce 4# 36# happyReduction_96
-happyReduction_96 (_ `HappyStk`
- (HappyAbsSyn89 happy_var_3) `HappyStk`
- (HappyAbsSyn12 happy_var_2) `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn36
- (ListCatDef happy_var_2 (reverse happy_var_3)
- ) `HappyStk` happyRest
-
-happyReduce_97 = happyReduce 7# 36# happyReduction_97
-happyReduction_97 (_ `HappyStk`
- (HappyAbsSyn8 happy_var_6) `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn89 happy_var_3) `HappyStk`
- (HappyAbsSyn12 happy_var_2) `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn36
- (ListSizeCatDef happy_var_2 (reverse happy_var_3) happy_var_6
- ) `HappyStk` happyRest
-
-happyReduce_98 = happySpecReduce_3 37# happyReduction_98
-happyReduction_98 (HappyAbsSyn58 happy_var_3)
- _
- (HappyAbsSyn53 happy_var_1)
- = HappyAbsSyn37
- (FunDef happy_var_1 happy_var_3
- )
-happyReduction_98 _ _ _ = notHappyAtAll
-
-happyReduce_99 = happySpecReduce_3 38# happyReduction_99
-happyReduction_99 (HappyAbsSyn40 happy_var_3)
- _
- (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn38
- (DataDef happy_var_1 happy_var_3
- )
-happyReduction_99 _ _ _ = notHappyAtAll
-
-happyReduce_100 = happySpecReduce_1 39# happyReduction_100
-happyReduction_100 (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn39
- (DataId happy_var_1
- )
-happyReduction_100 _ = notHappyAtAll
-
-happyReduce_101 = happySpecReduce_3 39# happyReduction_101
-happyReduction_101 (HappyAbsSyn12 happy_var_3)
- _
- (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn39
- (DataQId happy_var_1 happy_var_3
- )
-happyReduction_101 _ _ _ = notHappyAtAll
-
-happyReduce_102 = happySpecReduce_0 40# happyReduction_102
-happyReduction_102 = HappyAbsSyn40
- ([]
- )
-
-happyReduce_103 = happySpecReduce_1 40# happyReduction_103
-happyReduction_103 (HappyAbsSyn39 happy_var_1)
- = HappyAbsSyn40
- ((:[]) happy_var_1
- )
-happyReduction_103 _ = notHappyAtAll
-
-happyReduce_104 = happySpecReduce_3 40# happyReduction_104
-happyReduction_104 (HappyAbsSyn40 happy_var_3)
- _
- (HappyAbsSyn39 happy_var_1)
- = HappyAbsSyn40
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_104 _ _ _ = notHappyAtAll
-
-happyReduce_105 = happySpecReduce_3 41# happyReduction_105
-happyReduction_105 (HappyAbsSyn52 happy_var_3)
- _
- (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn41
- (ParDefDir happy_var_1 happy_var_3
- )
-happyReduction_105 _ _ _ = notHappyAtAll
-
-happyReduce_106 = happyReduce 6# 41# happyReduction_106
-happyReduction_106 (_ `HappyStk`
- (HappyAbsSyn12 happy_var_5) `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn12 happy_var_1) `HappyStk`
- happyRest)
- = HappyAbsSyn41
- (ParDefIndir happy_var_1 happy_var_5
- ) `HappyStk` happyRest
-
-happyReduce_107 = happySpecReduce_1 41# happyReduction_107
-happyReduction_107 (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn41
- (ParDefAbs happy_var_1
- )
-happyReduction_107 _ = notHappyAtAll
-
-happyReduce_108 = happySpecReduce_2 42# happyReduction_108
-happyReduction_108 (HappyAbsSyn89 happy_var_2)
- (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn42
- (ParConstr happy_var_1 (reverse happy_var_2)
- )
-happyReduction_108 _ _ = notHappyAtAll
-
-happyReduce_109 = happySpecReduce_3 43# happyReduction_109
-happyReduction_109 (HappyAbsSyn58 happy_var_3)
- _
- (HappyAbsSyn55 happy_var_1)
- = HappyAbsSyn43
- (PrintDef happy_var_1 happy_var_3
- )
-happyReduction_109 _ _ _ = notHappyAtAll
-
-happyReduce_110 = happySpecReduce_3 44# happyReduction_110
-happyReduction_110 (HappyAbsSyn12 happy_var_3)
- _
- (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn44
- (FlagDef happy_var_1 happy_var_3
- )
-happyReduction_110 _ _ _ = notHappyAtAll
-
-happyReduce_111 = happySpecReduce_2 45# happyReduction_111
-happyReduction_111 _
- (HappyAbsSyn34 happy_var_1)
- = HappyAbsSyn45
- ((:[]) happy_var_1
- )
-happyReduction_111 _ _ = notHappyAtAll
-
-happyReduce_112 = happySpecReduce_3 45# happyReduction_112
-happyReduction_112 (HappyAbsSyn45 happy_var_3)
- _
- (HappyAbsSyn34 happy_var_1)
- = HappyAbsSyn45
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_112 _ _ _ = notHappyAtAll
-
-happyReduce_113 = happySpecReduce_2 46# happyReduction_113
-happyReduction_113 _
- (HappyAbsSyn36 happy_var_1)
- = HappyAbsSyn46
- ((:[]) happy_var_1
- )
-happyReduction_113 _ _ = notHappyAtAll
-
-happyReduce_114 = happySpecReduce_3 46# happyReduction_114
-happyReduction_114 (HappyAbsSyn46 happy_var_3)
- _
- (HappyAbsSyn36 happy_var_1)
- = HappyAbsSyn46
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_114 _ _ _ = notHappyAtAll
-
-happyReduce_115 = happySpecReduce_2 47# happyReduction_115
-happyReduction_115 _
- (HappyAbsSyn37 happy_var_1)
- = HappyAbsSyn47
- ((:[]) happy_var_1
- )
-happyReduction_115 _ _ = notHappyAtAll
-
-happyReduce_116 = happySpecReduce_3 47# happyReduction_116
-happyReduction_116 (HappyAbsSyn47 happy_var_3)
- _
- (HappyAbsSyn37 happy_var_1)
- = HappyAbsSyn47
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_116 _ _ _ = notHappyAtAll
-
-happyReduce_117 = happySpecReduce_2 48# happyReduction_117
-happyReduction_117 _
- (HappyAbsSyn38 happy_var_1)
- = HappyAbsSyn48
- ((:[]) happy_var_1
- )
-happyReduction_117 _ _ = notHappyAtAll
-
-happyReduce_118 = happySpecReduce_3 48# happyReduction_118
-happyReduction_118 (HappyAbsSyn48 happy_var_3)
- _
- (HappyAbsSyn38 happy_var_1)
- = HappyAbsSyn48
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_118 _ _ _ = notHappyAtAll
-
-happyReduce_119 = happySpecReduce_2 49# happyReduction_119
-happyReduction_119 _
- (HappyAbsSyn41 happy_var_1)
- = HappyAbsSyn49
- ((:[]) happy_var_1
- )
-happyReduction_119 _ _ = notHappyAtAll
-
-happyReduce_120 = happySpecReduce_3 49# happyReduction_120
-happyReduction_120 (HappyAbsSyn49 happy_var_3)
- _
- (HappyAbsSyn41 happy_var_1)
- = HappyAbsSyn49
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_120 _ _ _ = notHappyAtAll
-
-happyReduce_121 = happySpecReduce_2 50# happyReduction_121
-happyReduction_121 _
- (HappyAbsSyn43 happy_var_1)
- = HappyAbsSyn50
- ((:[]) happy_var_1
- )
-happyReduction_121 _ _ = notHappyAtAll
-
-happyReduce_122 = happySpecReduce_3 50# happyReduction_122
-happyReduction_122 (HappyAbsSyn50 happy_var_3)
- _
- (HappyAbsSyn43 happy_var_1)
- = HappyAbsSyn50
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_122 _ _ _ = notHappyAtAll
-
-happyReduce_123 = happySpecReduce_2 51# happyReduction_123
-happyReduction_123 _
- (HappyAbsSyn44 happy_var_1)
- = HappyAbsSyn51
- ((:[]) happy_var_1
- )
-happyReduction_123 _ _ = notHappyAtAll
-
-happyReduce_124 = happySpecReduce_3 51# happyReduction_124
-happyReduction_124 (HappyAbsSyn51 happy_var_3)
- _
- (HappyAbsSyn44 happy_var_1)
- = HappyAbsSyn51
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_124 _ _ _ = notHappyAtAll
-
-happyReduce_125 = happySpecReduce_0 52# happyReduction_125
-happyReduction_125 = HappyAbsSyn52
- ([]
- )
-
-happyReduce_126 = happySpecReduce_1 52# happyReduction_126
-happyReduction_126 (HappyAbsSyn42 happy_var_1)
- = HappyAbsSyn52
- ((:[]) happy_var_1
- )
-happyReduction_126 _ = notHappyAtAll
-
-happyReduce_127 = happySpecReduce_3 52# happyReduction_127
-happyReduction_127 (HappyAbsSyn52 happy_var_3)
- _
- (HappyAbsSyn42 happy_var_1)
- = HappyAbsSyn52
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_127 _ _ _ = notHappyAtAll
-
-happyReduce_128 = happySpecReduce_1 53# happyReduction_128
-happyReduction_128 (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn53
- ((:[]) happy_var_1
- )
-happyReduction_128 _ = notHappyAtAll
-
-happyReduce_129 = happySpecReduce_3 53# happyReduction_129
-happyReduction_129 (HappyAbsSyn53 happy_var_3)
- _
- (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn53
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_129 _ _ _ = notHappyAtAll
-
-happyReduce_130 = happySpecReduce_1 54# happyReduction_130
-happyReduction_130 (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn54
- (IdentName happy_var_1
- )
-happyReduction_130 _ = notHappyAtAll
-
-happyReduce_131 = happySpecReduce_3 54# happyReduction_131
-happyReduction_131 _
- (HappyAbsSyn12 happy_var_2)
- _
- = HappyAbsSyn54
- (ListName happy_var_2
- )
-happyReduction_131 _ _ _ = notHappyAtAll
-
-happyReduce_132 = happySpecReduce_1 55# happyReduction_132
-happyReduction_132 (HappyAbsSyn54 happy_var_1)
- = HappyAbsSyn55
- ((:[]) happy_var_1
- )
-happyReduction_132 _ = notHappyAtAll
-
-happyReduce_133 = happySpecReduce_3 55# happyReduction_133
-happyReduction_133 (HappyAbsSyn55 happy_var_3)
- _
- (HappyAbsSyn54 happy_var_1)
- = HappyAbsSyn55
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_133 _ _ _ = notHappyAtAll
-
-happyReduce_134 = happySpecReduce_3 56# happyReduction_134
-happyReduction_134 (HappyAbsSyn58 happy_var_3)
- _
- (HappyAbsSyn53 happy_var_1)
- = HappyAbsSyn56
- (LDDecl happy_var_1 happy_var_3
- )
-happyReduction_134 _ _ _ = notHappyAtAll
-
-happyReduce_135 = happySpecReduce_3 56# happyReduction_135
-happyReduction_135 (HappyAbsSyn58 happy_var_3)
- _
- (HappyAbsSyn53 happy_var_1)
- = HappyAbsSyn56
- (LDDef happy_var_1 happy_var_3
- )
-happyReduction_135 _ _ _ = notHappyAtAll
-
-happyReduce_136 = happyReduce 5# 56# happyReduction_136
-happyReduction_136 ((HappyAbsSyn58 happy_var_5) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn58 happy_var_3) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn53 happy_var_1) `HappyStk`
- happyRest)
- = HappyAbsSyn56
- (LDFull happy_var_1 happy_var_3 happy_var_5
- ) `HappyStk` happyRest
-
-happyReduce_137 = happySpecReduce_0 57# happyReduction_137
-happyReduction_137 = HappyAbsSyn57
- ([]
- )
-
-happyReduce_138 = happySpecReduce_1 57# happyReduction_138
-happyReduction_138 (HappyAbsSyn56 happy_var_1)
- = HappyAbsSyn57
- ((:[]) happy_var_1
- )
-happyReduction_138 _ = notHappyAtAll
-
-happyReduce_139 = happySpecReduce_3 57# happyReduction_139
-happyReduction_139 (HappyAbsSyn57 happy_var_3)
- _
- (HappyAbsSyn56 happy_var_1)
- = HappyAbsSyn57
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_139 _ _ _ = notHappyAtAll
-
-happyReduce_140 = happySpecReduce_1 58# happyReduction_140
-happyReduction_140 (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn58
- (EIdent happy_var_1
- )
-happyReduction_140 _ = notHappyAtAll
-
-happyReduce_141 = happySpecReduce_3 58# happyReduction_141
-happyReduction_141 _
- (HappyAbsSyn12 happy_var_2)
- _
- = HappyAbsSyn58
- (EConstr happy_var_2
- )
-happyReduction_141 _ _ _ = notHappyAtAll
-
-happyReduce_142 = happySpecReduce_3 58# happyReduction_142
-happyReduction_142 _
- (HappyAbsSyn12 happy_var_2)
- _
- = HappyAbsSyn58
- (ECons happy_var_2
- )
-happyReduction_142 _ _ _ = notHappyAtAll
-
-happyReduce_143 = happySpecReduce_1 58# happyReduction_143
-happyReduction_143 (HappyAbsSyn72 happy_var_1)
- = HappyAbsSyn58
- (ESort happy_var_1
- )
-happyReduction_143 _ = notHappyAtAll
-
-happyReduce_144 = happySpecReduce_1 58# happyReduction_144
-happyReduction_144 (HappyAbsSyn9 happy_var_1)
- = HappyAbsSyn58
- (EString happy_var_1
- )
-happyReduction_144 _ = notHappyAtAll
-
-happyReduce_145 = happySpecReduce_1 58# happyReduction_145
-happyReduction_145 (HappyAbsSyn8 happy_var_1)
- = HappyAbsSyn58
- (EInt happy_var_1
- )
-happyReduction_145 _ = notHappyAtAll
-
-happyReduce_146 = happySpecReduce_1 58# happyReduction_146
-happyReduction_146 (HappyAbsSyn10 happy_var_1)
- = HappyAbsSyn58
- (EFloat happy_var_1
- )
-happyReduction_146 _ = notHappyAtAll
-
-happyReduce_147 = happySpecReduce_1 58# happyReduction_147
-happyReduction_147 _
- = HappyAbsSyn58
- (EMeta
- )
-
-happyReduce_148 = happySpecReduce_2 58# happyReduction_148
-happyReduction_148 _
- _
- = HappyAbsSyn58
- (EEmpty
- )
-
-happyReduce_149 = happySpecReduce_1 58# happyReduction_149
-happyReduction_149 _
- = HappyAbsSyn58
- (EData
- )
-
-happyReduce_150 = happyReduce 4# 58# happyReduction_150
-happyReduction_150 (_ `HappyStk`
- (HappyAbsSyn66 happy_var_3) `HappyStk`
- (HappyAbsSyn12 happy_var_2) `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn58
- (EList happy_var_2 happy_var_3
- ) `HappyStk` happyRest
-
-happyReduce_151 = happySpecReduce_3 58# happyReduction_151
-happyReduction_151 _
- (HappyAbsSyn9 happy_var_2)
- _
- = HappyAbsSyn58
- (EStrings happy_var_2
- )
-happyReduction_151 _ _ _ = notHappyAtAll
-
-happyReduce_152 = happySpecReduce_3 58# happyReduction_152
-happyReduction_152 _
- (HappyAbsSyn57 happy_var_2)
- _
- = HappyAbsSyn58
- (ERecord happy_var_2
- )
-happyReduction_152 _ _ _ = notHappyAtAll
-
-happyReduce_153 = happySpecReduce_3 58# happyReduction_153
-happyReduction_153 _
- (HappyAbsSyn80 happy_var_2)
- _
- = HappyAbsSyn58
- (ETuple happy_var_2
- )
-happyReduction_153 _ _ _ = notHappyAtAll
-
-happyReduce_154 = happyReduce 4# 58# happyReduction_154
-happyReduction_154 (_ `HappyStk`
- (HappyAbsSyn12 happy_var_3) `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn58
- (EIndir happy_var_3
- ) `HappyStk` happyRest
-
-happyReduce_155 = happyReduce 5# 58# happyReduction_155
-happyReduction_155 (_ `HappyStk`
- (HappyAbsSyn58 happy_var_4) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn58 happy_var_2) `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn58
- (ETyped happy_var_2 happy_var_4
- ) `HappyStk` happyRest
-
-happyReduce_156 = happySpecReduce_3 58# happyReduction_156
-happyReduction_156 _
- (HappyAbsSyn58 happy_var_2)
- _
- = HappyAbsSyn58
- (happy_var_2
- )
-happyReduction_156 _ _ _ = notHappyAtAll
-
-happyReduce_157 = happySpecReduce_1 58# happyReduction_157
-happyReduction_157 (HappyAbsSyn11 happy_var_1)
- = HappyAbsSyn58
- (ELString happy_var_1
- )
-happyReduction_157 _ = notHappyAtAll
-
-happyReduce_158 = happySpecReduce_3 59# happyReduction_158
-happyReduction_158 (HappyAbsSyn71 happy_var_3)
- _
- (HappyAbsSyn58 happy_var_1)
- = HappyAbsSyn58
- (EProj happy_var_1 happy_var_3
- )
-happyReduction_158 _ _ _ = notHappyAtAll
-
-happyReduce_159 = happyReduce 5# 59# happyReduction_159
-happyReduction_159 (_ `HappyStk`
- (HappyAbsSyn12 happy_var_4) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn12 happy_var_2) `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn58
- (EQConstr happy_var_2 happy_var_4
- ) `HappyStk` happyRest
-
-happyReduce_160 = happyReduce 4# 59# happyReduction_160
-happyReduction_160 ((HappyAbsSyn12 happy_var_4) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn12 happy_var_2) `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn58
- (EQCons happy_var_2 happy_var_4
- ) `HappyStk` happyRest
-
-happyReduce_161 = happySpecReduce_1 59# happyReduction_161
-happyReduction_161 (HappyAbsSyn58 happy_var_1)
- = HappyAbsSyn58
- (happy_var_1
- )
-happyReduction_161 _ = notHappyAtAll
-
-happyReduce_162 = happySpecReduce_2 60# happyReduction_162
-happyReduction_162 (HappyAbsSyn58 happy_var_2)
- (HappyAbsSyn58 happy_var_1)
- = HappyAbsSyn58
- (EApp happy_var_1 happy_var_2
- )
-happyReduction_162 _ _ = notHappyAtAll
-
-happyReduce_163 = happyReduce 4# 60# happyReduction_163
-happyReduction_163 (_ `HappyStk`
- (HappyAbsSyn83 happy_var_3) `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn58
- (ETable happy_var_3
- ) `HappyStk` happyRest
-
-happyReduce_164 = happyReduce 5# 60# happyReduction_164
-happyReduction_164 (_ `HappyStk`
- (HappyAbsSyn83 happy_var_4) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn58 happy_var_2) `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn58
- (ETTable happy_var_2 happy_var_4
- ) `HappyStk` happyRest
-
-happyReduce_165 = happyReduce 5# 60# happyReduction_165
-happyReduction_165 (_ `HappyStk`
- (HappyAbsSyn65 happy_var_4) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn58 happy_var_2) `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn58
- (EVTable happy_var_2 happy_var_4
- ) `HappyStk` happyRest
-
-happyReduce_166 = happyReduce 6# 60# happyReduction_166
-happyReduction_166 (_ `HappyStk`
- (HappyAbsSyn83 happy_var_5) `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn58 happy_var_2) `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn58
- (ECase happy_var_2 happy_var_5
- ) `HappyStk` happyRest
-
-happyReduce_167 = happyReduce 4# 60# happyReduction_167
-happyReduction_167 (_ `HappyStk`
- (HappyAbsSyn65 happy_var_3) `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn58
- (EVariants happy_var_3
- ) `HappyStk` happyRest
-
-happyReduce_168 = happyReduce 6# 60# happyReduction_168
-happyReduction_168 (_ `HappyStk`
- (HappyAbsSyn87 happy_var_5) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn58 happy_var_3) `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn58
- (EPre happy_var_3 happy_var_5
- ) `HappyStk` happyRest
-
-happyReduce_169 = happyReduce 4# 60# happyReduction_169
-happyReduction_169 (_ `HappyStk`
- (HappyAbsSyn65 happy_var_3) `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn58
- (EStrs happy_var_3
- ) `HappyStk` happyRest
-
-happyReduce_170 = happySpecReduce_3 60# happyReduction_170
-happyReduction_170 (HappyAbsSyn58 happy_var_3)
- _
- (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn58
- (EConAt happy_var_1 happy_var_3
- )
-happyReduction_170 _ _ _ = notHappyAtAll
-
-happyReduce_171 = happySpecReduce_2 60# happyReduction_171
-happyReduction_171 (HappyAbsSyn67 happy_var_2)
- _
- = HappyAbsSyn58
- (EPatt happy_var_2
- )
-happyReduction_171 _ _ = notHappyAtAll
-
-happyReduce_172 = happySpecReduce_2 60# happyReduction_172
-happyReduction_172 (HappyAbsSyn58 happy_var_2)
- _
- = HappyAbsSyn58
- (EPattType happy_var_2
- )
-happyReduction_172 _ _ = notHappyAtAll
-
-happyReduce_173 = happySpecReduce_1 60# happyReduction_173
-happyReduction_173 (HappyAbsSyn58 happy_var_1)
- = HappyAbsSyn58
- (happy_var_1
- )
-happyReduction_173 _ = notHappyAtAll
-
-happyReduce_174 = happySpecReduce_2 60# happyReduction_174
-happyReduction_174 (HappyAbsSyn12 happy_var_2)
- _
- = HappyAbsSyn58
- (ELin happy_var_2
- )
-happyReduction_174 _ _ = notHappyAtAll
-
-happyReduce_175 = happySpecReduce_3 61# happyReduction_175
-happyReduction_175 (HappyAbsSyn58 happy_var_3)
- _
- (HappyAbsSyn58 happy_var_1)
- = HappyAbsSyn58
- (ESelect happy_var_1 happy_var_3
- )
-happyReduction_175 _ _ _ = notHappyAtAll
-
-happyReduce_176 = happySpecReduce_3 61# happyReduction_176
-happyReduction_176 (HappyAbsSyn58 happy_var_3)
- _
- (HappyAbsSyn58 happy_var_1)
- = HappyAbsSyn58
- (ETupTyp happy_var_1 happy_var_3
- )
-happyReduction_176 _ _ _ = notHappyAtAll
-
-happyReduce_177 = happySpecReduce_3 61# happyReduction_177
-happyReduction_177 (HappyAbsSyn58 happy_var_3)
- _
- (HappyAbsSyn58 happy_var_1)
- = HappyAbsSyn58
- (EExtend happy_var_1 happy_var_3
- )
-happyReduction_177 _ _ _ = notHappyAtAll
-
-happyReduce_178 = happySpecReduce_1 61# happyReduction_178
-happyReduction_178 (HappyAbsSyn58 happy_var_1)
- = HappyAbsSyn58
- (happy_var_1
- )
-happyReduction_178 _ = notHappyAtAll
-
-happyReduce_179 = happySpecReduce_3 62# happyReduction_179
-happyReduction_179 (HappyAbsSyn58 happy_var_3)
- _
- (HappyAbsSyn58 happy_var_1)
- = HappyAbsSyn58
- (EGlue happy_var_1 happy_var_3
- )
-happyReduction_179 _ _ _ = notHappyAtAll
-
-happyReduce_180 = happySpecReduce_1 62# happyReduction_180
-happyReduction_180 (HappyAbsSyn58 happy_var_1)
- = HappyAbsSyn58
- (happy_var_1
- )
-happyReduction_180 _ = notHappyAtAll
-
-happyReduce_181 = happySpecReduce_3 63# happyReduction_181
-happyReduction_181 (HappyAbsSyn58 happy_var_3)
- _
- (HappyAbsSyn58 happy_var_1)
- = HappyAbsSyn58
- (EConcat happy_var_1 happy_var_3
- )
-happyReduction_181 _ _ _ = notHappyAtAll
-
-happyReduce_182 = happyReduce 4# 63# happyReduction_182
-happyReduction_182 ((HappyAbsSyn58 happy_var_4) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn76 happy_var_2) `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn58
- (EAbstr happy_var_2 happy_var_4
- ) `HappyStk` happyRest
-
-happyReduce_183 = happyReduce 5# 63# happyReduction_183
-happyReduction_183 ((HappyAbsSyn58 happy_var_5) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn76 happy_var_3) `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn58
- (ECTable happy_var_3 happy_var_5
- ) `HappyStk` happyRest
-
-happyReduce_184 = happySpecReduce_3 63# happyReduction_184
-happyReduction_184 (HappyAbsSyn58 happy_var_3)
- _
- (HappyAbsSyn77 happy_var_1)
- = HappyAbsSyn58
- (EProd happy_var_1 happy_var_3
- )
-happyReduction_184 _ _ _ = notHappyAtAll
-
-happyReduce_185 = happySpecReduce_3 63# happyReduction_185
-happyReduction_185 (HappyAbsSyn58 happy_var_3)
- _
- (HappyAbsSyn58 happy_var_1)
- = HappyAbsSyn58
- (ETType happy_var_1 happy_var_3
- )
-happyReduction_185 _ _ _ = notHappyAtAll
-
-happyReduce_186 = happyReduce 6# 63# happyReduction_186
-happyReduction_186 ((HappyAbsSyn58 happy_var_6) `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn57 happy_var_3) `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn58
- (ELet happy_var_3 happy_var_6
- ) `HappyStk` happyRest
-
-happyReduce_187 = happyReduce 4# 63# happyReduction_187
-happyReduction_187 ((HappyAbsSyn58 happy_var_4) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn57 happy_var_2) `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn58
- (ELetb happy_var_2 happy_var_4
- ) `HappyStk` happyRest
-
-happyReduce_188 = happyReduce 5# 63# happyReduction_188
-happyReduction_188 (_ `HappyStk`
- (HappyAbsSyn57 happy_var_4) `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn58 happy_var_1) `HappyStk`
- happyRest)
- = HappyAbsSyn58
- (EWhere happy_var_1 happy_var_4
- ) `HappyStk` happyRest
-
-happyReduce_189 = happyReduce 4# 63# happyReduction_189
-happyReduction_189 (_ `HappyStk`
- (HappyAbsSyn85 happy_var_3) `HappyStk`
- _ `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn58
- (EEqs happy_var_3
- ) `HappyStk` happyRest
-
-happyReduce_190 = happySpecReduce_3 63# happyReduction_190
-happyReduction_190 (HappyAbsSyn9 happy_var_3)
- (HappyAbsSyn58 happy_var_2)
- _
- = HappyAbsSyn58
- (EExample happy_var_2 happy_var_3
- )
-happyReduction_190 _ _ _ = notHappyAtAll
-
-happyReduce_191 = happySpecReduce_1 63# happyReduction_191
-happyReduction_191 (HappyAbsSyn58 happy_var_1)
- = HappyAbsSyn58
- (happy_var_1
- )
-happyReduction_191 _ = notHappyAtAll
-
-happyReduce_192 = happySpecReduce_1 64# happyReduction_192
-happyReduction_192 (HappyAbsSyn58 happy_var_1)
- = HappyAbsSyn58
- (happy_var_1
- )
-happyReduction_192 _ = notHappyAtAll
-
-happyReduce_193 = happySpecReduce_0 65# happyReduction_193
-happyReduction_193 = HappyAbsSyn65
- ([]
- )
-
-happyReduce_194 = happySpecReduce_1 65# happyReduction_194
-happyReduction_194 (HappyAbsSyn58 happy_var_1)
- = HappyAbsSyn65
- ((:[]) happy_var_1
- )
-happyReduction_194 _ = notHappyAtAll
-
-happyReduce_195 = happySpecReduce_3 65# happyReduction_195
-happyReduction_195 (HappyAbsSyn65 happy_var_3)
- _
- (HappyAbsSyn58 happy_var_1)
- = HappyAbsSyn65
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_195 _ _ _ = notHappyAtAll
-
-happyReduce_196 = happySpecReduce_0 66# happyReduction_196
-happyReduction_196 = HappyAbsSyn66
- (NilExp
- )
-
-happyReduce_197 = happySpecReduce_2 66# happyReduction_197
-happyReduction_197 (HappyAbsSyn66 happy_var_2)
- (HappyAbsSyn58 happy_var_1)
- = HappyAbsSyn66
- (ConsExp happy_var_1 happy_var_2
- )
-happyReduction_197 _ _ = notHappyAtAll
-
-happyReduce_198 = happySpecReduce_1 67# happyReduction_198
-happyReduction_198 _
- = HappyAbsSyn67
- (PChar
- )
-
-happyReduce_199 = happySpecReduce_3 67# happyReduction_199
-happyReduction_199 _
- (HappyAbsSyn9 happy_var_2)
- _
- = HappyAbsSyn67
- (PChars happy_var_2
- )
-happyReduction_199 _ _ _ = notHappyAtAll
-
-happyReduce_200 = happySpecReduce_2 67# happyReduction_200
-happyReduction_200 (HappyAbsSyn12 happy_var_2)
- _
- = HappyAbsSyn67
- (PMacro happy_var_2
- )
-happyReduction_200 _ _ = notHappyAtAll
-
-happyReduce_201 = happyReduce 4# 67# happyReduction_201
-happyReduction_201 ((HappyAbsSyn12 happy_var_4) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn12 happy_var_2) `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn67
- (PM happy_var_2 happy_var_4
- ) `HappyStk` happyRest
-
-happyReduce_202 = happySpecReduce_1 67# happyReduction_202
-happyReduction_202 _
- = HappyAbsSyn67
- (PW
- )
-
-happyReduce_203 = happySpecReduce_1 67# happyReduction_203
-happyReduction_203 (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn67
- (PV happy_var_1
- )
-happyReduction_203 _ = notHappyAtAll
-
-happyReduce_204 = happySpecReduce_3 67# happyReduction_204
-happyReduction_204 _
- (HappyAbsSyn12 happy_var_2)
- _
- = HappyAbsSyn67
- (PCon happy_var_2
- )
-happyReduction_204 _ _ _ = notHappyAtAll
-
-happyReduce_205 = happySpecReduce_3 67# happyReduction_205
-happyReduction_205 (HappyAbsSyn12 happy_var_3)
- _
- (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn67
- (PQ happy_var_1 happy_var_3
- )
-happyReduction_205 _ _ _ = notHappyAtAll
-
-happyReduce_206 = happySpecReduce_1 67# happyReduction_206
-happyReduction_206 (HappyAbsSyn8 happy_var_1)
- = HappyAbsSyn67
- (PInt happy_var_1
- )
-happyReduction_206 _ = notHappyAtAll
-
-happyReduce_207 = happySpecReduce_1 67# happyReduction_207
-happyReduction_207 (HappyAbsSyn10 happy_var_1)
- = HappyAbsSyn67
- (PFloat happy_var_1
- )
-happyReduction_207 _ = notHappyAtAll
-
-happyReduce_208 = happySpecReduce_1 67# happyReduction_208
-happyReduction_208 (HappyAbsSyn9 happy_var_1)
- = HappyAbsSyn67
- (PStr happy_var_1
- )
-happyReduction_208 _ = notHappyAtAll
-
-happyReduce_209 = happySpecReduce_3 67# happyReduction_209
-happyReduction_209 _
- (HappyAbsSyn73 happy_var_2)
- _
- = HappyAbsSyn67
- (PR happy_var_2
- )
-happyReduction_209 _ _ _ = notHappyAtAll
-
-happyReduce_210 = happySpecReduce_3 67# happyReduction_210
-happyReduction_210 _
- (HappyAbsSyn81 happy_var_2)
- _
- = HappyAbsSyn67
- (PTup happy_var_2
- )
-happyReduction_210 _ _ _ = notHappyAtAll
-
-happyReduce_211 = happySpecReduce_3 67# happyReduction_211
-happyReduction_211 _
- (HappyAbsSyn67 happy_var_2)
- _
- = HappyAbsSyn67
- (happy_var_2
- )
-happyReduction_211 _ _ _ = notHappyAtAll
-
-happyReduce_212 = happySpecReduce_2 68# happyReduction_212
-happyReduction_212 (HappyAbsSyn74 happy_var_2)
- (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn67
- (PC happy_var_1 happy_var_2
- )
-happyReduction_212 _ _ = notHappyAtAll
-
-happyReduce_213 = happyReduce 4# 68# happyReduction_213
-happyReduction_213 ((HappyAbsSyn74 happy_var_4) `HappyStk`
- (HappyAbsSyn12 happy_var_3) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn12 happy_var_1) `HappyStk`
- happyRest)
- = HappyAbsSyn67
- (PQC happy_var_1 happy_var_3 happy_var_4
- ) `HappyStk` happyRest
-
-happyReduce_214 = happySpecReduce_2 68# happyReduction_214
-happyReduction_214 _
- (HappyAbsSyn67 happy_var_1)
- = HappyAbsSyn67
- (PRep happy_var_1
- )
-happyReduction_214 _ _ = notHappyAtAll
-
-happyReduce_215 = happySpecReduce_3 68# happyReduction_215
-happyReduction_215 (HappyAbsSyn67 happy_var_3)
- _
- (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn67
- (PAs happy_var_1 happy_var_3
- )
-happyReduction_215 _ _ _ = notHappyAtAll
-
-happyReduce_216 = happySpecReduce_2 68# happyReduction_216
-happyReduction_216 (HappyAbsSyn67 happy_var_2)
- _
- = HappyAbsSyn67
- (PNeg happy_var_2
- )
-happyReduction_216 _ _ = notHappyAtAll
-
-happyReduce_217 = happySpecReduce_1 68# happyReduction_217
-happyReduction_217 (HappyAbsSyn67 happy_var_1)
- = HappyAbsSyn67
- (happy_var_1
- )
-happyReduction_217 _ = notHappyAtAll
-
-happyReduce_218 = happySpecReduce_3 69# happyReduction_218
-happyReduction_218 (HappyAbsSyn67 happy_var_3)
- _
- (HappyAbsSyn67 happy_var_1)
- = HappyAbsSyn67
- (PDisj happy_var_1 happy_var_3
- )
-happyReduction_218 _ _ _ = notHappyAtAll
-
-happyReduce_219 = happySpecReduce_3 69# happyReduction_219
-happyReduction_219 (HappyAbsSyn67 happy_var_3)
- _
- (HappyAbsSyn67 happy_var_1)
- = HappyAbsSyn67
- (PSeq happy_var_1 happy_var_3
- )
-happyReduction_219 _ _ _ = notHappyAtAll
-
-happyReduce_220 = happySpecReduce_1 69# happyReduction_220
-happyReduction_220 (HappyAbsSyn67 happy_var_1)
- = HappyAbsSyn67
- (happy_var_1
- )
-happyReduction_220 _ = notHappyAtAll
-
-happyReduce_221 = happySpecReduce_3 70# happyReduction_221
-happyReduction_221 (HappyAbsSyn67 happy_var_3)
- _
- (HappyAbsSyn53 happy_var_1)
- = HappyAbsSyn70
- (PA happy_var_1 happy_var_3
- )
-happyReduction_221 _ _ _ = notHappyAtAll
-
-happyReduce_222 = happySpecReduce_1 71# happyReduction_222
-happyReduction_222 (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn71
- (LIdent happy_var_1
- )
-happyReduction_222 _ = notHappyAtAll
-
-happyReduce_223 = happySpecReduce_2 71# happyReduction_223
-happyReduction_223 (HappyAbsSyn8 happy_var_2)
- _
- = HappyAbsSyn71
- (LVar happy_var_2
- )
-happyReduction_223 _ _ = notHappyAtAll
-
-happyReduce_224 = happySpecReduce_1 72# happyReduction_224
-happyReduction_224 _
- = HappyAbsSyn72
- (Sort_Type
- )
-
-happyReduce_225 = happySpecReduce_1 72# happyReduction_225
-happyReduction_225 _
- = HappyAbsSyn72
- (Sort_PType
- )
-
-happyReduce_226 = happySpecReduce_1 72# happyReduction_226
-happyReduction_226 _
- = HappyAbsSyn72
- (Sort_Tok
- )
-
-happyReduce_227 = happySpecReduce_1 72# happyReduction_227
-happyReduction_227 _
- = HappyAbsSyn72
- (Sort_Str
- )
-
-happyReduce_228 = happySpecReduce_1 72# happyReduction_228
-happyReduction_228 _
- = HappyAbsSyn72
- (Sort_Strs
- )
-
-happyReduce_229 = happySpecReduce_0 73# happyReduction_229
-happyReduction_229 = HappyAbsSyn73
- ([]
- )
-
-happyReduce_230 = happySpecReduce_1 73# happyReduction_230
-happyReduction_230 (HappyAbsSyn70 happy_var_1)
- = HappyAbsSyn73
- ((:[]) happy_var_1
- )
-happyReduction_230 _ = notHappyAtAll
-
-happyReduce_231 = happySpecReduce_3 73# happyReduction_231
-happyReduction_231 (HappyAbsSyn73 happy_var_3)
- _
- (HappyAbsSyn70 happy_var_1)
- = HappyAbsSyn73
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_231 _ _ _ = notHappyAtAll
-
-happyReduce_232 = happySpecReduce_1 74# happyReduction_232
-happyReduction_232 (HappyAbsSyn67 happy_var_1)
- = HappyAbsSyn74
- ((:[]) happy_var_1
- )
-happyReduction_232 _ = notHappyAtAll
-
-happyReduce_233 = happySpecReduce_2 74# happyReduction_233
-happyReduction_233 (HappyAbsSyn74 happy_var_2)
- (HappyAbsSyn67 happy_var_1)
- = HappyAbsSyn74
- ((:) happy_var_1 happy_var_2
- )
-happyReduction_233 _ _ = notHappyAtAll
-
-happyReduce_234 = happySpecReduce_1 75# happyReduction_234
-happyReduction_234 (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn75
- (BIdent happy_var_1
- )
-happyReduction_234 _ = notHappyAtAll
-
-happyReduce_235 = happySpecReduce_1 75# happyReduction_235
-happyReduction_235 _
- = HappyAbsSyn75
- (BWild
- )
-
-happyReduce_236 = happySpecReduce_0 76# happyReduction_236
-happyReduction_236 = HappyAbsSyn76
- ([]
- )
-
-happyReduce_237 = happySpecReduce_1 76# happyReduction_237
-happyReduction_237 (HappyAbsSyn75 happy_var_1)
- = HappyAbsSyn76
- ((:[]) happy_var_1
- )
-happyReduction_237 _ = notHappyAtAll
-
-happyReduce_238 = happySpecReduce_3 76# happyReduction_238
-happyReduction_238 (HappyAbsSyn76 happy_var_3)
- _
- (HappyAbsSyn75 happy_var_1)
- = HappyAbsSyn76
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_238 _ _ _ = notHappyAtAll
-
-happyReduce_239 = happyReduce 5# 77# happyReduction_239
-happyReduction_239 (_ `HappyStk`
- (HappyAbsSyn58 happy_var_4) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn76 happy_var_2) `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn77
- (DDec happy_var_2 happy_var_4
- ) `HappyStk` happyRest
-
-happyReduce_240 = happySpecReduce_1 77# happyReduction_240
-happyReduction_240 (HappyAbsSyn58 happy_var_1)
- = HappyAbsSyn77
- (DExp happy_var_1
- )
-happyReduction_240 _ = notHappyAtAll
-
-happyReduce_241 = happySpecReduce_1 78# happyReduction_241
-happyReduction_241 (HappyAbsSyn58 happy_var_1)
- = HappyAbsSyn78
- (TComp happy_var_1
- )
-happyReduction_241 _ = notHappyAtAll
-
-happyReduce_242 = happySpecReduce_1 79# happyReduction_242
-happyReduction_242 (HappyAbsSyn67 happy_var_1)
- = HappyAbsSyn79
- (PTComp happy_var_1
- )
-happyReduction_242 _ = notHappyAtAll
-
-happyReduce_243 = happySpecReduce_0 80# happyReduction_243
-happyReduction_243 = HappyAbsSyn80
- ([]
- )
-
-happyReduce_244 = happySpecReduce_1 80# happyReduction_244
-happyReduction_244 (HappyAbsSyn78 happy_var_1)
- = HappyAbsSyn80
- ((:[]) happy_var_1
- )
-happyReduction_244 _ = notHappyAtAll
-
-happyReduce_245 = happySpecReduce_3 80# happyReduction_245
-happyReduction_245 (HappyAbsSyn80 happy_var_3)
- _
- (HappyAbsSyn78 happy_var_1)
- = HappyAbsSyn80
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_245 _ _ _ = notHappyAtAll
-
-happyReduce_246 = happySpecReduce_0 81# happyReduction_246
-happyReduction_246 = HappyAbsSyn81
- ([]
- )
-
-happyReduce_247 = happySpecReduce_1 81# happyReduction_247
-happyReduction_247 (HappyAbsSyn79 happy_var_1)
- = HappyAbsSyn81
- ((:[]) happy_var_1
- )
-happyReduction_247 _ = notHappyAtAll
-
-happyReduce_248 = happySpecReduce_3 81# happyReduction_248
-happyReduction_248 (HappyAbsSyn81 happy_var_3)
- _
- (HappyAbsSyn79 happy_var_1)
- = HappyAbsSyn81
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_248 _ _ _ = notHappyAtAll
-
-happyReduce_249 = happySpecReduce_3 82# happyReduction_249
-happyReduction_249 (HappyAbsSyn58 happy_var_3)
- _
- (HappyAbsSyn67 happy_var_1)
- = HappyAbsSyn82
- (Case happy_var_1 happy_var_3
- )
-happyReduction_249 _ _ _ = notHappyAtAll
-
-happyReduce_250 = happySpecReduce_1 83# happyReduction_250
-happyReduction_250 (HappyAbsSyn82 happy_var_1)
- = HappyAbsSyn83
- ((:[]) happy_var_1
- )
-happyReduction_250 _ = notHappyAtAll
-
-happyReduce_251 = happySpecReduce_3 83# happyReduction_251
-happyReduction_251 (HappyAbsSyn83 happy_var_3)
- _
- (HappyAbsSyn82 happy_var_1)
- = HappyAbsSyn83
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_251 _ _ _ = notHappyAtAll
-
-happyReduce_252 = happySpecReduce_3 84# happyReduction_252
-happyReduction_252 (HappyAbsSyn58 happy_var_3)
- _
- (HappyAbsSyn74 happy_var_1)
- = HappyAbsSyn84
- (Equ happy_var_1 happy_var_3
- )
-happyReduction_252 _ _ _ = notHappyAtAll
-
-happyReduce_253 = happySpecReduce_0 85# happyReduction_253
-happyReduction_253 = HappyAbsSyn85
- ([]
- )
-
-happyReduce_254 = happySpecReduce_1 85# happyReduction_254
-happyReduction_254 (HappyAbsSyn84 happy_var_1)
- = HappyAbsSyn85
- ((:[]) happy_var_1
- )
-happyReduction_254 _ = notHappyAtAll
-
-happyReduce_255 = happySpecReduce_3 85# happyReduction_255
-happyReduction_255 (HappyAbsSyn85 happy_var_3)
- _
- (HappyAbsSyn84 happy_var_1)
- = HappyAbsSyn85
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_255 _ _ _ = notHappyAtAll
-
-happyReduce_256 = happySpecReduce_3 86# happyReduction_256
-happyReduction_256 (HappyAbsSyn58 happy_var_3)
- _
- (HappyAbsSyn58 happy_var_1)
- = HappyAbsSyn86
- (Alt happy_var_1 happy_var_3
- )
-happyReduction_256 _ _ _ = notHappyAtAll
-
-happyReduce_257 = happySpecReduce_0 87# happyReduction_257
-happyReduction_257 = HappyAbsSyn87
- ([]
- )
-
-happyReduce_258 = happySpecReduce_1 87# happyReduction_258
-happyReduction_258 (HappyAbsSyn86 happy_var_1)
- = HappyAbsSyn87
- ((:[]) happy_var_1
- )
-happyReduction_258 _ = notHappyAtAll
-
-happyReduce_259 = happySpecReduce_3 87# happyReduction_259
-happyReduction_259 (HappyAbsSyn87 happy_var_3)
- _
- (HappyAbsSyn86 happy_var_1)
- = HappyAbsSyn87
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_259 _ _ _ = notHappyAtAll
-
-happyReduce_260 = happyReduce 5# 88# happyReduction_260
-happyReduction_260 (_ `HappyStk`
- (HappyAbsSyn58 happy_var_4) `HappyStk`
- _ `HappyStk`
- (HappyAbsSyn76 happy_var_2) `HappyStk`
- _ `HappyStk`
- happyRest)
- = HappyAbsSyn88
- (DDDec happy_var_2 happy_var_4
- ) `HappyStk` happyRest
-
-happyReduce_261 = happySpecReduce_1 88# happyReduction_261
-happyReduction_261 (HappyAbsSyn58 happy_var_1)
- = HappyAbsSyn88
- (DDExp happy_var_1
- )
-happyReduction_261 _ = notHappyAtAll
-
-happyReduce_262 = happySpecReduce_0 89# happyReduction_262
-happyReduction_262 = HappyAbsSyn89
- ([]
- )
-
-happyReduce_263 = happySpecReduce_2 89# happyReduction_263
-happyReduction_263 (HappyAbsSyn88 happy_var_2)
- (HappyAbsSyn89 happy_var_1)
- = HappyAbsSyn89
- (flip (:) happy_var_1 happy_var_2
- )
-happyReduction_263 _ _ = notHappyAtAll
-
-happyReduce_264 = happySpecReduce_2 90# happyReduction_264
-happyReduction_264 (HappyAbsSyn25 happy_var_2)
- (HappyAbsSyn91 happy_var_1)
- = HappyAbsSyn90
- (OldGr happy_var_1 (reverse happy_var_2)
- )
-happyReduction_264 _ _ = notHappyAtAll
-
-happyReduce_265 = happySpecReduce_0 91# happyReduction_265
-happyReduction_265 = HappyAbsSyn91
- (NoIncl
- )
-
-happyReduce_266 = happySpecReduce_2 91# happyReduction_266
-happyReduction_266 (HappyAbsSyn93 happy_var_2)
- _
- = HappyAbsSyn91
- (Incl happy_var_2
- )
-happyReduction_266 _ _ = notHappyAtAll
-
-happyReduce_267 = happySpecReduce_1 92# happyReduction_267
-happyReduction_267 (HappyAbsSyn9 happy_var_1)
- = HappyAbsSyn92
- (FString happy_var_1
- )
-happyReduction_267 _ = notHappyAtAll
-
-happyReduce_268 = happySpecReduce_1 92# happyReduction_268
-happyReduction_268 (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn92
- (FIdent happy_var_1
- )
-happyReduction_268 _ = notHappyAtAll
-
-happyReduce_269 = happySpecReduce_2 92# happyReduction_269
-happyReduction_269 (HappyAbsSyn92 happy_var_2)
- _
- = HappyAbsSyn92
- (FSlash happy_var_2
- )
-happyReduction_269 _ _ = notHappyAtAll
-
-happyReduce_270 = happySpecReduce_2 92# happyReduction_270
-happyReduction_270 (HappyAbsSyn92 happy_var_2)
- _
- = HappyAbsSyn92
- (FDot happy_var_2
- )
-happyReduction_270 _ _ = notHappyAtAll
-
-happyReduce_271 = happySpecReduce_2 92# happyReduction_271
-happyReduction_271 (HappyAbsSyn92 happy_var_2)
- _
- = HappyAbsSyn92
- (FMinus happy_var_2
- )
-happyReduction_271 _ _ = notHappyAtAll
-
-happyReduce_272 = happySpecReduce_2 92# happyReduction_272
-happyReduction_272 (HappyAbsSyn92 happy_var_2)
- (HappyAbsSyn12 happy_var_1)
- = HappyAbsSyn92
- (FAddId happy_var_1 happy_var_2
- )
-happyReduction_272 _ _ = notHappyAtAll
-
-happyReduce_273 = happySpecReduce_2 93# happyReduction_273
-happyReduction_273 _
- (HappyAbsSyn92 happy_var_1)
- = HappyAbsSyn93
- ((:[]) happy_var_1
- )
-happyReduction_273 _ _ = notHappyAtAll
-
-happyReduce_274 = happySpecReduce_3 93# happyReduction_274
-happyReduction_274 (HappyAbsSyn93 happy_var_3)
- _
- (HappyAbsSyn92 happy_var_1)
- = HappyAbsSyn93
- ((:) happy_var_1 happy_var_3
- )
-happyReduction_274 _ _ _ = notHappyAtAll
-
-happyNewToken action sts stk [] =
- action 176# 176# notHappyAtAll (HappyState action) sts stk []
-
-happyNewToken action sts stk (tk:tks) =
- let cont i = action i i tk (HappyState action) sts stk tks in
- case tk of {
- PT _ (TS _ 1) -> cont 94#;
- PT _ (TS _ 2) -> cont 95#;
- PT _ (TS _ 3) -> cont 96#;
- PT _ (TS _ 4) -> cont 97#;
- PT _ (TS _ 5) -> cont 98#;
- PT _ (TS _ 6) -> cont 99#;
- PT _ (TS _ 7) -> cont 100#;
- PT _ (TS _ 8) -> cont 101#;
- PT _ (TS _ 9) -> cont 102#;
- PT _ (TS _ 10) -> cont 103#;
- PT _ (TS _ 11) -> cont 104#;
- PT _ (TS _ 12) -> cont 105#;
- PT _ (TS _ 13) -> cont 106#;
- PT _ (TS _ 14) -> cont 107#;
- PT _ (TS _ 15) -> cont 108#;
- PT _ (TS _ 16) -> cont 109#;
- PT _ (TS _ 17) -> cont 110#;
- PT _ (TS _ 18) -> cont 111#;
- PT _ (TS _ 19) -> cont 112#;
- PT _ (TS _ 20) -> cont 113#;
- PT _ (TS _ 21) -> cont 114#;
- PT _ (TS _ 22) -> cont 115#;
- PT _ (TS _ 23) -> cont 116#;
- PT _ (TS _ 24) -> cont 117#;
- PT _ (TS _ 25) -> cont 118#;
- PT _ (TS _ 26) -> cont 119#;
- PT _ (TS _ 27) -> cont 120#;
- PT _ (TS _ 28) -> cont 121#;
- PT _ (TS _ 29) -> cont 122#;
- PT _ (TS _ 30) -> cont 123#;
- PT _ (TS _ 31) -> cont 124#;
- PT _ (TS _ 32) -> cont 125#;
- PT _ (TS _ 33) -> cont 126#;
- PT _ (TS _ 34) -> cont 127#;
- PT _ (TS _ 35) -> cont 128#;
- PT _ (TS _ 36) -> cont 129#;
- PT _ (TS _ 37) -> cont 130#;
- PT _ (TS _ 38) -> cont 131#;
- PT _ (TS _ 39) -> cont 132#;
- PT _ (TS _ 40) -> cont 133#;
- PT _ (TS _ 41) -> cont 134#;
- PT _ (TS _ 42) -> cont 135#;
- PT _ (TS _ 43) -> cont 136#;
- PT _ (TS _ 44) -> cont 137#;
- PT _ (TS _ 45) -> cont 138#;
- PT _ (TS _ 46) -> cont 139#;
- PT _ (TS _ 47) -> cont 140#;
- PT _ (TS _ 48) -> cont 141#;
- PT _ (TS _ 49) -> cont 142#;
- PT _ (TS _ 50) -> cont 143#;
- PT _ (TS _ 51) -> cont 144#;
- PT _ (TS _ 52) -> cont 145#;
- PT _ (TS _ 53) -> cont 146#;
- PT _ (TS _ 54) -> cont 147#;
- PT _ (TS _ 55) -> cont 148#;
- PT _ (TS _ 56) -> cont 149#;
- PT _ (TS _ 57) -> cont 150#;
- PT _ (TS _ 58) -> cont 151#;
- PT _ (TS _ 59) -> cont 152#;
- PT _ (TS _ 60) -> cont 153#;
- PT _ (TS _ 61) -> cont 154#;
- PT _ (TS _ 62) -> cont 155#;
- PT _ (TS _ 63) -> cont 156#;
- PT _ (TS _ 64) -> cont 157#;
- PT _ (TS _ 65) -> cont 158#;
- PT _ (TS _ 66) -> cont 159#;
- PT _ (TS _ 67) -> cont 160#;
- PT _ (TS _ 68) -> cont 161#;
- PT _ (TS _ 69) -> cont 162#;
- PT _ (TS _ 70) -> cont 163#;
- PT _ (TS _ 71) -> cont 164#;
- PT _ (TS _ 72) -> cont 165#;
- PT _ (TS _ 73) -> cont 166#;
- PT _ (TS _ 74) -> cont 167#;
- PT _ (TS _ 75) -> cont 168#;
- PT _ (TS _ 76) -> cont 169#;
- PT _ (TI happy_dollar_dollar) -> cont 170#;
- PT _ (TL happy_dollar_dollar) -> cont 171#;
- PT _ (TD happy_dollar_dollar) -> cont 172#;
- PT _ (T_LString happy_dollar_dollar) -> cont 173#;
- PT _ (T_PIdent _) -> cont 174#;
- _ -> cont 175#;
- _ -> happyError' (tk:tks)
- }
-
-happyError_ tk tks = happyError' (tk:tks)
-
-happyThen :: () => Err a -> (a -> Err b) -> Err b
-happyThen = (thenM)
-happyReturn :: () => a -> Err a
-happyReturn = (returnM)
-happyThen1 m k tks = (thenM) m (\a -> k a tks)
-happyReturn1 :: () => a -> b -> Err a
-happyReturn1 = \a tks -> (returnM) a
-happyError' :: () => [Token] -> Err a
-happyError' = happyError
-
-pGrammar tks = happySomeParser where
- happySomeParser = happyThen (happyParse action_0 tks) (\x -> case x of {HappyAbsSyn13 z -> happyReturn z; _other -> notHappyAtAll })
-
-pModDef tks = happySomeParser where
- happySomeParser = happyThen (happyParse action_1 tks) (\x -> case x of {HappyAbsSyn15 z -> happyReturn z; _other -> notHappyAtAll })
-
-pOldGrammar tks = happySomeParser where
- happySomeParser = happyThen (happyParse action_2 tks) (\x -> case x of {HappyAbsSyn90 z -> happyReturn z; _other -> notHappyAtAll })
-
-pModHeader tks = happySomeParser where
- happySomeParser = happyThen (happyParse action_3 tks) (\x -> case x of {HappyAbsSyn15 z -> happyReturn z; _other -> notHappyAtAll })
-
-pExp tks = happySomeParser where
- happySomeParser = happyThen (happyParse action_4 tks) (\x -> case x of {HappyAbsSyn58 z -> happyReturn z; _other -> notHappyAtAll })
-
-happySeq = happyDontSeq
-
-
-returnM :: a -> Err a
-returnM = return
-
-thenM :: Err a -> (a -> Err b) -> Err b
-thenM = (>>=)
-
-happyError :: [Token] -> Err a
-happyError ts =
- Bad $ "syntax error at " ++ tokenPos ts ++
- case ts of
- [] -> []
- [Err _] -> " due to lexer error"
- _ -> " before " ++ unwords (map (BS.unpack . prToken) (take 4 ts))
-
-myLexer = tokens
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
-{-# LINE 1 "<built-in>" #-}
-{-# LINE 1 "<command line>" #-}
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
--- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp
-
-{-# LINE 28 "templates/GenericTemplate.hs" #-}
-
-
-
-
-
-
-
-
-{-# LINE 49 "templates/GenericTemplate.hs" #-}
-
-{-# LINE 59 "templates/GenericTemplate.hs" #-}
-
-{-# LINE 68 "templates/GenericTemplate.hs" #-}
-
-infixr 9 `HappyStk`
-data HappyStk a = HappyStk a (HappyStk a)
-
------------------------------------------------------------------------------
--- starting the parse
-
-happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll
-
------------------------------------------------------------------------------
--- Accepting the parse
-
--- If the current token is 1#, it means we've just accepted a partial
--- parse (a %partial parser). We must ignore the saved token on the top of
--- the stack in this case.
-happyAccept 1# tk st sts (_ `HappyStk` ans `HappyStk` _) =
- happyReturn1 ans
-happyAccept j tk st sts (HappyStk ans _) =
- (happyTcHack j ) (happyReturn1 ans)
-
------------------------------------------------------------------------------
--- Arrays only: do the next action
-
-{-# LINE 155 "templates/GenericTemplate.hs" #-}
-
------------------------------------------------------------------------------
--- HappyState data type (not arrays)
-
-
-
-newtype HappyState b c = HappyState
- (Int# -> -- token number
- Int# -> -- token number (yes, again)
- b -> -- token semantic value
- HappyState b c -> -- current state
- [HappyState b c] -> -- state stack
- c)
-
-
-
------------------------------------------------------------------------------
--- Shifting a token
-
-happyShift new_state 1# tk st sts stk@(x `HappyStk` _) =
- let i = (case x of { HappyErrorToken (I# (i)) -> i }) in
--- trace "shifting the error token" $
- new_state i i tk (HappyState (new_state)) ((st):(sts)) (stk)
-
-happyShift new_state i tk st sts stk =
- happyNewToken new_state ((st):(sts)) ((HappyTerminal (tk))`HappyStk`stk)
-
--- happyReduce is specialised for the common cases.
-
-happySpecReduce_0 i fn 1# tk st sts stk
- = happyFail 1# tk st sts stk
-happySpecReduce_0 nt fn j tk st@((HappyState (action))) sts stk
- = action nt j tk st ((st):(sts)) (fn `HappyStk` stk)
-
-happySpecReduce_1 i fn 1# tk st sts stk
- = happyFail 1# tk st sts stk
-happySpecReduce_1 nt fn j tk _ sts@(((st@(HappyState (action))):(_))) (v1`HappyStk`stk')
- = let r = fn v1 in
- happySeq r (action nt j tk st sts (r `HappyStk` stk'))
-
-happySpecReduce_2 i fn 1# tk st sts stk
- = happyFail 1# tk st sts stk
-happySpecReduce_2 nt fn j tk _ ((_):(sts@(((st@(HappyState (action))):(_))))) (v1`HappyStk`v2`HappyStk`stk')
- = let r = fn v1 v2 in
- happySeq r (action nt j tk st sts (r `HappyStk` stk'))
-
-happySpecReduce_3 i fn 1# tk st sts stk
- = happyFail 1# tk st sts stk
-happySpecReduce_3 nt fn j tk _ ((_):(((_):(sts@(((st@(HappyState (action))):(_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')
- = let r = fn v1 v2 v3 in
- happySeq r (action nt j tk st sts (r `HappyStk` stk'))
-
-happyReduce k i fn 1# tk st sts stk
- = happyFail 1# tk st sts stk
-happyReduce k nt fn j tk st sts stk
- = case happyDrop (k -# (1# :: Int#)) sts of
- sts1@(((st1@(HappyState (action))):(_))) ->
- let r = fn stk in -- it doesn't hurt to always seq here...
- happyDoSeq r (action nt j tk st1 sts1 r)
-
-happyMonadReduce k nt fn 1# tk st sts stk
- = happyFail 1# tk st sts stk
-happyMonadReduce k nt fn j tk st sts stk =
- happyThen1 (fn stk tk) (\r -> action nt j tk st1 sts1 (r `HappyStk` drop_stk))
- where sts1@(((st1@(HappyState (action))):(_))) = happyDrop k ((st):(sts))
- drop_stk = happyDropStk k stk
-
-happyMonad2Reduce k nt fn 1# tk st sts stk
- = happyFail 1# tk st sts stk
-happyMonad2Reduce k nt fn j tk st sts stk =
- happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))
- where sts1@(((st1@(HappyState (action))):(_))) = happyDrop k ((st):(sts))
- drop_stk = happyDropStk k stk
-
-
-
-
-
- new_state = action
-
-
-happyDrop 0# l = l
-happyDrop n ((_):(t)) = happyDrop (n -# (1# :: Int#)) t
-
-happyDropStk 0# l = l
-happyDropStk n (x `HappyStk` xs) = happyDropStk (n -# (1#::Int#)) xs
-
------------------------------------------------------------------------------
--- Moving to a new state after a reduction
-
-{-# LINE 253 "templates/GenericTemplate.hs" #-}
-happyGoto action j tk st = action j j tk (HappyState action)
-
-
------------------------------------------------------------------------------
--- Error recovery (1# is the error token)
-
--- parse error if we are in recovery and we fail again
-happyFail 1# tk old_st _ stk =
--- trace "failing" $
- happyError_ tk
-
-{- We don't need state discarding for our restricted implementation of
- "error". In fact, it can cause some bogus parses, so I've disabled it
- for now --SDM
-
--- discard a state
-happyFail 1# tk old_st (((HappyState (action))):(sts))
- (saved_tok `HappyStk` _ `HappyStk` stk) =
--- trace ("discarding state, depth " ++ show (length stk)) $
- action 1# 1# tk (HappyState (action)) sts ((saved_tok`HappyStk`stk))
--}
-
--- Enter error recovery: generate an error token,
--- save the old token and carry on.
-happyFail i tk (HappyState (action)) sts stk =
--- trace "entering error recovery" $
- action 1# 1# tk (HappyState (action)) sts ( (HappyErrorToken (I# (i))) `HappyStk` stk)
-
--- Internal happy errors:
-
-notHappyAtAll = error "Internal Happy error\n"
-
------------------------------------------------------------------------------
--- Hack to get the typechecker to accept our action functions
-
-
-happyTcHack :: Int# -> a -> a
-happyTcHack x y = y
-{-# INLINE happyTcHack #-}
-
-
------------------------------------------------------------------------------
--- Seq-ing. If the --strict flag is given, then Happy emits
--- happySeq = happyDoSeq
--- otherwise it emits
--- happySeq = happyDontSeq
-
-happyDoSeq, happyDontSeq :: a -> b -> b
-happyDoSeq a b = a `seq` b
-happyDontSeq a b = b
-
------------------------------------------------------------------------------
--- Don't inline any functions from the template. GHC has a nasty habit
--- of deciding to inline happyGoto everywhere, which increases the size of
--- the generated parser quite a bit.
-
-{-# LINE 317 "templates/GenericTemplate.hs" #-}
-{-# NOINLINE happyShift #-}
-{-# NOINLINE happySpecReduce_0 #-}
-{-# NOINLINE happySpecReduce_1 #-}
-{-# NOINLINE happySpecReduce_2 #-}
-{-# NOINLINE happySpecReduce_3 #-}
-{-# NOINLINE happyReduce #-}
-{-# NOINLINE happyMonadReduce #-}
-{-# NOINLINE happyGoto #-}
-{-# NOINLINE happyFail #-}
-
--- end of Happy Template.
diff --git a/src-3.0/GF/Source/ParGF.y b/src-3.0/GF/Source/ParGF.y
deleted file mode 100644
index 22a15cd93..000000000
--- a/src-3.0/GF/Source/ParGF.y
+++ /dev/null
@@ -1,642 +0,0 @@
--- This Happy file was machine-generated by the BNF converter
-{
-{-# OPTIONS -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-}
-module GF.Source.ParGF where
-import GF.Source.AbsGF
-import GF.Source.LexGF
-import GF.Data.ErrM
-import qualified Data.ByteString.Char8 as BS
-}
-
-%name pGrammar Grammar
-%name pModDef ModDef
-%name pOldGrammar OldGrammar
-%partial pModHeader ModHeader
-%name pExp Exp
-
--- no lexer declaration
-%monad { Err } { thenM } { returnM }
-%tokentype { Token }
-
-%token
- '!' { PT _ (TS _ 1) }
- '#' { PT _ (TS _ 2) }
- '$' { PT _ (TS _ 3) }
- '%' { PT _ (TS _ 4) }
- '(' { PT _ (TS _ 5) }
- ')' { PT _ (TS _ 6) }
- '*' { PT _ (TS _ 7) }
- '**' { PT _ (TS _ 8) }
- '+' { PT _ (TS _ 9) }
- '++' { PT _ (TS _ 10) }
- ',' { PT _ (TS _ 11) }
- '-' { PT _ (TS _ 12) }
- '->' { PT _ (TS _ 13) }
- '.' { PT _ (TS _ 14) }
- '/' { PT _ (TS _ 15) }
- ':' { PT _ (TS _ 16) }
- ';' { PT _ (TS _ 17) }
- '<' { PT _ (TS _ 18) }
- '=' { PT _ (TS _ 19) }
- '=>' { PT _ (TS _ 20) }
- '>' { PT _ (TS _ 21) }
- '?' { PT _ (TS _ 22) }
- '@' { PT _ (TS _ 23) }
- 'Lin' { PT _ (TS _ 24) }
- 'PType' { PT _ (TS _ 25) }
- 'Str' { PT _ (TS _ 26) }
- 'Strs' { PT _ (TS _ 27) }
- 'Tok' { PT _ (TS _ 28) }
- 'Type' { PT _ (TS _ 29) }
- '[' { PT _ (TS _ 30) }
- '\\' { PT _ (TS _ 31) }
- ']' { PT _ (TS _ 32) }
- '_' { PT _ (TS _ 33) }
- 'abstract' { PT _ (TS _ 34) }
- 'case' { PT _ (TS _ 35) }
- 'cat' { PT _ (TS _ 36) }
- 'concrete' { PT _ (TS _ 37) }
- 'data' { PT _ (TS _ 38) }
- 'def' { PT _ (TS _ 39) }
- 'flags' { PT _ (TS _ 40) }
- 'fn' { PT _ (TS _ 41) }
- 'fun' { PT _ (TS _ 42) }
- 'grammar' { PT _ (TS _ 43) }
- 'in' { PT _ (TS _ 44) }
- 'include' { PT _ (TS _ 45) }
- 'incomplete' { PT _ (TS _ 46) }
- 'instance' { PT _ (TS _ 47) }
- 'interface' { PT _ (TS _ 48) }
- 'let' { PT _ (TS _ 49) }
- 'lin' { PT _ (TS _ 50) }
- 'lincat' { PT _ (TS _ 51) }
- 'lindef' { PT _ (TS _ 52) }
- 'lintype' { PT _ (TS _ 53) }
- 'of' { PT _ (TS _ 54) }
- 'open' { PT _ (TS _ 55) }
- 'oper' { PT _ (TS _ 56) }
- 'out' { PT _ (TS _ 57) }
- 'package' { PT _ (TS _ 58) }
- 'param' { PT _ (TS _ 59) }
- 'pattern' { PT _ (TS _ 60) }
- 'pre' { PT _ (TS _ 61) }
- 'printname' { PT _ (TS _ 62) }
- 'resource' { PT _ (TS _ 63) }
- 'reuse' { PT _ (TS _ 64) }
- 'strs' { PT _ (TS _ 65) }
- 'table' { PT _ (TS _ 66) }
- 'tokenizer' { PT _ (TS _ 67) }
- 'transfer' { PT _ (TS _ 68) }
- 'union' { PT _ (TS _ 69) }
- 'var' { PT _ (TS _ 70) }
- 'variants' { PT _ (TS _ 71) }
- 'where' { PT _ (TS _ 72) }
- 'with' { PT _ (TS _ 73) }
- '{' { PT _ (TS _ 74) }
- '|' { PT _ (TS _ 75) }
- '}' { PT _ (TS _ 76) }
-
-L_integ { PT _ (TI $$) }
-L_quoted { PT _ (TL $$) }
-L_doubl { PT _ (TD $$) }
-L_LString { PT _ (T_LString $$) }
-L_PIdent { PT _ (T_PIdent _) }
-L_err { _ }
-
-
-%%
-
-Integer :: { Integer } : L_integ { (read (BS.unpack $1)) :: Integer }
-String :: { String } : L_quoted { BS.unpack $1 }
-Double :: { Double } : L_doubl { (read (BS.unpack $1)) :: Double }
-LString :: { LString} : L_LString { LString ($1)}
-PIdent :: { PIdent} : L_PIdent { PIdent (mkPosToken $1)}
-
-Grammar :: { Grammar }
-Grammar : ListModDef { Gr (reverse $1) }
-
-
-ListModDef :: { [ModDef] }
-ListModDef : {- empty -} { [] }
- | ListModDef ModDef { flip (:) $1 $2 }
-
-
-ModDef :: { ModDef }
-ModDef : ModDef ';' { $1 }
- | 'grammar' PIdent '=' '{' 'abstract' '=' PIdent ';' ListConcSpec '}' { MMain $2 $7 $9 }
- | ComplMod ModType '=' ModBody { MModule $1 $2 $4 }
-
-
-ConcSpec :: { ConcSpec }
-ConcSpec : PIdent '=' ConcExp { ConcSpec $1 $3 }
-
-
-ListConcSpec :: { [ConcSpec] }
-ListConcSpec : {- empty -} { [] }
- | ConcSpec { (:[]) $1 }
- | ConcSpec ';' ListConcSpec { (:) $1 $3 }
-
-
-ConcExp :: { ConcExp }
-ConcExp : PIdent ListTransfer { ConcExp $1 (reverse $2) }
-
-
-ListTransfer :: { [Transfer] }
-ListTransfer : {- empty -} { [] }
- | ListTransfer Transfer { flip (:) $1 $2 }
-
-
-Transfer :: { Transfer }
-Transfer : '(' 'transfer' 'in' Open ')' { TransferIn $4 }
- | '(' 'transfer' 'out' Open ')' { TransferOut $4 }
-
-
-ModHeader :: { ModDef }
-ModHeader : ComplMod ModType '=' ModHeaderBody { MModule $1 $2 $4 }
-
-
-ModHeaderBody :: { ModBody }
-ModHeaderBody : Extend Opens { MBody $1 $2 [] }
- | ListIncluded { MNoBody $1 }
- | Included 'with' ListOpen { MWith $1 $3 }
- | Included 'with' ListOpen '**' Opens { MWithBody $1 $3 $5 [] }
- | ListIncluded '**' Included 'with' ListOpen { MWithE $1 $3 $5 }
- | ListIncluded '**' Included 'with' ListOpen '**' Opens { MWithEBody $1 $3 $5 $7 [] }
- | 'reuse' PIdent { MReuse $2 }
- | 'union' ListIncluded { MUnion $2 }
-
-
-ModType :: { ModType }
-ModType : 'abstract' PIdent { MTAbstract $2 }
- | 'resource' PIdent { MTResource $2 }
- | 'interface' PIdent { MTInterface $2 }
- | 'concrete' PIdent 'of' PIdent { MTConcrete $2 $4 }
- | 'instance' PIdent 'of' PIdent { MTInstance $2 $4 }
- | 'transfer' PIdent ':' Open '->' Open { MTTransfer $2 $4 $6 }
-
-
-ModBody :: { ModBody }
-ModBody : Extend Opens '{' ListTopDef '}' { MBody $1 $2 (reverse $4) }
- | ListIncluded { MNoBody $1 }
- | Included 'with' ListOpen { MWith $1 $3 }
- | Included 'with' ListOpen '**' Opens '{' ListTopDef '}' { MWithBody $1 $3 $5 (reverse $7) }
- | ListIncluded '**' Included 'with' ListOpen { MWithE $1 $3 $5 }
- | ListIncluded '**' Included 'with' ListOpen '**' Opens '{' ListTopDef '}' { MWithEBody $1 $3 $5 $7 (reverse $9) }
- | 'reuse' PIdent { MReuse $2 }
- | 'union' ListIncluded { MUnion $2 }
-
-
-ListTopDef :: { [TopDef] }
-ListTopDef : {- empty -} { [] }
- | ListTopDef TopDef { flip (:) $1 $2 }
-
-
-Extend :: { Extend }
-Extend : ListIncluded '**' { Ext $1 }
- | {- empty -} { NoExt }
-
-
-ListOpen :: { [Open] }
-ListOpen : {- empty -} { [] }
- | Open { (:[]) $1 }
- | Open ',' ListOpen { (:) $1 $3 }
-
-
-Opens :: { Opens }
-Opens : {- empty -} { NoOpens }
- | 'open' ListOpen 'in' { OpenIn $2 }
-
-
-Open :: { Open }
-Open : PIdent { OName $1 }
- | '(' QualOpen PIdent ')' { OQualQO $2 $3 }
- | '(' QualOpen PIdent '=' PIdent ')' { OQual $2 $3 $5 }
-
-
-ComplMod :: { ComplMod }
-ComplMod : {- empty -} { CMCompl }
- | 'incomplete' { CMIncompl }
-
-
-QualOpen :: { QualOpen }
-QualOpen : {- empty -} { QOCompl }
- | 'incomplete' { QOIncompl }
- | 'interface' { QOInterface }
-
-
-ListIncluded :: { [Included] }
-ListIncluded : {- empty -} { [] }
- | Included { (:[]) $1 }
- | Included ',' ListIncluded { (:) $1 $3 }
-
-
-Included :: { Included }
-Included : PIdent { IAll $1 }
- | PIdent '[' ListPIdent ']' { ISome $1 $3 }
- | PIdent '-' '[' ListPIdent ']' { IMinus $1 $4 }
-
-
-Def :: { Def }
-Def : ListName ':' Exp { DDecl $1 $3 }
- | ListName '=' Exp { DDef $1 $3 }
- | Name ListPatt '=' Exp { DPatt $1 $2 $4 }
- | ListName ':' Exp '=' Exp { DFull $1 $3 $5 }
-
-
-TopDef :: { TopDef }
-TopDef : 'cat' ListCatDef { DefCat $2 }
- | 'fun' ListFunDef { DefFun $2 }
- | 'data' ListFunDef { DefFunData $2 }
- | 'def' ListDef { DefDef $2 }
- | 'data' ListDataDef { DefData $2 }
- | 'transfer' ListDef { DefTrans $2 }
- | 'param' ListParDef { DefPar $2 }
- | 'oper' ListDef { DefOper $2 }
- | 'lincat' ListPrintDef { DefLincat $2 }
- | 'lindef' ListDef { DefLindef $2 }
- | 'lin' ListDef { DefLin $2 }
- | 'printname' 'cat' ListPrintDef { DefPrintCat $3 }
- | 'printname' 'fun' ListPrintDef { DefPrintFun $3 }
- | 'flags' ListFlagDef { DefFlag $2 }
- | 'printname' ListPrintDef { DefPrintOld $2 }
- | 'lintype' ListDef { DefLintype $2 }
- | 'pattern' ListDef { DefPattern $2 }
- | 'package' PIdent '=' '{' ListTopDef '}' ';' { DefPackage $2 (reverse $5) }
- | 'var' ListDef { DefVars $2 }
- | 'tokenizer' PIdent ';' { DefTokenizer $2 }
-
-
-CatDef :: { CatDef }
-CatDef : PIdent ListDDecl { SimpleCatDef $1 (reverse $2) }
- | '[' PIdent ListDDecl ']' { ListCatDef $2 (reverse $3) }
- | '[' PIdent ListDDecl ']' '{' Integer '}' { ListSizeCatDef $2 (reverse $3) $6 }
-
-
-FunDef :: { FunDef }
-FunDef : ListPIdent ':' Exp { FunDef $1 $3 }
-
-
-DataDef :: { DataDef }
-DataDef : PIdent '=' ListDataConstr { DataDef $1 $3 }
-
-
-DataConstr :: { DataConstr }
-DataConstr : PIdent { DataId $1 }
- | PIdent '.' PIdent { DataQId $1 $3 }
-
-
-ListDataConstr :: { [DataConstr] }
-ListDataConstr : {- empty -} { [] }
- | DataConstr { (:[]) $1 }
- | DataConstr '|' ListDataConstr { (:) $1 $3 }
-
-
-ParDef :: { ParDef }
-ParDef : PIdent '=' ListParConstr { ParDefDir $1 $3 }
- | PIdent '=' '(' 'in' PIdent ')' { ParDefIndir $1 $5 }
- | PIdent { ParDefAbs $1 }
-
-
-ParConstr :: { ParConstr }
-ParConstr : PIdent ListDDecl { ParConstr $1 (reverse $2) }
-
-
-PrintDef :: { PrintDef }
-PrintDef : ListName '=' Exp { PrintDef $1 $3 }
-
-
-FlagDef :: { FlagDef }
-FlagDef : PIdent '=' PIdent { FlagDef $1 $3 }
-
-
-ListDef :: { [Def] }
-ListDef : Def ';' { (:[]) $1 }
- | Def ';' ListDef { (:) $1 $3 }
-
-
-ListCatDef :: { [CatDef] }
-ListCatDef : CatDef ';' { (:[]) $1 }
- | CatDef ';' ListCatDef { (:) $1 $3 }
-
-
-ListFunDef :: { [FunDef] }
-ListFunDef : FunDef ';' { (:[]) $1 }
- | FunDef ';' ListFunDef { (:) $1 $3 }
-
-
-ListDataDef :: { [DataDef] }
-ListDataDef : DataDef ';' { (:[]) $1 }
- | DataDef ';' ListDataDef { (:) $1 $3 }
-
-
-ListParDef :: { [ParDef] }
-ListParDef : ParDef ';' { (:[]) $1 }
- | ParDef ';' ListParDef { (:) $1 $3 }
-
-
-ListPrintDef :: { [PrintDef] }
-ListPrintDef : PrintDef ';' { (:[]) $1 }
- | PrintDef ';' ListPrintDef { (:) $1 $3 }
-
-
-ListFlagDef :: { [FlagDef] }
-ListFlagDef : FlagDef ';' { (:[]) $1 }
- | FlagDef ';' ListFlagDef { (:) $1 $3 }
-
-
-ListParConstr :: { [ParConstr] }
-ListParConstr : {- empty -} { [] }
- | ParConstr { (:[]) $1 }
- | ParConstr '|' ListParConstr { (:) $1 $3 }
-
-
-ListPIdent :: { [PIdent] }
-ListPIdent : PIdent { (:[]) $1 }
- | PIdent ',' ListPIdent { (:) $1 $3 }
-
-
-Name :: { Name }
-Name : PIdent { IdentName $1 }
- | '[' PIdent ']' { ListName $2 }
-
-
-ListName :: { [Name] }
-ListName : Name { (:[]) $1 }
- | Name ',' ListName { (:) $1 $3 }
-
-
-LocDef :: { LocDef }
-LocDef : ListPIdent ':' Exp { LDDecl $1 $3 }
- | ListPIdent '=' Exp { LDDef $1 $3 }
- | ListPIdent ':' Exp '=' Exp { LDFull $1 $3 $5 }
-
-
-ListLocDef :: { [LocDef] }
-ListLocDef : {- empty -} { [] }
- | LocDef { (:[]) $1 }
- | LocDef ';' ListLocDef { (:) $1 $3 }
-
-
-Exp6 :: { Exp }
-Exp6 : PIdent { EIdent $1 }
- | '{' PIdent '}' { EConstr $2 }
- | '%' PIdent '%' { ECons $2 }
- | Sort { ESort $1 }
- | String { EString $1 }
- | Integer { EInt $1 }
- | Double { EFloat $1 }
- | '?' { EMeta }
- | '[' ']' { EEmpty }
- | 'data' { EData }
- | '[' PIdent Exps ']' { EList $2 $3 }
- | '[' String ']' { EStrings $2 }
- | '{' ListLocDef '}' { ERecord $2 }
- | '<' ListTupleComp '>' { ETuple $2 }
- | '(' 'in' PIdent ')' { EIndir $3 }
- | '<' Exp ':' Exp '>' { ETyped $2 $4 }
- | '(' Exp ')' { $2 }
- | LString { ELString $1 }
-
-
-Exp5 :: { Exp }
-Exp5 : Exp5 '.' Label { EProj $1 $3 }
- | '{' PIdent '.' PIdent '}' { EQConstr $2 $4 }
- | '%' PIdent '.' PIdent { EQCons $2 $4 }
- | Exp6 { $1 }
-
-
-Exp4 :: { Exp }
-Exp4 : Exp4 Exp5 { EApp $1 $2 }
- | 'table' '{' ListCase '}' { ETable $3 }
- | 'table' Exp6 '{' ListCase '}' { ETTable $2 $4 }
- | 'table' Exp6 '[' ListExp ']' { EVTable $2 $4 }
- | 'case' Exp 'of' '{' ListCase '}' { ECase $2 $5 }
- | 'variants' '{' ListExp '}' { EVariants $3 }
- | 'pre' '{' Exp ';' ListAltern '}' { EPre $3 $5 }
- | 'strs' '{' ListExp '}' { EStrs $3 }
- | PIdent '@' Exp6 { EConAt $1 $3 }
- | '#' Patt2 { EPatt $2 }
- | 'pattern' Exp5 { EPattType $2 }
- | Exp5 { $1 }
- | 'Lin' PIdent { ELin $2 }
-
-
-Exp3 :: { Exp }
-Exp3 : Exp3 '!' Exp4 { ESelect $1 $3 }
- | Exp3 '*' Exp4 { ETupTyp $1 $3 }
- | Exp3 '**' Exp4 { EExtend $1 $3 }
- | Exp4 { $1 }
-
-
-Exp1 :: { Exp }
-Exp1 : Exp2 '+' Exp1 { EGlue $1 $3 }
- | Exp2 { $1 }
-
-
-Exp :: { Exp }
-Exp : Exp1 '++' Exp { EConcat $1 $3 }
- | '\\' ListBind '->' Exp { EAbstr $2 $4 }
- | '\\' '\\' ListBind '=>' Exp { ECTable $3 $5 }
- | Decl '->' Exp { EProd $1 $3 }
- | Exp3 '=>' Exp { ETType $1 $3 }
- | 'let' '{' ListLocDef '}' 'in' Exp { ELet $3 $6 }
- | 'let' ListLocDef 'in' Exp { ELetb $2 $4 }
- | Exp3 'where' '{' ListLocDef '}' { EWhere $1 $4 }
- | 'fn' '{' ListEquation '}' { EEqs $3 }
- | 'in' Exp5 String { EExample $2 $3 }
- | Exp1 { $1 }
-
-
-Exp2 :: { Exp }
-Exp2 : Exp3 { $1 }
-
-
-ListExp :: { [Exp] }
-ListExp : {- empty -} { [] }
- | Exp { (:[]) $1 }
- | Exp ';' ListExp { (:) $1 $3 }
-
-
-Exps :: { Exps }
-Exps : {- empty -} { NilExp }
- | Exp6 Exps { ConsExp $1 $2 }
-
-
-Patt2 :: { Patt }
-Patt2 : '?' { PChar }
- | '[' String ']' { PChars $2 }
- | '#' PIdent { PMacro $2 }
- | '#' PIdent '.' PIdent { PM $2 $4 }
- | '_' { PW }
- | PIdent { PV $1 }
- | '{' PIdent '}' { PCon $2 }
- | PIdent '.' PIdent { PQ $1 $3 }
- | Integer { PInt $1 }
- | Double { PFloat $1 }
- | String { PStr $1 }
- | '{' ListPattAss '}' { PR $2 }
- | '<' ListPattTupleComp '>' { PTup $2 }
- | '(' Patt ')' { $2 }
-
-
-Patt1 :: { Patt }
-Patt1 : PIdent ListPatt { PC $1 $2 }
- | PIdent '.' PIdent ListPatt { PQC $1 $3 $4 }
- | Patt2 '*' { PRep $1 }
- | PIdent '@' Patt2 { PAs $1 $3 }
- | '-' Patt2 { PNeg $2 }
- | Patt2 { $1 }
-
-
-Patt :: { Patt }
-Patt : Patt '|' Patt1 { PDisj $1 $3 }
- | Patt '+' Patt1 { PSeq $1 $3 }
- | Patt1 { $1 }
-
-
-PattAss :: { PattAss }
-PattAss : ListPIdent '=' Patt { PA $1 $3 }
-
-
-Label :: { Label }
-Label : PIdent { LIdent $1 }
- | '$' Integer { LVar $2 }
-
-
-Sort :: { Sort }
-Sort : 'Type' { Sort_Type }
- | 'PType' { Sort_PType }
- | 'Tok' { Sort_Tok }
- | 'Str' { Sort_Str }
- | 'Strs' { Sort_Strs }
-
-
-ListPattAss :: { [PattAss] }
-ListPattAss : {- empty -} { [] }
- | PattAss { (:[]) $1 }
- | PattAss ';' ListPattAss { (:) $1 $3 }
-
-
-ListPatt :: { [Patt] }
-ListPatt : Patt2 { (:[]) $1 }
- | Patt2 ListPatt { (:) $1 $2 }
-
-
-Bind :: { Bind }
-Bind : PIdent { BIdent $1 }
- | '_' { BWild }
-
-
-ListBind :: { [Bind] }
-ListBind : {- empty -} { [] }
- | Bind { (:[]) $1 }
- | Bind ',' ListBind { (:) $1 $3 }
-
-
-Decl :: { Decl }
-Decl : '(' ListBind ':' Exp ')' { DDec $2 $4 }
- | Exp4 { DExp $1 }
-
-
-TupleComp :: { TupleComp }
-TupleComp : Exp { TComp $1 }
-
-
-PattTupleComp :: { PattTupleComp }
-PattTupleComp : Patt { PTComp $1 }
-
-
-ListTupleComp :: { [TupleComp] }
-ListTupleComp : {- empty -} { [] }
- | TupleComp { (:[]) $1 }
- | TupleComp ',' ListTupleComp { (:) $1 $3 }
-
-
-ListPattTupleComp :: { [PattTupleComp] }
-ListPattTupleComp : {- empty -} { [] }
- | PattTupleComp { (:[]) $1 }
- | PattTupleComp ',' ListPattTupleComp { (:) $1 $3 }
-
-
-Case :: { Case }
-Case : Patt '=>' Exp { Case $1 $3 }
-
-
-ListCase :: { [Case] }
-ListCase : Case { (:[]) $1 }
- | Case ';' ListCase { (:) $1 $3 }
-
-
-Equation :: { Equation }
-Equation : ListPatt '->' Exp { Equ $1 $3 }
-
-
-ListEquation :: { [Equation] }
-ListEquation : {- empty -} { [] }
- | Equation { (:[]) $1 }
- | Equation ';' ListEquation { (:) $1 $3 }
-
-
-Altern :: { Altern }
-Altern : Exp '/' Exp { Alt $1 $3 }
-
-
-ListAltern :: { [Altern] }
-ListAltern : {- empty -} { [] }
- | Altern { (:[]) $1 }
- | Altern ';' ListAltern { (:) $1 $3 }
-
-
-DDecl :: { DDecl }
-DDecl : '(' ListBind ':' Exp ')' { DDDec $2 $4 }
- | Exp6 { DDExp $1 }
-
-
-ListDDecl :: { [DDecl] }
-ListDDecl : {- empty -} { [] }
- | ListDDecl DDecl { flip (:) $1 $2 }
-
-
-OldGrammar :: { OldGrammar }
-OldGrammar : Include ListTopDef { OldGr $1 (reverse $2) }
-
-
-Include :: { Include }
-Include : {- empty -} { NoIncl }
- | 'include' ListFileName { Incl $2 }
-
-
-FileName :: { FileName }
-FileName : String { FString $1 }
- | PIdent { FIdent $1 }
- | '/' FileName { FSlash $2 }
- | '.' FileName { FDot $2 }
- | '-' FileName { FMinus $2 }
- | PIdent FileName { FAddId $1 $2 }
-
-
-ListFileName :: { [FileName] }
-ListFileName : FileName ';' { (:[]) $1 }
- | FileName ';' ListFileName { (:) $1 $3 }
-
-
-
-{
-
-returnM :: a -> Err a
-returnM = return
-
-thenM :: Err a -> (a -> Err b) -> Err b
-thenM = (>>=)
-
-happyError :: [Token] -> Err a
-happyError ts =
- Bad $ "syntax error at " ++ tokenPos ts ++
- case ts of
- [] -> []
- [Err _] -> " due to lexer error"
- _ -> " before " ++ unwords (map (BS.unpack . prToken) (take 4 ts))
-
-myLexer = tokens
-}
-
diff --git a/src-3.0/GF/Source/PrintGF.hs b/src-3.0/GF/Source/PrintGF.hs
deleted file mode 100644
index ea2277e67..000000000
--- a/src-3.0/GF/Source/PrintGF.hs
+++ /dev/null
@@ -1,534 +0,0 @@
-{-# OPTIONS -fno-warn-incomplete-patterns #-}
-module GF.Source.PrintGF where
-
--- pretty-printer generated by the BNF converter
-
-import GF.Source.AbsGF
-import Data.Char
-import qualified Data.ByteString.Char8 as BS
-
--- the top-level printing method
-printTree :: Print a => a -> String
-printTree = render . prt 0
-
-type Doc = [ShowS] -> [ShowS]
-
-doc :: ShowS -> Doc
-doc = (:)
-
-render :: Doc -> String
-render d = rend 0 (map ($ "") $ d []) "" where
- rend i ss = case ss of
- "[" :ts -> showChar '[' . rend i ts
- "(" :ts -> showChar '(' . rend i ts
- "{" :ts -> showChar '{' . new (i+1) . rend (i+1) ts
- "}" : ";":ts -> new (i-1) . space "}" . showChar ';' . new (i-1) . rend (i-1) ts
- "}" :ts -> new (i-1) . showChar '}' . new (i-1) . rend (i-1) ts
- ";" :ts -> showChar ';' . new i . rend i ts
- t : "," :ts -> showString t . space "," . rend i ts
- t : ")" :ts -> showString t . showChar ')' . rend i ts
- t : "]" :ts -> showString t . showChar ']' . rend i ts
- t :ts -> space t . rend i ts
- _ -> id
- new i = showChar '\n' . replicateS (2*i) (showChar ' ') . dropWhile isSpace
- space t = showString t . (\s -> if null s then "" else (' ':s))
-
-parenth :: Doc -> Doc
-parenth ss = doc (showChar '(') . ss . doc (showChar ')')
-
-concatS :: [ShowS] -> ShowS
-concatS = foldr (.) id
-
-concatD :: [Doc] -> Doc
-concatD = foldr (.) id
-
-replicateS :: Int -> ShowS -> ShowS
-replicateS n f = concatS (replicate n f)
-
--- the printer class does the job
-class Print a where
- prt :: Int -> a -> Doc
- prtList :: [a] -> Doc
- prtList = concatD . map (prt 0)
-
-instance Print a => Print [a] where
- prt _ = prtList
-
-instance Print Char where
- prt _ s = doc (showChar '\'' . mkEsc '\'' s . showChar '\'')
- prtList s = doc (showChar '"' . concatS (map (mkEsc '"') s) . showChar '"')
-
-mkEsc :: Char -> Char -> ShowS
-mkEsc q s = case s of
- _ | s == q -> showChar '\\' . showChar s
- '\\'-> showString "\\\\"
- '\n' -> showString "\\n"
- '\t' -> showString "\\t"
- _ -> showChar s
-
-prPrec :: Int -> Int -> Doc -> Doc
-prPrec i j = if j<i then parenth else id
-
-
-instance Print Integer where
- prt _ x = doc (shows x)
-
-
-instance Print Double where
- prt _ x = doc (shows x)
-
-
-
-instance Print LString where
- prt _ (LString i) = doc (showString (BS.unpack i))
-
-
-instance Print PIdent where
- prt _ (PIdent (_,i)) = doc (showString (BS.unpack i))
- prtList es = case es of
- [x] -> (concatD [prt 0 x])
- x:xs -> (concatD [prt 0 x , doc (showString ",") , prt 0 xs])
-
-
-
-instance Print Grammar where
- prt i e = case e of
- Gr moddefs -> prPrec i 0 (concatD [prt 0 moddefs])
-
-
-instance Print ModDef where
- prt i e = case e of
- MMain pident0 pident concspecs -> prPrec i 0 (concatD [doc (showString "grammar") , prt 0 pident0 , doc (showString "=") , doc (showString "{") , doc (showString "abstract") , doc (showString "=") , prt 0 pident , doc (showString ";") , prt 0 concspecs , doc (showString "}")])
- MModule complmod modtype modbody -> prPrec i 0 (concatD [prt 0 complmod , prt 0 modtype , doc (showString "=") , prt 0 modbody])
-
- prtList es = case es of
- [] -> (concatD [])
- x:xs -> (concatD [prt 0 x , prt 0 xs])
-
-instance Print ConcSpec where
- prt i e = case e of
- ConcSpec pident concexp -> prPrec i 0 (concatD [prt 0 pident , doc (showString "=") , prt 0 concexp])
-
- prtList es = case es of
- [] -> (concatD [])
- [x] -> (concatD [prt 0 x])
- x:xs -> (concatD [prt 0 x , doc (showString ";") , prt 0 xs])
-
-instance Print ConcExp where
- prt i e = case e of
- ConcExp pident transfers -> prPrec i 0 (concatD [prt 0 pident , prt 0 transfers])
-
-
-instance Print Transfer where
- prt i e = case e of
- TransferIn open -> prPrec i 0 (concatD [doc (showString "(") , doc (showString "transfer") , doc (showString "in") , prt 0 open , doc (showString ")")])
- TransferOut open -> prPrec i 0 (concatD [doc (showString "(") , doc (showString "transfer") , doc (showString "out") , prt 0 open , doc (showString ")")])
-
- prtList es = case es of
- [] -> (concatD [])
- x:xs -> (concatD [prt 0 x , prt 0 xs])
-
-
-instance Print ModType where
- prt i e = case e of
- MTAbstract pident -> prPrec i 0 (concatD [doc (showString "abstract") , prt 0 pident])
- MTResource pident -> prPrec i 0 (concatD [doc (showString "resource") , prt 0 pident])
- MTInterface pident -> prPrec i 0 (concatD [doc (showString "interface") , prt 0 pident])
- MTConcrete pident0 pident -> prPrec i 0 (concatD [doc (showString "concrete") , prt 0 pident0 , doc (showString "of") , prt 0 pident])
- MTInstance pident0 pident -> prPrec i 0 (concatD [doc (showString "instance") , prt 0 pident0 , doc (showString "of") , prt 0 pident])
- MTTransfer pident open0 open -> prPrec i 0 (concatD [doc (showString "transfer") , prt 0 pident , doc (showString ":") , prt 0 open0 , doc (showString "->") , prt 0 open])
-
-
-instance Print ModBody where
- prt i e = case e of
- MBody extend opens topdefs -> prPrec i 0 (concatD [prt 0 extend , prt 0 opens , doc (showString "{") , prt 0 topdefs , doc (showString "}")])
- MNoBody includeds -> prPrec i 0 (concatD [prt 0 includeds])
- MWith included opens -> prPrec i 0 (concatD [prt 0 included , doc (showString "with") , prt 0 opens])
- MWithBody included opens0 opens topdefs -> prPrec i 0 (concatD [prt 0 included , doc (showString "with") , prt 0 opens0 , doc (showString "**") , prt 0 opens , doc (showString "{") , prt 0 topdefs , doc (showString "}")])
- MWithE includeds included opens -> prPrec i 0 (concatD [prt 0 includeds , doc (showString "**") , prt 0 included , doc (showString "with") , prt 0 opens])
- MWithEBody includeds included opens0 opens topdefs -> prPrec i 0 (concatD [prt 0 includeds , doc (showString "**") , prt 0 included , doc (showString "with") , prt 0 opens0 , doc (showString "**") , prt 0 opens , doc (showString "{") , prt 0 topdefs , doc (showString "}")])
- MReuse pident -> prPrec i 0 (concatD [doc (showString "reuse") , prt 0 pident])
- MUnion includeds -> prPrec i 0 (concatD [doc (showString "union") , prt 0 includeds])
-
-
-instance Print Extend where
- prt i e = case e of
- Ext includeds -> prPrec i 0 (concatD [prt 0 includeds , doc (showString "**")])
- NoExt -> prPrec i 0 (concatD [])
-
-
-instance Print Opens where
- prt i e = case e of
- NoOpens -> prPrec i 0 (concatD [])
- OpenIn opens -> prPrec i 0 (concatD [doc (showString "open") , prt 0 opens , doc (showString "in")])
-
-
-instance Print Open where
- prt i e = case e of
- OName pident -> prPrec i 0 (concatD [prt 0 pident])
- OQualQO qualopen pident -> prPrec i 0 (concatD [doc (showString "(") , prt 0 qualopen , prt 0 pident , doc (showString ")")])
- OQual qualopen pident0 pident -> prPrec i 0 (concatD [doc (showString "(") , prt 0 qualopen , prt 0 pident0 , doc (showString "=") , prt 0 pident , doc (showString ")")])
-
- prtList es = case es of
- [] -> (concatD [])
- [x] -> (concatD [prt 0 x])
- x:xs -> (concatD [prt 0 x , doc (showString ",") , prt 0 xs])
-
-instance Print ComplMod where
- prt i e = case e of
- CMCompl -> prPrec i 0 (concatD [])
- CMIncompl -> prPrec i 0 (concatD [doc (showString "incomplete")])
-
-
-instance Print QualOpen where
- prt i e = case e of
- QOCompl -> prPrec i 0 (concatD [])
- QOIncompl -> prPrec i 0 (concatD [doc (showString "incomplete")])
- QOInterface -> prPrec i 0 (concatD [doc (showString "interface")])
-
-
-instance Print Included where
- prt i e = case e of
- IAll pident -> prPrec i 0 (concatD [prt 0 pident])
- ISome pident pidents -> prPrec i 0 (concatD [prt 0 pident , doc (showString "[") , prt 0 pidents , doc (showString "]")])
- IMinus pident pidents -> prPrec i 0 (concatD [prt 0 pident , doc (showString "-") , doc (showString "[") , prt 0 pidents , doc (showString "]")])
-
- prtList es = case es of
- [] -> (concatD [])
- [x] -> (concatD [prt 0 x])
- x:xs -> (concatD [prt 0 x , doc (showString ",") , prt 0 xs])
-
-instance Print Def where
- prt i e = case e of
- DDecl names exp -> prPrec i 0 (concatD [prt 0 names , doc (showString ":") , prt 0 exp])
- DDef names exp -> prPrec i 0 (concatD [prt 0 names , doc (showString "=") , prt 0 exp])
- DPatt name patts exp -> prPrec i 0 (concatD [prt 0 name , prt 0 patts , doc (showString "=") , prt 0 exp])
- DFull names exp0 exp -> prPrec i 0 (concatD [prt 0 names , doc (showString ":") , prt 0 exp0 , doc (showString "=") , prt 0 exp])
-
- prtList es = case es of
- [x] -> (concatD [prt 0 x , doc (showString ";")])
- x:xs -> (concatD [prt 0 x , doc (showString ";") , prt 0 xs])
-
-instance Print TopDef where
- prt i e = case e of
- DefCat catdefs -> prPrec i 0 (concatD [doc (showString "cat") , prt 0 catdefs])
- DefFun fundefs -> prPrec i 0 (concatD [doc (showString "fun") , prt 0 fundefs])
- DefFunData fundefs -> prPrec i 0 (concatD [doc (showString "data") , prt 0 fundefs])
- DefDef defs -> prPrec i 0 (concatD [doc (showString "def") , prt 0 defs])
- DefData datadefs -> prPrec i 0 (concatD [doc (showString "data") , prt 0 datadefs])
- DefTrans defs -> prPrec i 0 (concatD [doc (showString "transfer") , prt 0 defs])
- DefPar pardefs -> prPrec i 0 (concatD [doc (showString "param") , prt 0 pardefs])
- DefOper defs -> prPrec i 0 (concatD [doc (showString "oper") , prt 0 defs])
- DefLincat printdefs -> prPrec i 0 (concatD [doc (showString "lincat") , prt 0 printdefs])
- DefLindef defs -> prPrec i 0 (concatD [doc (showString "lindef") , prt 0 defs])
- DefLin defs -> prPrec i 0 (concatD [doc (showString "lin") , prt 0 defs])
- DefPrintCat printdefs -> prPrec i 0 (concatD [doc (showString "printname") , doc (showString "cat") , prt 0 printdefs])
- DefPrintFun printdefs -> prPrec i 0 (concatD [doc (showString "printname") , doc (showString "fun") , prt 0 printdefs])
- DefFlag flagdefs -> prPrec i 0 (concatD [doc (showString "flags") , prt 0 flagdefs])
- DefPrintOld printdefs -> prPrec i 0 (concatD [doc (showString "printname") , prt 0 printdefs])
- DefLintype defs -> prPrec i 0 (concatD [doc (showString "lintype") , prt 0 defs])
- DefPattern defs -> prPrec i 0 (concatD [doc (showString "pattern") , prt 0 defs])
- DefPackage pident topdefs -> prPrec i 0 (concatD [doc (showString "package") , prt 0 pident , doc (showString "=") , doc (showString "{") , prt 0 topdefs , doc (showString "}") , doc (showString ";")])
- DefVars defs -> prPrec i 0 (concatD [doc (showString "var") , prt 0 defs])
- DefTokenizer pident -> prPrec i 0 (concatD [doc (showString "tokenizer") , prt 0 pident , doc (showString ";")])
-
- prtList es = case es of
- [] -> (concatD [])
- x:xs -> (concatD [prt 0 x , prt 0 xs])
-
-instance Print CatDef where
- prt i e = case e of
- SimpleCatDef pident ddecls -> prPrec i 0 (concatD [prt 0 pident , prt 0 ddecls])
- ListCatDef pident ddecls -> prPrec i 0 (concatD [doc (showString "[") , prt 0 pident , prt 0 ddecls , doc (showString "]")])
- ListSizeCatDef pident ddecls n -> prPrec i 0 (concatD [doc (showString "[") , prt 0 pident , prt 0 ddecls , doc (showString "]") , doc (showString "{") , prt 0 n , doc (showString "}")])
-
- prtList es = case es of
- [x] -> (concatD [prt 0 x , doc (showString ";")])
- x:xs -> (concatD [prt 0 x , doc (showString ";") , prt 0 xs])
-
-instance Print FunDef where
- prt i e = case e of
- FunDef pidents exp -> prPrec i 0 (concatD [prt 0 pidents , doc (showString ":") , prt 0 exp])
-
- prtList es = case es of
- [x] -> (concatD [prt 0 x , doc (showString ";")])
- x:xs -> (concatD [prt 0 x , doc (showString ";") , prt 0 xs])
-
-instance Print DataDef where
- prt i e = case e of
- DataDef pident dataconstrs -> prPrec i 0 (concatD [prt 0 pident , doc (showString "=") , prt 0 dataconstrs])
-
- prtList es = case es of
- [x] -> (concatD [prt 0 x , doc (showString ";")])
- x:xs -> (concatD [prt 0 x , doc (showString ";") , prt 0 xs])
-
-instance Print DataConstr where
- prt i e = case e of
- DataId pident -> prPrec i 0 (concatD [prt 0 pident])
- DataQId pident0 pident -> prPrec i 0 (concatD [prt 0 pident0 , doc (showString ".") , prt 0 pident])
-
- prtList es = case es of
- [] -> (concatD [])
- [x] -> (concatD [prt 0 x])
- x:xs -> (concatD [prt 0 x , doc (showString "|") , prt 0 xs])
-
-instance Print ParDef where
- prt i e = case e of
- ParDefDir pident parconstrs -> prPrec i 0 (concatD [prt 0 pident , doc (showString "=") , prt 0 parconstrs])
- ParDefIndir pident0 pident -> prPrec i 0 (concatD [prt 0 pident0 , doc (showString "=") , doc (showString "(") , doc (showString "in") , prt 0 pident , doc (showString ")")])
- ParDefAbs pident -> prPrec i 0 (concatD [prt 0 pident])
-
- prtList es = case es of
- [x] -> (concatD [prt 0 x , doc (showString ";")])
- x:xs -> (concatD [prt 0 x , doc (showString ";") , prt 0 xs])
-
-instance Print ParConstr where
- prt i e = case e of
- ParConstr pident ddecls -> prPrec i 0 (concatD [prt 0 pident , prt 0 ddecls])
-
- prtList es = case es of
- [] -> (concatD [])
- [x] -> (concatD [prt 0 x])
- x:xs -> (concatD [prt 0 x , doc (showString "|") , prt 0 xs])
-
-instance Print PrintDef where
- prt i e = case e of
- PrintDef names exp -> prPrec i 0 (concatD [prt 0 names , doc (showString "=") , prt 0 exp])
-
- prtList es = case es of
- [x] -> (concatD [prt 0 x , doc (showString ";")])
- x:xs -> (concatD [prt 0 x , doc (showString ";") , prt 0 xs])
-
-instance Print FlagDef where
- prt i e = case e of
- FlagDef pident0 pident -> prPrec i 0 (concatD [prt 0 pident0 , doc (showString "=") , prt 0 pident])
-
- prtList es = case es of
- [x] -> (concatD [prt 0 x , doc (showString ";")])
- x:xs -> (concatD [prt 0 x , doc (showString ";") , prt 0 xs])
-
-instance Print Name where
- prt i e = case e of
- IdentName pident -> prPrec i 0 (concatD [prt 0 pident])
- ListName pident -> prPrec i 0 (concatD [doc (showString "[") , prt 0 pident , doc (showString "]")])
-
- prtList es = case es of
- [x] -> (concatD [prt 0 x])
- x:xs -> (concatD [prt 0 x , doc (showString ",") , prt 0 xs])
-
-instance Print LocDef where
- prt i e = case e of
- LDDecl pidents exp -> prPrec i 0 (concatD [prt 0 pidents , doc (showString ":") , prt 0 exp])
- LDDef pidents exp -> prPrec i 0 (concatD [prt 0 pidents , doc (showString "=") , prt 0 exp])
- LDFull pidents exp0 exp -> prPrec i 0 (concatD [prt 0 pidents , doc (showString ":") , prt 0 exp0 , doc (showString "=") , prt 0 exp])
-
- prtList es = case es of
- [] -> (concatD [])
- [x] -> (concatD [prt 0 x])
- x:xs -> (concatD [prt 0 x , doc (showString ";") , prt 0 xs])
-
-instance Print Exp where
- prt i e = case e of
- EIdent pident -> prPrec i 6 (concatD [prt 0 pident])
- EConstr pident -> prPrec i 6 (concatD [doc (showString "{") , prt 0 pident , doc (showString "}")])
- ECons pident -> prPrec i 6 (concatD [doc (showString "%") , prt 0 pident , doc (showString "%")])
- ESort sort -> prPrec i 6 (concatD [prt 0 sort])
- EString str -> prPrec i 6 (concatD [prt 0 str])
- EInt n -> prPrec i 6 (concatD [prt 0 n])
- EFloat d -> prPrec i 6 (concatD [prt 0 d])
- EMeta -> prPrec i 6 (concatD [doc (showString "?")])
- EEmpty -> prPrec i 6 (concatD [doc (showString "[") , doc (showString "]")])
- EData -> prPrec i 6 (concatD [doc (showString "data")])
- EList pident exps -> prPrec i 6 (concatD [doc (showString "[") , prt 0 pident , prt 0 exps , doc (showString "]")])
- EStrings str -> prPrec i 6 (concatD [doc (showString "[") , prt 0 str , doc (showString "]")])
- ERecord locdefs -> prPrec i 6 (concatD [doc (showString "{") , prt 0 locdefs , doc (showString "}")])
- ETuple tuplecomps -> prPrec i 6 (concatD [doc (showString "<") , prt 0 tuplecomps , doc (showString ">")])
- EIndir pident -> prPrec i 6 (concatD [doc (showString "(") , doc (showString "in") , prt 0 pident , doc (showString ")")])
- ETyped exp0 exp -> prPrec i 6 (concatD [doc (showString "<") , prt 0 exp0 , doc (showString ":") , prt 0 exp , doc (showString ">")])
- EProj exp label -> prPrec i 5 (concatD [prt 5 exp , doc (showString ".") , prt 0 label])
- EQConstr pident0 pident -> prPrec i 5 (concatD [doc (showString "{") , prt 0 pident0 , doc (showString ".") , prt 0 pident , doc (showString "}")])
- EQCons pident0 pident -> prPrec i 5 (concatD [doc (showString "%") , prt 0 pident0 , doc (showString ".") , prt 0 pident])
- EApp exp0 exp -> prPrec i 4 (concatD [prt 4 exp0 , prt 5 exp])
- ETable cases -> prPrec i 4 (concatD [doc (showString "table") , doc (showString "{") , prt 0 cases , doc (showString "}")])
- ETTable exp cases -> prPrec i 4 (concatD [doc (showString "table") , prt 6 exp , doc (showString "{") , prt 0 cases , doc (showString "}")])
- EVTable exp exps -> prPrec i 4 (concatD [doc (showString "table") , prt 6 exp , doc (showString "[") , prt 0 exps , doc (showString "]")])
- ECase exp cases -> prPrec i 4 (concatD [doc (showString "case") , prt 0 exp , doc (showString "of") , doc (showString "{") , prt 0 cases , doc (showString "}")])
- EVariants exps -> prPrec i 4 (concatD [doc (showString "variants") , doc (showString "{") , prt 0 exps , doc (showString "}")])
- EPre exp alterns -> prPrec i 4 (concatD [doc (showString "pre") , doc (showString "{") , prt 0 exp , doc (showString ";") , prt 0 alterns , doc (showString "}")])
- EStrs exps -> prPrec i 4 (concatD [doc (showString "strs") , doc (showString "{") , prt 0 exps , doc (showString "}")])
- EConAt pident exp -> prPrec i 4 (concatD [prt 0 pident , doc (showString "@") , prt 6 exp])
- EPatt patt -> prPrec i 4 (concatD [doc (showString "#") , prt 2 patt])
- EPattType exp -> prPrec i 4 (concatD [doc (showString "pattern") , prt 5 exp])
- ESelect exp0 exp -> prPrec i 3 (concatD [prt 3 exp0 , doc (showString "!") , prt 4 exp])
- ETupTyp exp0 exp -> prPrec i 3 (concatD [prt 3 exp0 , doc (showString "*") , prt 4 exp])
- EExtend exp0 exp -> prPrec i 3 (concatD [prt 3 exp0 , doc (showString "**") , prt 4 exp])
- EGlue exp0 exp -> prPrec i 1 (concatD [prt 2 exp0 , doc (showString "+") , prt 1 exp])
- EConcat exp0 exp -> prPrec i 0 (concatD [prt 1 exp0 , doc (showString "++") , prt 0 exp])
- EAbstr binds exp -> prPrec i 0 (concatD [doc (showString "\\") , prt 0 binds , doc (showString "->") , prt 0 exp])
- ECTable binds exp -> prPrec i 0 (concatD [doc (showString "\\") , doc (showString "\\") , prt 0 binds , doc (showString "=>") , prt 0 exp])
- EProd decl exp -> prPrec i 0 (concatD [prt 0 decl , doc (showString "->") , prt 0 exp])
- ETType exp0 exp -> prPrec i 0 (concatD [prt 3 exp0 , doc (showString "=>") , prt 0 exp])
- ELet locdefs exp -> prPrec i 0 (concatD [doc (showString "let") , doc (showString "{") , prt 0 locdefs , doc (showString "}") , doc (showString "in") , prt 0 exp])
- ELetb locdefs exp -> prPrec i 0 (concatD [doc (showString "let") , prt 0 locdefs , doc (showString "in") , prt 0 exp])
- EWhere exp locdefs -> prPrec i 0 (concatD [prt 3 exp , doc (showString "where") , doc (showString "{") , prt 0 locdefs , doc (showString "}")])
- EEqs equations -> prPrec i 0 (concatD [doc (showString "fn") , doc (showString "{") , prt 0 equations , doc (showString "}")])
- EExample exp str -> prPrec i 0 (concatD [doc (showString "in") , prt 5 exp , prt 0 str])
- ELString lstring -> prPrec i 6 (concatD [prt 0 lstring])
- ELin pident -> prPrec i 4 (concatD [doc (showString "Lin") , prt 0 pident])
-
- prtList es = case es of
- [] -> (concatD [])
- [x] -> (concatD [prt 0 x])
- x:xs -> (concatD [prt 0 x , doc (showString ";") , prt 0 xs])
-
-instance Print Exps where
- prt i e = case e of
- NilExp -> prPrec i 0 (concatD [])
- ConsExp exp exps -> prPrec i 0 (concatD [prt 6 exp , prt 0 exps])
-
-
-instance Print Patt where
- prt i e = case e of
- PChar -> prPrec i 2 (concatD [doc (showString "?")])
- PChars str -> prPrec i 2 (concatD [doc (showString "[") , prt 0 str , doc (showString "]")])
- PMacro pident -> prPrec i 2 (concatD [doc (showString "#") , prt 0 pident])
- PM pident0 pident -> prPrec i 2 (concatD [doc (showString "#") , prt 0 pident0 , doc (showString ".") , prt 0 pident])
- PW -> prPrec i 2 (concatD [doc (showString "_")])
- PV pident -> prPrec i 2 (concatD [prt 0 pident])
- PCon pident -> prPrec i 2 (concatD [doc (showString "{") , prt 0 pident , doc (showString "}")])
- PQ pident0 pident -> prPrec i 2 (concatD [prt 0 pident0 , doc (showString ".") , prt 0 pident])
- PInt n -> prPrec i 2 (concatD [prt 0 n])
- PFloat d -> prPrec i 2 (concatD [prt 0 d])
- PStr str -> prPrec i 2 (concatD [prt 0 str])
- PR pattasss -> prPrec i 2 (concatD [doc (showString "{") , prt 0 pattasss , doc (showString "}")])
- PTup patttuplecomps -> prPrec i 2 (concatD [doc (showString "<") , prt 0 patttuplecomps , doc (showString ">")])
- PC pident patts -> prPrec i 1 (concatD [prt 0 pident , prt 0 patts])
- PQC pident0 pident patts -> prPrec i 1 (concatD [prt 0 pident0 , doc (showString ".") , prt 0 pident , prt 0 patts])
- PDisj patt0 patt -> prPrec i 0 (concatD [prt 0 patt0 , doc (showString "|") , prt 1 patt])
- PSeq patt0 patt -> prPrec i 0 (concatD [prt 0 patt0 , doc (showString "+") , prt 1 patt])
- PRep patt -> prPrec i 1 (concatD [prt 2 patt , doc (showString "*")])
- PAs pident patt -> prPrec i 1 (concatD [prt 0 pident , doc (showString "@") , prt 2 patt])
- PNeg patt -> prPrec i 1 (concatD [doc (showString "-") , prt 2 patt])
-
- prtList es = case es of
- [x] -> (concatD [prt 2 x])
- x:xs -> (concatD [prt 2 x , prt 0 xs])
-
-instance Print PattAss where
- prt i e = case e of
- PA pidents patt -> prPrec i 0 (concatD [prt 0 pidents , doc (showString "=") , prt 0 patt])
-
- prtList es = case es of
- [] -> (concatD [])
- [x] -> (concatD [prt 0 x])
- x:xs -> (concatD [prt 0 x , doc (showString ";") , prt 0 xs])
-
-instance Print Label where
- prt i e = case e of
- LIdent pident -> prPrec i 0 (concatD [prt 0 pident])
- LVar n -> prPrec i 0 (concatD [doc (showString "$") , prt 0 n])
-
-
-instance Print Sort where
- prt i e = case e of
- Sort_Type -> prPrec i 0 (concatD [doc (showString "Type")])
- Sort_PType -> prPrec i 0 (concatD [doc (showString "PType")])
- Sort_Tok -> prPrec i 0 (concatD [doc (showString "Tok")])
- Sort_Str -> prPrec i 0 (concatD [doc (showString "Str")])
- Sort_Strs -> prPrec i 0 (concatD [doc (showString "Strs")])
-
-
-instance Print Bind where
- prt i e = case e of
- BIdent pident -> prPrec i 0 (concatD [prt 0 pident])
- BWild -> prPrec i 0 (concatD [doc (showString "_")])
-
- prtList es = case es of
- [] -> (concatD [])
- [x] -> (concatD [prt 0 x])
- x:xs -> (concatD [prt 0 x , doc (showString ",") , prt 0 xs])
-
-instance Print Decl where
- prt i e = case e of
- DDec binds exp -> prPrec i 0 (concatD [doc (showString "(") , prt 0 binds , doc (showString ":") , prt 0 exp , doc (showString ")")])
- DExp exp -> prPrec i 0 (concatD [prt 4 exp])
-
-
-instance Print TupleComp where
- prt i e = case e of
- TComp exp -> prPrec i 0 (concatD [prt 0 exp])
-
- prtList es = case es of
- [] -> (concatD [])
- [x] -> (concatD [prt 0 x])
- x:xs -> (concatD [prt 0 x , doc (showString ",") , prt 0 xs])
-
-instance Print PattTupleComp where
- prt i e = case e of
- PTComp patt -> prPrec i 0 (concatD [prt 0 patt])
-
- prtList es = case es of
- [] -> (concatD [])
- [x] -> (concatD [prt 0 x])
- x:xs -> (concatD [prt 0 x , doc (showString ",") , prt 0 xs])
-
-instance Print Case where
- prt i e = case e of
- Case patt exp -> prPrec i 0 (concatD [prt 0 patt , doc (showString "=>") , prt 0 exp])
-
- prtList es = case es of
- [x] -> (concatD [prt 0 x])
- x:xs -> (concatD [prt 0 x , doc (showString ";") , prt 0 xs])
-
-instance Print Equation where
- prt i e = case e of
- Equ patts exp -> prPrec i 0 (concatD [prt 0 patts , doc (showString "->") , prt 0 exp])
-
- prtList es = case es of
- [] -> (concatD [])
- [x] -> (concatD [prt 0 x])
- x:xs -> (concatD [prt 0 x , doc (showString ";") , prt 0 xs])
-
-instance Print Altern where
- prt i e = case e of
- Alt exp0 exp -> prPrec i 0 (concatD [prt 0 exp0 , doc (showString "/") , prt 0 exp])
-
- prtList es = case es of
- [] -> (concatD [])
- [x] -> (concatD [prt 0 x])
- x:xs -> (concatD [prt 0 x , doc (showString ";") , prt 0 xs])
-
-instance Print DDecl where
- prt i e = case e of
- DDDec binds exp -> prPrec i 0 (concatD [doc (showString "(") , prt 0 binds , doc (showString ":") , prt 0 exp , doc (showString ")")])
- DDExp exp -> prPrec i 0 (concatD [prt 6 exp])
-
- prtList es = case es of
- [] -> (concatD [])
- x:xs -> (concatD [prt 0 x , prt 0 xs])
-
-instance Print OldGrammar where
- prt i e = case e of
- OldGr include topdefs -> prPrec i 0 (concatD [prt 0 include , prt 0 topdefs])
-
-
-instance Print Include where
- prt i e = case e of
- NoIncl -> prPrec i 0 (concatD [])
- Incl filenames -> prPrec i 0 (concatD [doc (showString "include") , prt 0 filenames])
-
-
-instance Print FileName where
- prt i e = case e of
- FString str -> prPrec i 0 (concatD [prt 0 str])
- FIdent pident -> prPrec i 0 (concatD [prt 0 pident])
- FSlash filename -> prPrec i 0 (concatD [doc (showString "/") , prt 0 filename])
- FDot filename -> prPrec i 0 (concatD [doc (showString ".") , prt 0 filename])
- FMinus filename -> prPrec i 0 (concatD [doc (showString "-") , prt 0 filename])
- FAddId pident filename -> prPrec i 0 (concatD [prt 0 pident , prt 0 filename])
-
- prtList es = case es of
- [x] -> (concatD [prt 0 x , doc (showString ";")])
- x:xs -> (concatD [prt 0 x , doc (showString ";") , prt 0 xs])
-
-
diff --git a/src-3.0/GF/Source/SharedString.hs b/src-3.0/GF/Source/SharedString.hs
deleted file mode 100644
index 732873fe6..000000000
--- a/src-3.0/GF/Source/SharedString.hs
+++ /dev/null
@@ -1,20 +0,0 @@
-module GF.Source.SharedString (shareString) where
-
-import Data.Map as M
-import Data.IORef
-import qualified Data.ByteString.Char8 as BS
-import System.IO.Unsafe (unsafePerformIO)
-
-{-# NOINLINE stringPoolRef #-}
-stringPoolRef :: IORef (M.Map BS.ByteString BS.ByteString)
-stringPoolRef = unsafePerformIO $ newIORef M.empty
-
-{-# NOINLINE shareString #-}
-shareString :: BS.ByteString -> BS.ByteString
-shareString s = unsafePerformIO $ do
- stringPool <- readIORef stringPoolRef
- case M.lookup s stringPool of
- Just s' -> return s'
- Nothing -> do let s' = BS.copy s
- writeIORef stringPoolRef $! M.insert s' s' stringPool
- return s'
diff --git a/src-3.0/GF/Source/SourceToGrammar.hs b/src-3.0/GF/Source/SourceToGrammar.hs
deleted file mode 100644
index e80219f30..000000000
--- a/src-3.0/GF/Source/SourceToGrammar.hs
+++ /dev/null
@@ -1,765 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : SourceToGrammar
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/10/04 11:05:07 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.28 $
---
--- based on the skeleton Haskell module generated by the BNF converter
------------------------------------------------------------------------------
-
-module GF.Source.SourceToGrammar ( transGrammar,
- transInclude,
- transModDef,
- transOldGrammar,
- transExp,
- newReservedWords
- ) where
-
-import qualified GF.Grammar.Grammar as G
-import qualified GF.Grammar.PrGrammar as GP
-import qualified GF.Infra.Modules as GM
-import qualified GF.Grammar.Macros as M
-import qualified GF.Compile.Update as U
-import qualified GF.Infra.Option as GO
-import qualified GF.Compile.ModDeps as GD
-import GF.Grammar.Predef
-import GF.Infra.Ident
-import GF.Source.AbsGF
-import GF.Source.PrintGF
-import GF.Compile.RemoveLiT --- for bw compat
-import GF.Data.Operations
-import GF.Infra.Option
-
-import Control.Monad
-import Data.Char
-import Data.List (genericReplicate)
-import qualified Data.ByteString.Char8 as BS
-
--- based on the skeleton Haskell module generated by the BNF converter
-
-type Result = Err String
-
-failure :: Show a => a -> Err b
-failure x = Bad $ "Undefined case: " ++ show x
-
-getIdentPos :: PIdent -> Err (Ident,Int)
-getIdentPos x = case x of
- PIdent ((line,_),c) -> return (IC c,line)
-
-transIdent :: PIdent -> Err Ident
-transIdent = liftM fst . getIdentPos
-
-transName :: Name -> Err Ident
-transName n = case n of
- IdentName i -> transIdent i
- ListName i -> liftM mkListId (transIdent i)
-
-transNamePos :: Name -> Err (Ident,Int)
-transNamePos n = case n of
- IdentName i -> getIdentPos i
- ListName i -> liftM (\ (c,p) -> (mkListId c,p)) (getIdentPos i)
-
-transGrammar :: Grammar -> Err G.SourceGrammar
-transGrammar x = case x of
- Gr moddefs -> do
- moddefs' <- mapM transModDef moddefs
- GD.mkSourceGrammar moddefs'
-
-transModDef :: ModDef -> Err (Ident, G.SourceModInfo)
-transModDef x = case x of
-
- MMain id0 id concspecs -> do
- id0' <- transIdent id0
- id' <- transIdent id
- concspecs' <- mapM transConcSpec concspecs
- return $ (id0', GM.ModMainGrammar (GM.MainGrammar id' concspecs'))
-
- MModule compl mtyp body -> do
-
- let mstat' = transComplMod compl
-
- (trDef, mtyp', id') <- case mtyp of
- MTAbstract id -> do
- id' <- transIdent id
- return (transAbsDef, GM.MTAbstract, id')
- MTResource id -> mkModRes id GM.MTResource body
- MTConcrete id open -> do
- id' <- transIdent id
- open' <- transIdent open
- return (transCncDef, GM.MTConcrete open', id')
- MTTransfer id a b -> do
- id' <- transIdent id
- a' <- transOpen a
- b' <- transOpen a
- return (transAbsDef, GM.MTTransfer a' b', id')
- MTInterface id -> mkModRes id GM.MTInterface body
- MTInstance id open -> do
- open' <- transIdent open
- mkModRes id (GM.MTInstance open') body
-
- mkBody (mstat', trDef, mtyp', id') body
- where
- poss = emptyBinTree ----
-
- mkBody xx@(mstat', trDef, mtyp', id') bod = case bod of
- MNoBody incls -> do
- mkBody xx $ MBody (Ext incls) NoOpens []
- MBody extends opens defs -> do
- extends' <- transExtend extends
- opens' <- transOpens opens
- defs0 <- mapM trDef $ getTopDefs defs
- poss0 <- return [(i,p) | Left ds <- defs0, (i,p,_) <- ds]
- defs' <- U.buildAnyTree [(i,d) | Left ds <- defs0, (i,_,d) <- ds]
- flags' <- return $ concatModuleOptions [o | Right o <- defs0]
- let poss1 = buildPosTree id' poss0
- return (id',
- GM.ModMod (GM.Module mtyp' mstat' flags' extends' opens' defs' poss1))
- MReuse _ -> do
- return (id', GM.ModMod (GM.Module mtyp' mstat' noModuleOptions [] [] emptyBinTree poss))
- MUnion imps -> do
- imps' <- mapM transIncluded imps
- return (id',
- GM.ModMod (GM.Module (GM.MTUnion mtyp' imps') mstat' noModuleOptions [] [] emptyBinTree poss))
-
- MWith m insts -> mkBody xx $ MWithEBody [] m insts NoOpens []
- MWithBody m insts opens defs -> mkBody xx $ MWithEBody [] m insts opens defs
- MWithE extends m insts -> mkBody xx $ MWithEBody extends m insts NoOpens []
- MWithEBody extends m insts opens defs -> do
- extends' <- mapM transIncludedExt extends
- m' <- transIncludedExt m
- insts' <- mapM transOpen insts
- opens' <- transOpens opens
- defs0 <- mapM trDef $ getTopDefs defs
- poss0 <- return [(i,p) | Left ds <- defs0, (i,p,_) <- ds]
- defs' <- U.buildAnyTree [(i,d) | Left ds <- defs0, (i,_,d) <- ds]
- flags' <- return $ concatModuleOptions [o | Right o <- defs0]
- let poss1 = buildPosTree id' poss0
- return (id',
- GM.ModWith (GM.Module mtyp' mstat' flags' extends' opens' defs' poss1) m' insts')
-
- mkModRes id mtyp body = do
- id' <- transIdent id
- case body of
- MReuse c -> do
- c' <- transIdent c
- mtyp' <- trMReuseType mtyp c'
- return (transResDef, GM.MTReuse mtyp', id')
- _ -> return (transResDef, mtyp, id')
- trMReuseType mtyp c = case mtyp of
- GM.MTInterface -> return $ GM.MRInterface c
- GM.MTInstance op -> return $ GM.MRInstance c op
- GM.MTResource -> return $ GM.MRResource c
-
-
-transComplMod :: ComplMod -> GM.ModuleStatus
-transComplMod x = case x of
- CMCompl -> GM.MSComplete
- CMIncompl -> GM.MSIncomplete
-
-getTopDefs :: [TopDef] -> [TopDef]
-getTopDefs x = x
-
-transConcSpec :: ConcSpec -> Err (GM.MainConcreteSpec Ident)
-transConcSpec x = case x of
- ConcSpec id concexp -> do
- id' <- transIdent id
- (m,mi,mo) <- transConcExp concexp
- return $ GM.MainConcreteSpec id' m mi mo
-
-transConcExp :: ConcExp ->
- Err (Ident, Maybe (GM.OpenSpec Ident),Maybe (GM.OpenSpec Ident))
-transConcExp x = case x of
- ConcExp id transfers -> do
- id' <- transIdent id
- trs <- mapM transTransfer transfers
- tin <- case [o | Left o <- trs] of
- [o] -> return $ Just o
- [] -> return $ Nothing
- _ -> Bad "ambiguous transfer in"
- tout <- case [o | Right o <- trs] of
- [o] -> return $ Just o
- [] -> return $ Nothing
- _ -> Bad "ambiguous transfer out"
- return (id',tin,tout)
-
-transTransfer :: Transfer ->
- Err (Either (GM.OpenSpec Ident)(GM.OpenSpec Ident))
-transTransfer x = case x of
- TransferIn open -> liftM Left $ transOpen open
- TransferOut open -> liftM Right $ transOpen open
-
-transExtend :: Extend -> Err [(Ident,GM.MInclude Ident)]
-transExtend x = case x of
- Ext ids -> mapM transIncludedExt ids
- NoExt -> return []
-
-transOpens :: Opens -> Err [GM.OpenSpec Ident]
-transOpens x = case x of
- NoOpens -> return []
- OpenIn opens -> mapM transOpen opens
-
-transOpen :: Open -> Err (GM.OpenSpec Ident)
-transOpen x = case x of
- OName id -> liftM (GM.OSimple GM.OQNormal) $ transIdent id
- OQualQO q id -> liftM2 GM.OSimple (transQualOpen q) (transIdent id)
- OQual q id m -> liftM3 GM.OQualif (transQualOpen q) (transIdent id) (transIdent m)
-
-transQualOpen :: QualOpen -> Err GM.OpenQualif
-transQualOpen x = case x of
- QOCompl -> return GM.OQNormal
- QOInterface -> return GM.OQInterface
- QOIncompl -> return GM.OQIncomplete
-
-transIncluded :: Included -> Err (Ident,[Ident])
-transIncluded x = case x of
- IAll i -> liftM (flip (curry id) []) $ transIdent i
- ISome i ids -> liftM2 (curry id) (transIdent i) (mapM transIdent ids)
- IMinus i ids -> liftM2 (curry id) (transIdent i) (mapM transIdent ids) ----
-
-transIncludedExt :: Included -> Err (Ident, GM.MInclude Ident)
-transIncludedExt x = case x of
- IAll i -> liftM2 (,) (transIdent i) (return GM.MIAll)
- ISome i ids -> liftM2 (,) (transIdent i) (liftM GM.MIOnly $ mapM transIdent ids)
- IMinus i ids -> liftM2 (,) (transIdent i) (liftM GM.MIExcept $ mapM transIdent ids)
-
---- where no position is saved
-nopos :: Int
-nopos = -1
-
-buildPosTree :: Ident -> [(Ident,Int)] -> BinTree Ident (String,(Int,Int))
-buildPosTree m = buildTree . mkPoss . filter ((>0) . snd) where
- mkPoss cs = case cs of
- (i,p):rest@((_,q):_) -> (i,(name,(p,max p (q-1)))) : mkPoss rest
- (i,p):[] -> (i,(name,(p,p+100))) : [] --- don't know last line
- _ -> []
- name = prIdent m ++ ".gf" ----
-
-transAbsDef :: TopDef -> Err (Either [(Ident, Int, G.Info)] GO.ModuleOptions)
-transAbsDef x = case x of
- DefCat catdefs -> liftM (Left . concat) $ mapM transCatDef catdefs
- DefFun fundefs -> do
- fundefs' <- mapM transFunDef fundefs
- returnl [(fun, nopos, G.AbsFun (yes typ) nope) | (funs,typ) <- fundefs', fun <- funs]
- DefFunData fundefs -> do
- fundefs' <- mapM transFunDef fundefs
- returnl $
- [(cat, nopos, G.AbsCat nope (yes [G.Cn fun])) | (funs,typ) <- fundefs',
- fun <- funs,
- Ok (_,cat) <- [M.valCat typ]
- ] ++
- [(fun, nopos, G.AbsFun (yes typ) (yes G.EData)) | (funs,typ) <- fundefs', fun <- funs]
- DefDef defs -> do
- defs' <- liftM concat $ mapM getDefsGen defs
- returnl [(c, nopos, G.AbsFun nope pe) | ((c,p),(_,pe)) <- defs']
- DefData ds -> do
- ds' <- mapM transDataDef ds
- returnl $
- [(c, nopos, G.AbsCat nope (yes ps)) | (c,ps) <- ds'] ++
- [(f, nopos, G.AbsFun nope (yes G.EData)) | (_,fs) <- ds', tf <- fs, f <- funs tf]
- DefTrans defs -> do
- defs' <- liftM concat $ mapM getDefsGen defs
- returnl [(c, nopos, G.AbsTrans f) | ((c,p),(_,Yes f)) <- defs']
- DefFlag defs -> liftM (Right . concatModuleOptions) $ mapM transFlagDef defs
- _ -> Bad $ "illegal definition in abstract module:" ++++ printTree x
- where
- -- to get data constructors as terms
- funs t = case t of
- G.Cn f -> [f]
- G.Q _ f -> [f]
- G.QC _ f -> [f]
- _ -> []
-
-returnl :: a -> Err (Either a b)
-returnl = return . Left
-
-transFlagDef :: FlagDef -> Err GO.ModuleOptions
-transFlagDef x = case x of
- FlagDef f x -> parseModuleOptions ["--" ++ prPIdent f ++ "=" ++ prPIdent x]
- where
- prPIdent (PIdent (_,c)) = BS.unpack c
-
-
--- | Cat definitions can also return some fun defs
--- if it is a list category definition
-transCatDef :: CatDef -> Err [(Ident, Int, G.Info)]
-transCatDef x = case x of
- SimpleCatDef id ddecls -> do
- (id',pos) <- getIdentPos id
- liftM (:[]) $ cat id' pos ddecls
- ListCatDef id ddecls -> listCat id ddecls 0
- ListSizeCatDef id ddecls size -> listCat id ddecls size
- where
- cat i pos ddecls = do
- -- i <- transIdent id
- cont <- liftM concat $ mapM transDDecl ddecls
- return (i, pos, G.AbsCat (yes cont) nope)
- listCat id ddecls size = do
- (id',pos) <- getIdentPos id
- let
- li = mkListId id'
- baseId = mkBaseId id'
- consId = mkConsId id'
- catd0@(c,p,G.AbsCat (Yes cont0) _) <- cat li pos ddecls
- let
- catd = (c,pos,G.AbsCat (Yes cont0) (Yes [G.Cn baseId,G.Cn consId]))
- cont = [(mkId x i,ty) | (i,(x,ty)) <- zip [0..] cont0]
- xs = map (G.Vr . fst) cont
- cd = M.mkDecl (M.mkApp (G.Vr id') xs)
- lc = M.mkApp (G.Vr li) xs
- niltyp = M.mkProdSimple (cont ++ genericReplicate size cd) lc
- nilfund = (baseId, nopos, G.AbsFun (yes niltyp) (yes G.EData))
- constyp = M.mkProdSimple (cont ++ [cd, M.mkDecl lc]) lc
- consfund = (consId, nopos, G.AbsFun (yes constyp) (yes G.EData))
- return [catd,nilfund,consfund]
- mkId x i = if isWildIdent x then (varX i) else x
-
-transFunDef :: FunDef -> Err ([Ident], G.Type)
-transFunDef x = case x of
- FunDef ids typ -> liftM2 (,) (mapM transIdent ids) (transExp typ)
-
-transDataDef :: DataDef -> Err (Ident,[G.Term])
-transDataDef x = case x of
- DataDef id ds -> liftM2 (,) (transIdent id) (mapM transData ds)
- where
- transData d = case d of
- DataId id -> liftM G.Cn $ transIdent id
- DataQId id0 id -> liftM2 G.QC (transIdent id0) (transIdent id)
-
-transResDef :: TopDef -> Err (Either [(Ident, Int, G.Info)] GO.ModuleOptions)
-transResDef x = case x of
- DefPar pardefs -> do
- pardefs' <- mapM transParDef pardefs
- returnl $ [(p, nopos, G.ResParam (if null pars
- then nope -- abstract param type
- else (yes (pars,Nothing))))
- | (p,pars) <- pardefs']
- ++ [(f, nopos, G.ResValue (yes (M.mkProdSimple co (G.Cn p),Nothing))) |
- (p,pars) <- pardefs', (f,co) <- pars]
-
- DefOper defs -> do
- defs' <- liftM concat $ mapM getDefs defs
- returnl $
- concatMap mkOverload [(f, p, G.ResOper pt pe) | ((f,p),(pt,pe)) <- defs']
-
- DefLintype defs -> do
- defs' <- liftM concat $ mapM getDefs defs
- returnl [(f, p, G.ResOper pt pe) | ((f,p),(pt,pe)) <- defs']
-
- DefFlag defs -> liftM (Right . concatModuleOptions) $ mapM transFlagDef defs
- _ -> Bad $ "illegal definition form in resource" +++ printTree x
- where
- mkOverload op@(c,p,j) = case j of
- G.ResOper _ (Yes df) -> case M.appForm df of
- (keyw, ts@(_:_)) | isOverloading keyw -> case last ts of
- G.R fs ->
- [(c,p,G.ResOverload [m | G.Vr m <- ts] [(ty,fu) | (_,(Just ty,fu)) <- fs])]
- _ -> [op]
- _ -> [op]
-
- -- to enable separare type signature --- not type-checked
- G.ResOper (Yes df) _ -> case M.appForm df of
- (keyw, ts@(_:_)) | isOverloading keyw -> case last ts of
- G.RecType _ -> []
- _ -> [op]
- _ -> [op]
- _ -> [(c,p,j)]
- isOverloading keyw =
- GP.prt keyw == "overload" -- overload is a "soft keyword"
- isRec t = case t of
- G.R _ -> True
- _ -> False
-
-transParDef :: ParDef -> Err (Ident, [G.Param])
-transParDef x = case x of
- ParDefDir id params -> liftM2 (,) (transIdent id) (mapM transParConstr params)
- ParDefAbs id -> liftM2 (,) (transIdent id) (return [])
- _ -> Bad $ "illegal definition in resource:" ++++ printTree x
-
-transCncDef :: TopDef -> Err (Either [(Ident, Int, G.Info)] GO.ModuleOptions)
-transCncDef x = case x of
- DefLincat defs -> do
- defs' <- liftM concat $ mapM transPrintDef defs
- returnl [(f, nopos, G.CncCat (yes t) nope nope) | (f,t) <- defs']
- DefLindef defs -> do
- defs' <- liftM concat $ mapM getDefs defs
- returnl [(f, p, G.CncCat pt pe nope) | ((f,p),(pt,pe)) <- defs']
- DefLin defs -> do
- defs' <- liftM concat $ mapM getDefs defs
- returnl [(f, p, G.CncFun Nothing pe nope) | ((f,p),(_,pe)) <- defs']
- DefPrintCat defs -> do
- defs' <- liftM concat $ mapM transPrintDef defs
- returnl [(f, nopos, G.CncCat nope nope (yes e)) | (f,e) <- defs']
- DefPrintFun defs -> do
- defs' <- liftM concat $ mapM transPrintDef defs
- returnl [(f, nopos, G.CncFun Nothing nope (yes e)) | (f,e) <- defs']
- DefPrintOld defs -> do --- a guess, for backward compatibility
- defs' <- liftM concat $ mapM transPrintDef defs
- returnl [(f, nopos, G.CncFun Nothing nope (yes e)) | (f,e) <- defs']
- DefFlag defs -> liftM (Right . concatModuleOptions) $ mapM transFlagDef defs
- DefPattern defs -> do
- defs' <- liftM concat $ mapM getDefs defs
- let defs2 = [(f, termInPattern t) | (f,(_,Yes t)) <- defs']
- returnl [(f, p, G.CncFun Nothing (yes t) nope) | ((f,p),t) <- defs2]
-
- _ -> errIn ("illegal definition in concrete syntax:") $ transResDef x
-
-transPrintDef :: PrintDef -> Err [(Ident,G.Term)]
-transPrintDef x = case x of
- PrintDef ids exp -> do
- (ids,e) <- liftM2 (,) (mapM transName ids) (transExp exp)
- return $ [(i,e) | i <- ids]
-
-getDefsGen :: Def -> Err [((Ident, Int),(G.Perh G.Type, G.Perh G.Term))]
-getDefsGen d = case d of
- DDecl ids t -> do
- ids' <- mapM transNamePos ids
- t' <- transExp t
- return [(i,(yes t', nope)) | i <- ids']
- DDef ids e -> do
- ids' <- mapM transNamePos ids
- e' <- transExp e
- return [(i,(nope, yes e')) | i <- ids']
- DFull ids t e -> do
- ids' <- mapM transNamePos ids
- t' <- transExp t
- e' <- transExp e
- return [(i,(yes t', yes e')) | i <- ids']
- DPatt id patts e -> do
- id' <- transNamePos id
- ps' <- mapM transPatt patts
- e' <- transExp e
- return [(id',(nope, yes (G.Eqs [(ps',e')])))]
-
--- | sometimes you need this special case, e.g. in linearization rules
-getDefs :: Def -> Err [((Ident,Int), (G.Perh G.Type, G.Perh G.Term))]
-getDefs d = case d of
- DPatt id patts e -> do
- id' <- transNamePos id
- xs <- mapM tryMakeVar patts
- e' <- transExp e
- return [(id',(nope, yes (M.mkAbs xs e')))]
- _ -> getDefsGen d
-
--- | accepts a pattern that is either a variable or a wild card
-tryMakeVar :: Patt -> Err Ident
-tryMakeVar p = do
- p' <- transPatt p
- case p' of
- G.PV i -> return i
- G.PW -> return identW
- _ -> Bad $ "not a legal pattern in lambda binding" +++ GP.prt p'
-
-transExp :: Exp -> Err G.Term
-transExp x = case x of
- EIdent id -> liftM G.Vr $ transIdent id
- EConstr id -> liftM G.Con $ transIdent id
- ECons id -> liftM G.Cn $ transIdent id
- EQConstr m c -> liftM2 G.QC (transIdent m) (transIdent c)
- EQCons m c -> liftM2 G.Q (transIdent m) (transIdent c)
- EString str -> return $ G.K str
- ESort sort -> return $ G.Sort $ transSort sort
- EInt n -> return $ G.EInt n
- EFloat n -> return $ G.EFloat n
- EMeta -> return $ G.Meta $ M.int2meta 0
- EEmpty -> return G.Empty
- -- [ C x_1 ... x_n ] becomes (ListC x_1 ... x_n)
- EList i es -> do
- i' <- transIdent i
- es' <- mapM transExp (exps2list es)
- return $ foldl G.App (G.Vr (mkListId i')) es'
- EStrings [] -> return G.Empty
- EStrings str -> return $ foldr1 G.C $ map G.K $ words str
- ERecord defs -> erecord2term defs
- ETupTyp _ _ -> do
- let tups t = case t of
- ETupTyp x y -> tups x ++ [y] -- right-associative parsing
- _ -> [t]
- es <- mapM transExp $ tups x
- return $ G.RecType $ M.tuple2recordType es
- ETuple tuplecomps -> do
- es <- mapM transExp [e | TComp e <- tuplecomps]
- return $ G.R $ M.tuple2record es
- EProj exp id -> liftM2 G.P (transExp exp) (trLabel id)
- EApp exp0 exp -> liftM2 G.App (transExp exp0) (transExp exp)
- ETable cases -> liftM (G.T G.TRaw) (transCases cases)
- ETTable exp cases ->
- liftM2 (\t c -> G.T (G.TTyped t) c) (transExp exp) (transCases cases)
- EVTable exp cases ->
- liftM2 (\t c -> G.V t c) (transExp exp) (mapM transExp cases)
- ECase exp cases -> do
- exp' <- transExp exp
- cases' <- transCases cases
- let annot = case exp' of
- G.Typed _ t -> G.TTyped t
- _ -> G.TRaw
- return $ G.S (G.T annot cases') exp'
- ECTable binds exp -> liftM2 M.mkCTable (mapM transBind binds) (transExp exp)
-
- EVariants exps -> liftM G.FV $ mapM transExp exps
- EPre exp alts -> liftM2 (curry G.Alts) (transExp exp) (mapM transAltern alts)
- EStrs exps -> liftM G.Strs $ mapM transExp exps
- ESelect exp0 exp -> liftM2 G.S (transExp exp0) (transExp exp)
- EExtend exp0 exp -> liftM2 G.ExtR (transExp exp0) (transExp exp)
- EAbstr binds exp -> liftM2 M.mkAbs (mapM transBind binds) (transExp exp)
- ETyped exp0 exp -> liftM2 G.Typed (transExp exp0) (transExp exp)
- EExample exp str -> liftM2 G.Example (transExp exp) (return str)
-
- EProd decl exp -> liftM2 M.mkProdSimple (transDecl decl) (transExp exp)
- ETType exp0 exp -> liftM2 G.Table (transExp exp0) (transExp exp)
- EConcat exp0 exp -> liftM2 G.C (transExp exp0) (transExp exp)
- EGlue exp0 exp -> liftM2 G.Glue (transExp exp0) (transExp exp)
- ELet defs exp -> do
- exp' <- transExp exp
- defs0 <- mapM locdef2fields defs
- defs' <- mapM tryLoc $ concat defs0
- return $ M.mkLet defs' exp'
- where
- tryLoc (c,(mty,Just e)) = return (c,(mty,e))
- tryLoc (c,_) = Bad $ "local definition of" +++ GP.prt c +++ "without value"
- ELetb defs exp -> transExp $ ELet defs exp
- EWhere exp defs -> transExp $ ELet defs exp
-
- EPattType typ -> liftM G.EPattType (transExp typ)
- EPatt patt -> liftM G.EPatt (transPatt patt)
-
- ELString (LString str) -> return $ G.K (BS.unpack str) -- use the grammar encoding here
- ELin id -> liftM G.LiT $ transIdent id
-
- EEqs eqs -> liftM G.Eqs $ mapM transEquation eqs
-
- _ -> Bad $ "translation not yet defined for" +++ printTree x ----
-
-exps2list :: Exps -> [Exp]
-exps2list NilExp = []
-exps2list (ConsExp e es) = e : exps2list es
-
---- this is complicated: should we change Exp or G.Term ?
-
-erecord2term :: [LocDef] -> Err G.Term
-erecord2term ds = do
- ds' <- mapM locdef2fields ds
- mkR $ concat ds'
- where
- mkR fs = do
- fs' <- transF fs
- return $ case fs' of
- Left ts -> G.RecType ts
- Right ds -> G.R ds
- transF [] = return $ Left [] --- empty record always interpreted as record type
- transF fs@(f:_) = case f of
- (lab,(Just ty,Nothing)) -> mapM tryRT fs >>= return . Left
- _ -> mapM tryR fs >>= return . Right
- tryRT f = case f of
- (lab,(Just ty,Nothing)) -> return (G.ident2label lab,ty)
- _ -> Bad $ "illegal record type field" +++ GP.prt (fst f) --- manifest fields ?!
- tryR f = case f of
- (lab,(mty, Just t)) -> return (G.ident2label lab,(mty,t))
- _ -> Bad $ "illegal record field" +++ GP.prt (fst f)
-
-
-locdef2fields :: LocDef -> Err [(Ident, (Maybe G.Type, Maybe G.Type))]
-locdef2fields d = case d of
- LDDecl ids t -> do
- labs <- mapM transIdent ids
- t' <- transExp t
- return [(lab,(Just t',Nothing)) | lab <- labs]
- LDDef ids e -> do
- labs <- mapM transIdent ids
- e' <- transExp e
- return [(lab,(Nothing, Just e')) | lab <- labs]
- LDFull ids t e -> do
- labs <- mapM transIdent ids
- t' <- transExp t
- e' <- transExp e
- return [(lab,(Just t', Just e')) | lab <- labs]
-
-trLabel :: Label -> Err G.Label
-trLabel x = case x of
- LIdent (PIdent (_, s)) -> return $ G.LIdent s
- LVar x -> return $ G.LVar $ fromInteger x
-
-transSort :: Sort -> Ident
-transSort Sort_Type = cType
-transSort Sort_PType = cPType
-transSort Sort_Tok = cTok
-transSort Sort_Str = cStr
-transSort Sort_Strs = cStrs
-
-
-{-
---- no more used 7/1/2006 AR
-transPatts :: Patt -> Err [G.Patt]
-transPatts p = case p of
- PDisj p1 p2 -> liftM2 (++) (transPatts p1) (transPatts p2)
- PC id patts -> liftM (map (G.PC id) . combinations) $ mapM transPatts patts
- PQC q id patts -> liftM (map (G.PP q id) . combinations) (mapM transPatts patts)
-
- PR pattasss -> do
- let (lss,ps) = unzip [(ls,p) | PA ls p <- pattasss]
- ls = map LIdent $ concat lss
- ps0 <- mapM transPatts ps
- let ps' = combinations ps0
- lss' <- mapM trLabel ls
- let rss = map (zip lss') ps'
- return $ map G.PR rss
- PTup pcs -> do
- ps0 <- mapM transPatts [e | PTComp e <- pcs]
- let ps' = combinations ps0
- return $ map (G.PR . M.tuple2recordPatt) ps'
- _ -> liftM singleton $ transPatt p
--}
-
-transPatt :: Patt -> Err G.Patt
-transPatt x = case x of
- PW -> return G.wildPatt
- PV id -> liftM G.PV $ transIdent id
- PC id patts -> liftM2 G.PC (transIdent id) (mapM transPatt patts)
- PCon id -> liftM2 G.PC (transIdent id) (return [])
- PInt n -> return $ G.PInt n
- PFloat n -> return $ G.PFloat n
- PStr str -> return $ G.PString str
- PR pattasss -> do
- let (lss,ps) = unzip [(ls,p) | PA ls p <- pattasss]
- ls = map LIdent $ concat lss
- liftM G.PR $ liftM2 zip (mapM trLabel ls) (mapM transPatt ps)
- PTup pcs ->
- liftM (G.PR . M.tuple2recordPatt) (mapM transPatt [e | PTComp e <- pcs])
- PQ id0 id -> liftM3 G.PP (transIdent id0) (transIdent id) (return [])
- PQC id0 id patts ->
- liftM3 G.PP (transIdent id0) (transIdent id) (mapM transPatt patts)
- PDisj p1 p2 -> liftM2 G.PAlt (transPatt p1) (transPatt p2)
- PSeq p1 p2 -> liftM2 G.PSeq (transPatt p1) (transPatt p2)
- PRep p -> liftM G.PRep (transPatt p)
- PNeg p -> liftM G.PNeg (transPatt p)
- PAs x p -> liftM2 G.PAs (transIdent x) (transPatt p)
- PChar -> return G.PChar
- PChars s -> return $ G.PChars s
- PMacro c -> liftM G.PMacro $ transIdent c
- PM m c -> liftM2 G.PM (transIdent m) (transIdent c)
-
-transBind :: Bind -> Err Ident
-transBind x = case x of
- BIdent id -> transIdent id
- BWild -> return identW
-
-transDecl :: Decl -> Err [G.Decl]
-transDecl x = case x of
- DDec binds exp -> do
- xs <- mapM transBind binds
- exp' <- transExp exp
- return [(x,exp') | x <- xs]
- DExp exp -> liftM (return . M.mkDecl) $ transExp exp
-
-transCases :: [Case] -> Err [G.Case]
-transCases = mapM transCase
-
-transCase :: Case -> Err G.Case
-transCase (Case p exp) = do
- patt <- transPatt p
- exp' <- transExp exp
- return (patt,exp')
-
-transEquation :: Equation -> Err G.Equation
-transEquation x = case x of
- Equ apatts exp -> liftM2 (,) (mapM transPatt apatts) (transExp exp)
-
-transAltern :: Altern -> Err (G.Term, G.Term)
-transAltern x = case x of
- Alt exp0 exp -> liftM2 (,) (transExp exp0) (transExp exp)
-
-transParConstr :: ParConstr -> Err G.Param
-transParConstr x = case x of
- ParConstr id ddecls -> do
- id' <- transIdent id
- ddecls' <- mapM transDDecl ddecls
- return (id',concat ddecls')
-
-transDDecl :: DDecl -> Err [G.Decl]
-transDDecl x = case x of
- DDDec binds exp -> transDecl $ DDec binds exp
- DDExp exp -> transDecl $ DExp exp
-
--- | to deal with the old format, sort judgements in two modules, forming
--- their names from a given string, e.g. file name or overriding user-given string
-transOldGrammar :: Options -> FilePath -> OldGrammar -> Err G.SourceGrammar
-transOldGrammar opts name0 x = case x of
- OldGr includes topdefs -> do --- includes must be collected separately
- let moddefs = sortTopDefs topdefs
- g1 <- transGrammar $ Gr moddefs
- removeLiT g1 --- needed for bw compatibility with an obsolete feature
- where
- sortTopDefs ds = [mkAbs a, mkCnc ops (c ++ r)]
- where
- ops = map fst ps
- (a,r,c,ps) = foldr srt ([],[],[],[]) ds
- srt d (a,r,c,ps) = case d of
- DefCat catdefs -> (d:a,r,c,ps)
- DefFun fundefs -> (d:a,r,c,ps)
- DefFunData fundefs -> (d:a,r,c,ps)
- DefDef defs -> (d:a,r,c,ps)
- DefData pardefs -> (d:a,r,c,ps)
- DefPar pardefs -> (a,d:r,c,ps)
- DefOper defs -> (a,d:r,c,ps)
- DefLintype defs -> (a,d:r,c,ps)
- DefLincat defs -> (a,r,d:c,ps)
- DefLindef defs -> (a,r,d:c,ps)
- DefLin defs -> (a,r,d:c,ps)
- DefPattern defs -> (a,r,d:c,ps)
- DefFlag defs -> (a,r,d:c,ps) --- a guess
- DefPrintCat printdefs -> (a,r,d:c,ps)
- DefPrintFun printdefs -> (a,r,d:c,ps)
- DefPrintOld printdefs -> (a,r,d:c,ps)
- -- DefPackage m ds -> (a,r,c,(m,ds):ps) -- OBSOLETE
- _ -> (a,r,c,ps)
- mkAbs a = MModule q (MTAbstract absName) (MBody ne (OpenIn []) (topDefs a))
- mkCnc ps r = MModule q (MTConcrete cncName absName) (MBody ne (OpenIn []) (topDefs r))
- topDefs t = t
- ne = NoExt
- q = CMCompl
-
- name = maybe name0 (++ ".gf") $ moduleFlag optName opts
- absName = identPI $ maybe topic id $ moduleFlag optAbsName opts
- resName = identPI $ maybe ("Res" ++ lang) id $ moduleFlag optResName opts
- cncName = identPI $ maybe lang id $ moduleFlag optCncName opts
-
- identPI s = PIdent ((0,0),BS.pack s)
-
- (beg,rest) = span (/='.') name
- (topic,lang) = case rest of -- to avoid overwriting old files
- ".gf" -> ("Abs" ++ beg,"Cnc" ++ beg)
- ".cf" -> ("Abs" ++ beg,"Cnc" ++ beg)
- ".ebnf" -> ("Abs" ++ beg,"Cnc" ++ beg)
- [] -> ("Abs" ++ beg,"Cnc" ++ beg)
- _:s -> (beg, takeWhile (/='.') s)
-
-transInclude :: Include -> Err [FilePath]
-transInclude x = Bad "Old GF with includes no more supported in GF 3.0"
-
-newReservedWords :: [String]
-newReservedWords =
- words $ "abstract concrete interface incomplete " ++
- "instance out open resource reuse transfer union with where"
-
-termInPattern :: G.Term -> G.Term
-termInPattern t = M.mkAbs xx $ G.R [(s, (Nothing, toP body))] where
- toP t = case t of
- G.Vr x -> G.P t s
- _ -> M.composSafeOp toP t
- s = G.LIdent (BS.pack "s")
- (xx,body) = abss [] t
- abss xs t = case t of
- G.Abs x b -> abss (x:xs) b
- _ -> (reverse xs,t)
-
-mkListId,mkConsId,mkBaseId :: Ident -> Ident
-mkListId = prefixId (BS.pack "List")
-mkConsId = prefixId (BS.pack "Cons")
-mkBaseId = prefixId (BS.pack "Base")
-
-prefixId :: BS.ByteString -> Ident -> Ident
-prefixId pref id = identC (BS.append pref (ident2bs id))
diff --git a/src-3.0/GF/Speech/CFG.hs b/src-3.0/GF/Speech/CFG.hs
deleted file mode 100644
index 5b2a0f2ca..000000000
--- a/src-3.0/GF/Speech/CFG.hs
+++ /dev/null
@@ -1,344 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : GF.Speech.CFG
---
--- Context-free grammar representation and manipulation.
-----------------------------------------------------------------------
-module GF.Speech.CFG where
-
-import GF.Data.Utilities
-import PGF.CId
-import GF.Infra.Option
-import GF.Infra.PrintClass
-import GF.Speech.Relation
-
-import Control.Monad
-import Control.Monad.State (State, get, put, evalState)
-import qualified Data.ByteString.Char8 as BS
-import Data.Map (Map)
-import qualified Data.Map as Map
-import Data.List
-import Data.Maybe (fromMaybe)
-import Data.Monoid (mconcat)
-import Data.Set (Set)
-import qualified Data.Set as Set
-
---
--- * Types
---
-
-type Cat = String
-type Token = String
-
-data Symbol c t = NonTerminal c | Terminal t
- deriving (Eq, Ord, Show)
-
-type CFSymbol = Symbol Cat Token
-
-data CFRule = CFRule {
- lhsCat :: Cat,
- ruleRhs :: [CFSymbol],
- ruleName :: CFTerm
- }
- deriving (Eq, Ord, Show)
-
-data CFTerm
- = CFObj CId [CFTerm] -- ^ an abstract syntax function with arguments
- | CFAbs Int CFTerm -- ^ A lambda abstraction. The Int is the variable id.
- | CFApp CFTerm CFTerm -- ^ Application
- | CFRes Int -- ^ The result of the n:th (0-based) non-terminal
- | CFVar Int -- ^ A lambda-bound variable
- | CFMeta CId -- ^ A metavariable
- deriving (Eq, Ord, Show)
-
-data CFG = CFG { cfgStartCat :: Cat,
- cfgExternalCats :: Set Cat,
- cfgRules :: Map Cat (Set CFRule) }
- deriving (Eq, Ord, Show)
-
---
--- * Grammar filtering
---
-
--- | Removes all directly and indirectly cyclic productions.
--- FIXME: this may be too aggressive, only one production
--- needs to be removed to break a given cycle. But which
--- one should we pick?
--- FIXME: Does not (yet) remove productions which are cyclic
--- because of empty productions.
-removeCycles :: CFG -> CFG
-removeCycles = onRules f
- where f rs = filter (not . isCycle) rs
- where alias = transitiveClosure $ mkRel [(c,c') | CFRule c [NonTerminal c'] _ <- rs]
- isCycle (CFRule c [NonTerminal c'] _) = isRelatedTo alias c' c
- isCycle _ = False
-
--- | Better bottom-up filter that also removes categories which contain no finite
--- strings.
-bottomUpFilter :: CFG -> CFG
-bottomUpFilter gr = fix grow (gr { cfgRules = Map.empty })
- where grow g = g `unionCFG` filterCFG (all (okSym g) . ruleRhs) gr
- okSym g = symbol (`elem` allCats g) (const True)
-
--- | Removes categories which are not reachable from any external category.
-topDownFilter :: CFG -> CFG
-topDownFilter cfg = filterCFGCats (`Set.member` keep) cfg
- where
- rhsCats = [ (lhsCat r, c') | r <- allRules cfg, c' <- filterCats (ruleRhs r) ]
- uses = reflexiveClosure_ (allCats cfg) $ transitiveClosure $ mkRel rhsCats
- keep = Set.unions $ map (allRelated uses) $ Set.toList $ cfgExternalCats cfg
-
--- | Merges categories with identical right-hand-sides.
--- FIXME: handle probabilities
-mergeIdentical :: CFG -> CFG
-mergeIdentical g = onRules (map subst) g
- where
- -- maps categories to their replacement
- m = Map.fromList [(y,concat (intersperse "+" xs))
- | (_,xs) <- buildMultiMap [(rulesKey rs,c) | (c,rs) <- Map.toList (cfgRules g)], y <- xs]
- -- build data to compare for each category: a set of name,rhs pairs
- rulesKey = Set.map (\ (CFRule _ r n) -> (n,r))
- subst (CFRule c r n) = CFRule (substCat c) (map (mapSymbol substCat id) r) n
- substCat c = Map.findWithDefault (error $ "mergeIdentical: " ++ c) c m
-
---
--- * Removing left recursion
---
-
--- The LC_LR algorithm from
--- http://research.microsoft.com/users/bobmoore/naacl2k-proc-rev.pdf
-removeLeftRecursion :: CFG -> CFG
-removeLeftRecursion gr
- = gr { cfgRules = groupProds $ concat [scheme1, scheme2, scheme3, scheme4] }
- where
- scheme1 = [CFRule a [x,NonTerminal a_x] n' |
- a <- retainedLeftRecursive,
- x <- properLeftCornersOf a,
- not (isLeftRecursive x),
- let a_x = mkCat (NonTerminal a) x,
- -- this is an extension of LC_LR to avoid generating
- -- A-X categories for which there are no productions:
- a_x `Set.member` newCats,
- let n' = symbol (\_ -> CFApp (CFRes 1) (CFRes 0))
- (\_ -> CFRes 0) x]
- scheme2 = [CFRule a_x (beta++[NonTerminal a_b]) n' |
- a <- retainedLeftRecursive,
- b@(NonTerminal b') <- properLeftCornersOf a,
- isLeftRecursive b,
- CFRule _ (x:beta) n <- catRules gr b',
- let a_x = mkCat (NonTerminal a) x,
- let a_b = mkCat (NonTerminal a) b,
- let i = length $ filterCats beta,
- let n' = symbol (\_ -> CFAbs 1 (CFApp (CFRes i) (shiftTerm n)))
- (\_ -> CFApp (CFRes i) n) x]
- scheme3 = [CFRule a_x beta n' |
- a <- retainedLeftRecursive,
- x <- properLeftCornersOf a,
- CFRule _ (x':beta) n <- catRules gr a,
- x == x',
- let a_x = mkCat (NonTerminal a) x,
- let n' = symbol (\_ -> CFAbs 1 (shiftTerm n))
- (\_ -> n) x]
- scheme4 = catSetRules gr $ Set.fromList $ filter (not . isLeftRecursive . NonTerminal) cats
-
- newCats = Set.fromList (map lhsCat (scheme2 ++ scheme3))
-
- shiftTerm :: CFTerm -> CFTerm
- shiftTerm (CFObj f ts) = CFObj f (map shiftTerm ts)
- shiftTerm (CFRes 0) = CFVar 1
- shiftTerm (CFRes n) = CFRes (n-1)
- shiftTerm t = t
- -- note: the rest don't occur in the original grammar
-
- cats = allCats gr
- rules = allRules gr
-
- directLeftCorner = mkRel [(NonTerminal c,t) | CFRule c (t:_) _ <- allRules gr]
- leftCorner = reflexiveClosure_ (map NonTerminal cats) $ transitiveClosure directLeftCorner
- properLeftCorner = transitiveClosure directLeftCorner
- properLeftCornersOf = Set.toList . allRelated properLeftCorner . NonTerminal
- isProperLeftCornerOf = flip (isRelatedTo properLeftCorner)
-
- leftRecursive = reflexiveElements properLeftCorner
- isLeftRecursive = (`Set.member` leftRecursive)
-
- retained = cfgStartCat gr `Set.insert`
- Set.fromList [a | r <- allRules (filterCFGCats (not . isLeftRecursive . NonTerminal) gr),
- NonTerminal a <- ruleRhs r]
- isRetained = (`Set.member` retained)
-
- retainedLeftRecursive = filter (isLeftRecursive . NonTerminal) $ Set.toList retained
-
- mkCat :: CFSymbol -> CFSymbol -> Cat
- mkCat x y = showSymbol x ++ "-" ++ showSymbol y
- where showSymbol = symbol id show
-
--- | Get the sets of mutually recursive non-terminals for a grammar.
-mutRecCats :: Bool -- ^ If true, all categories will be in some set.
- -- If false, only recursive categories will be included.
- -> CFG -> [Set Cat]
-mutRecCats incAll g = equivalenceClasses $ refl $ symmetricSubrelation $ transitiveClosure r
- where r = mkRel [(c,c') | CFRule c ss _ <- allRules g, NonTerminal c' <- ss]
- refl = if incAll then reflexiveClosure_ (allCats g) else reflexiveSubrelation
-
---
--- * Approximate context-free grammars with regular grammars.
---
-
-makeSimpleRegular :: CFG -> CFG
-makeSimpleRegular = makeRegular . topDownFilter . bottomUpFilter . removeCycles
-
--- Use the transformation algorithm from \"Regular Approximation of Context-free
--- Grammars through Approximation\", Mohri and Nederhof, 2000
--- to create an over-generating regular frammar for a context-free
--- grammar
-makeRegular :: CFG -> CFG
-makeRegular g = g { cfgRules = groupProds $ concatMap trSet (mutRecCats True g) }
- where trSet cs | allXLinear cs rs = rs
- | otherwise = concatMap handleCat csl
- where csl = Set.toList cs
- rs = catSetRules g cs
- handleCat c = [CFRule c' [] (mkCFTerm (c++"-empty"))] -- introduce A' -> e
- ++ concatMap (makeRightLinearRules c) (catRules g c)
- where c' = newCat c
- makeRightLinearRules b' (CFRule c ss n) =
- case ys of
- [] -> newRule b' (xs ++ [NonTerminal (newCat c)]) n -- no non-terminals left
- (NonTerminal b:zs) -> newRule b' (xs ++ [NonTerminal b]) n
- ++ makeRightLinearRules (newCat b) (CFRule c zs n)
- where (xs,ys) = break (`catElem` cs) ss
- -- don't add rules on the form A -> A
- newRule c rhs n | rhs == [NonTerminal c] = []
- | otherwise = [CFRule c rhs n]
- newCat c = c ++ "$"
-
---
--- * CFG Utilities
---
-
-mkCFG :: Cat -> Set Cat -> [CFRule] -> CFG
-mkCFG start ext rs = CFG { cfgStartCat = start, cfgExternalCats = ext, cfgRules = groupProds rs }
-
-groupProds :: [CFRule] -> Map Cat (Set CFRule)
-groupProds = Map.fromListWith Set.union . map (\r -> (lhsCat r,Set.singleton r))
-
--- | Gets all rules in a CFG.
-allRules :: CFG -> [CFRule]
-allRules = concat . map Set.toList . Map.elems . cfgRules
-
--- | Gets all rules in a CFG, grouped by their LHS categories.
-allRulesGrouped :: CFG -> [(Cat,[CFRule])]
-allRulesGrouped = Map.toList . Map.map Set.toList . cfgRules
-
--- | Gets all categories which have rules.
-allCats :: CFG -> [Cat]
-allCats = Map.keys . cfgRules
-
--- | Gets all rules for the given category.
-catRules :: CFG -> Cat -> [CFRule]
-catRules gr c = Set.toList $ Map.findWithDefault Set.empty c (cfgRules gr)
-
--- | Gets all rules for categories in the given set.
-catSetRules :: CFG -> Set Cat -> [CFRule]
-catSetRules gr cs = allRules $ filterCFGCats (`Set.member` cs) gr
-
-mapCFGCats :: (Cat -> Cat) -> CFG -> CFG
-mapCFGCats f cfg = mkCFG (f (cfgStartCat cfg))
- (Set.map f (cfgExternalCats cfg))
- [CFRule (f lhs) (map (mapSymbol f id) rhs) t | CFRule lhs rhs t <- allRules cfg]
-
-onCFG :: (Map Cat (Set CFRule) -> Map Cat (Set CFRule)) -> CFG -> CFG
-onCFG f cfg = cfg { cfgRules = f (cfgRules cfg) }
-
-onRules :: ([CFRule] -> [CFRule]) -> CFG -> CFG
-onRules f cfg = cfg { cfgRules = groupProds $ f $ allRules cfg }
-
--- | Clean up CFG after rules have been removed.
-cleanCFG :: CFG -> CFG
-cleanCFG = onCFG (Map.filter (not . Set.null))
-
--- | Combine two CFGs.
-unionCFG :: CFG -> CFG -> CFG
-unionCFG x y = onCFG (\rs -> Map.unionWith Set.union rs (cfgRules y)) x
-
-filterCFG :: (CFRule -> Bool) -> CFG -> CFG
-filterCFG p = cleanCFG . onCFG (Map.map (Set.filter p))
-
-filterCFGCats :: (Cat -> Bool) -> CFG -> CFG
-filterCFGCats p = onCFG (Map.filterWithKey (\c _ -> p c))
-
-countCats :: CFG -> Int
-countCats = Map.size . cfgRules . cleanCFG
-
-countRules :: CFG -> Int
-countRules = length . allRules
-
-prCFG :: CFG -> String
-prCFG = unlines . map prRule . allRules
- where
- prRule r = lhsCat r ++ " ::= " ++ unwords (map prSym (ruleRhs r))
- prSym = symbol id (\t -> "\""++ t ++"\"")
-
---
--- * CFRule Utilities
---
-
-ruleFun :: CFRule -> CId
-ruleFun (CFRule _ _ t) = f t
- where f (CFObj n _) = n
- f (CFApp _ x) = f x
- f (CFAbs _ x) = f x
- f _ = mkCId ""
-
--- | Check if any of the categories used on the right-hand side
--- are in the given list of categories.
-anyUsedBy :: [Cat] -> CFRule -> Bool
-anyUsedBy cs (CFRule _ ss _) = any (`elem` cs) (filterCats ss)
-
-mkCFTerm :: String -> CFTerm
-mkCFTerm n = CFObj (mkCId n) []
-
-ruleIsNonRecursive :: Set Cat -> CFRule -> Bool
-ruleIsNonRecursive cs = noCatsInSet cs . ruleRhs
-
--- | Check if all the rules are right-linear, or all the rules are
--- left-linear, with respect to given categories.
-allXLinear :: Set Cat -> [CFRule] -> Bool
-allXLinear cs rs = all (isRightLinear cs) rs || all (isLeftLinear cs) rs
-
--- | Checks if a context-free rule is right-linear.
-isRightLinear :: Set Cat -- ^ The categories to consider
- -> CFRule -- ^ The rule to check for right-linearity
- -> Bool
-isRightLinear cs = noCatsInSet cs . safeInit . ruleRhs
-
--- | Checks if a context-free rule is left-linear.
-isLeftLinear :: Set Cat -- ^ The categories to consider
- -> CFRule -- ^ The rule to check for left-linearity
- -> Bool
-isLeftLinear cs = noCatsInSet cs . drop 1 . ruleRhs
-
-
---
--- * Symbol utilities
---
-
-symbol :: (c -> a) -> (t -> a) -> Symbol c t -> a
-symbol fc ft (NonTerminal cat) = fc cat
-symbol fc ft (Terminal tok) = ft tok
-
-mapSymbol :: (c -> c') -> (t -> t') -> Symbol c t -> Symbol c' t'
-mapSymbol fc ft = symbol (NonTerminal . fc) (Terminal . ft)
-
-filterCats :: [Symbol c t] -> [c]
-filterCats syms = [ cat | NonTerminal cat <- syms ]
-
-filterToks :: [Symbol c t] -> [t]
-filterToks syms = [ tok | Terminal tok <- syms ]
-
--- | Checks if a symbol is a non-terminal of one of the given categories.
-catElem :: Ord c => Symbol c t -> Set c -> Bool
-catElem s cs = symbol (`Set.member` cs) (const False) s
-
-noCatsInSet :: Ord c => Set c -> [Symbol c t] -> Bool
-noCatsInSet cs = not . any (`catElem` cs)
diff --git a/src-3.0/GF/Speech/CFGToFA.hs b/src-3.0/GF/Speech/CFGToFA.hs
deleted file mode 100644
index 1ac4bd24e..000000000
--- a/src-3.0/GF/Speech/CFGToFA.hs
+++ /dev/null
@@ -1,244 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : GF.Speech.CFGToFA
---
--- Approximates CFGs with finite state networks.
-----------------------------------------------------------------------
-module GF.Speech.CFGToFA (cfgToFA, makeSimpleRegular,
- MFA(..), cfgToMFA, cfgToFA') where
-
-import Data.List
-import Data.Maybe
-import Data.Map (Map)
-import qualified Data.Map as Map
-import Data.Set (Set)
-import qualified Data.Set as Set
-
-import PGF.CId
-import PGF.Data
-import GF.Data.Utilities
-import GF.Speech.CFG
-import GF.Speech.PGFToCFG
-import GF.Infra.Ident (Ident)
-
-import GF.Speech.FiniteState
-import GF.Speech.Graph
-import GF.Speech.Relation
-import GF.Speech.CFG
-
-data Recursivity = RightR | LeftR | NotR
-
-data MutRecSet = MutRecSet {
- mrCats :: Set Cat,
- mrNonRecRules :: [CFRule],
- mrRecRules :: [CFRule],
- mrRec :: Recursivity
- }
-
-
-type MutRecSets = Map Cat MutRecSet
-
---
--- * Multiple DFA type
---
-
-data MFA = MFA Cat [(Cat,DFA CFSymbol)]
-
-
-
-cfgToFA :: CFG -> DFA Token
-cfgToFA = minimize . compileAutomaton . makeSimpleRegular
-
-
---
--- * Compile strongly regular grammars to NFAs
---
-
--- Convert a strongly regular grammar to a finite automaton.
-compileAutomaton :: CFG -> NFA Token
-compileAutomaton g = make_fa (g,ns) s [NonTerminal (cfgStartCat g)] f fa
- where
- (fa,s,f) = newFA_
- ns = mutRecSets g $ mutRecCats False g
-
--- | The make_fa algorithm from \"Regular approximation of CFLs: a grammatical view\",
--- Mark-Jan Nederhof, Advances in Probabilistic and other Parsing Technologies, 2000.
-make_fa :: (CFG,MutRecSets) -> State -> [CFSymbol] -> State
- -> NFA Token -> NFA Token
-make_fa c@(g,ns) q0 alpha q1 fa =
- case alpha of
- [] -> newTransition q0 q1 Nothing fa
- [Terminal t] -> newTransition q0 q1 (Just t) fa
- [NonTerminal a] ->
- case Map.lookup a ns of
- -- a is recursive
- Just n@(MutRecSet { mrCats = ni, mrNonRecRules = nrs, mrRecRules = rs} ) ->
- case mrRec n of
- -- the set Ni is right-recursive or cyclic
- RightR ->
- let new = [(getState c, xs, q1) | CFRule c xs _ <- nrs]
- ++ [(getState c, xs, getState d) | CFRule c ss _ <- rs,
- let (xs,NonTerminal d) = (init ss,last ss)]
- in make_fas new $ newTransition q0 (getState a) Nothing fa'
- -- the set Ni is left-recursive
- LeftR ->
- let new = [(q0, xs, getState c) | CFRule c xs _ <- nrs]
- ++ [(getState d, xs, getState c) | CFRule c (NonTerminal d:xs) _ <- rs]
- in make_fas new $ newTransition (getState a) q1 Nothing fa'
- where
- (fa',stateMap) = addStatesForCats ni fa
- getState x = Map.findWithDefault
- (error $ "CFGToFiniteState: No state for " ++ x)
- x stateMap
- -- a is not recursive
- Nothing -> let rs = catRules g a
- in foldl' (\f (CFRule _ b _) -> make_fa_ q0 b q1 f) fa rs
- (x:beta) -> let (fa',q) = newState () fa
- in make_fa_ q beta q1 $ make_fa_ q0 [x] q fa'
- where
- make_fa_ = make_fa c
- make_fas xs fa = foldl' (\f' (s1,xs,s2) -> make_fa_ s1 xs s2 f') fa xs
-
---
--- * Compile a strongly regular grammar to a DFA with sub-automata
---
-
-cfgToMFA :: CFG -> MFA
-cfgToMFA = buildMFA . makeSimpleRegular
-
--- | Build a DFA by building and expanding an MFA
-cfgToFA' :: CFG -> DFA Token
-cfgToFA' = mfaToDFA . cfgToMFA
-
-buildMFA :: CFG -> MFA
-buildMFA g = sortSubLats $ removeUnusedSubLats mfa
- where fas = compileAutomata g
- mfa = MFA (cfgStartCat g) [(c, minimize fa) | (c,fa) <- fas]
-
-mfaStartDFA :: MFA -> DFA CFSymbol
-mfaStartDFA (MFA start subs) =
- fromMaybe (error $ "Bad start MFA: " ++ start) $ lookup start subs
-
-mfaToDFA :: MFA -> DFA Token
-mfaToDFA mfa@(MFA _ subs) = minimize $ expand $ dfa2nfa $ mfaStartDFA mfa
- where
- subs' = Map.fromList [(c, dfa2nfa n) | (c,n) <- subs]
- getSub l = fromJust $ Map.lookup l subs'
- expand (FA (Graph c ns es) s f)
- = foldl' expandEdge (FA (Graph c ns []) s f) es
- expandEdge fa (f,t,x) =
- case x of
- Nothing -> newTransition f t Nothing fa
- Just (Terminal s) -> newTransition f t (Just s) fa
- Just (NonTerminal l) -> insertNFA fa (f,t) (expand $ getSub l)
-
-removeUnusedSubLats :: MFA -> MFA
-removeUnusedSubLats mfa@(MFA start subs) = MFA start [(c,s) | (c,s) <- subs, isUsed c]
- where
- usedMap = subLatUseMap mfa
- used = growUsedSet (Set.singleton start)
- isUsed c = c `Set.member` used
- growUsedSet = fix (\s -> foldl Set.union s $ mapMaybe (flip Map.lookup usedMap) $ Set.toList s)
-
-subLatUseMap :: MFA -> Map Cat (Set Cat)
-subLatUseMap (MFA _ subs) = Map.fromList [(c,usedSubLats n) | (c,n) <- subs]
-
-usedSubLats :: DFA CFSymbol -> Set Cat
-usedSubLats fa = Set.fromList [s | (_,_,NonTerminal s) <- transitions fa]
-
--- | Sort sub-networks topologically.
-sortSubLats :: MFA -> MFA
-sortSubLats mfa@(MFA main subs) = MFA main (reverse $ sortLats usedByMap subs)
- where
- usedByMap = revMultiMap (subLatUseMap mfa)
- sortLats _ [] = []
- sortLats ub ls = xs ++ sortLats ub' ys
- where (xs,ys) = partition ((==0) . indeg) ls
- ub' = Map.map (Set.\\ Set.fromList (map fst xs)) ub
- indeg (c,_) = maybe 0 Set.size $ Map.lookup c ub
-
--- | Convert a strongly regular grammar to a number of finite automata,
--- one for each non-terminal.
--- The edges in the automata accept tokens, or name another automaton to use.
-compileAutomata :: CFG
- -> [(Cat,NFA CFSymbol)]
- -- ^ A map of non-terminals and their automata.
-compileAutomata g = [(c, makeOneFA c) | c <- allCats g]
- where
- mrs = mutRecSets g $ mutRecCats True g
- makeOneFA c = make_fa1 mr s [NonTerminal c] f fa
- where (fa,s,f) = newFA_
- mr = fromJust (Map.lookup c mrs)
-
-
--- | The make_fa algorithm from \"Regular approximation of CFLs: a grammatical view\",
--- Mark-Jan Nederhof, Advances in Probabilistic and other Parsing Technologies, 2000,
--- adapted to build a finite automaton for a single (mutually recursive) set only.
--- Categories not in the set will result in category-labelled edges.
-make_fa1 :: MutRecSet -- ^ The set of (mutually recursive) categories for which
- -- we are building the automaton.
- -> State -- ^ State to come from
- -> [CFSymbol] -- ^ Symbols to accept
- -> State -- ^ State to end up in
- -> NFA CFSymbol -- ^ FA to add to.
- -> NFA CFSymbol
-make_fa1 mr q0 alpha q1 fa =
- case alpha of
- [] -> newTransition q0 q1 Nothing fa
- [t@(Terminal _)] -> newTransition q0 q1 (Just t) fa
- [c@(NonTerminal a)] | not (a `Set.member` mrCats mr) -> newTransition q0 q1 (Just c) fa
- [NonTerminal a] ->
- case mrRec mr of
- NotR -> -- the set is a non-recursive (always singleton) set of categories
- -- so the set of category rules is the set of rules for the whole set
- make_fas [(q0, b, q1) | CFRule _ b _ <- mrNonRecRules mr] fa
- RightR -> -- the set is right-recursive or cyclic
- let new = [(getState c, xs, q1) | CFRule c xs _ <- mrNonRecRules mr]
- ++ [(getState c, xs, getState d) | CFRule c ss _ <- mrRecRules mr,
- let (xs,NonTerminal d) = (init ss,last ss)]
- in make_fas new $ newTransition q0 (getState a) Nothing fa'
- LeftR -> -- the set is left-recursive
- let new = [(q0, xs, getState c) | CFRule c xs _ <- mrNonRecRules mr]
- ++ [(getState d, xs, getState c) | CFRule c (NonTerminal d:xs) _ <- mrRecRules mr]
- in make_fas new $ newTransition (getState a) q1 Nothing fa'
- where
- (fa',stateMap) = addStatesForCats (mrCats mr) fa
- getState x = Map.findWithDefault
- (error $ "CFGToFiniteState: No state for " ++ x)
- x stateMap
- (x:beta) -> let (fa',q) = newState () fa
- in make_fas [(q0,[x],q),(q,beta,q1)] fa'
- where
- make_fas xs fa = foldl' (\f' (s1,xs,s2) -> make_fa1 mr s1 xs s2 f') fa xs
-
-mutRecSets :: CFG -> [Set Cat] -> MutRecSets
-mutRecSets g = Map.fromList . concatMap mkMutRecSet
- where
- mkMutRecSet cs = [ (c,ms) | c <- csl ]
- where csl = Set.toList cs
- rs = catSetRules g cs
- (nrs,rrs) = partition (ruleIsNonRecursive cs) rs
- ms = MutRecSet {
- mrCats = cs,
- mrNonRecRules = nrs,
- mrRecRules = rrs,
- mrRec = rec
- }
- rec | null rrs = NotR
- | all (isRightLinear cs) rrs = RightR
- | otherwise = LeftR
-
---
--- * Utilities
---
-
--- | Add a state for the given NFA for each of the categories
--- in the given set. Returns a map of categories to their
--- corresponding states.
-addStatesForCats :: Set Cat -> NFA t -> (NFA t, Map Cat State)
-addStatesForCats cs fa = (fa', m)
- where (fa', ns) = newStates (replicate (Set.size cs) ()) fa
- m = Map.fromList (zip (Set.toList cs) (map fst ns))
-
-revMultiMap :: (Ord a, Ord b) => Map a (Set b) -> Map b (Set a)
-revMultiMap m = Map.fromListWith Set.union [ (y,Set.singleton x) | (x,s) <- Map.toList m, y <- Set.toList s]
diff --git a/src-3.0/GF/Speech/FiniteState.hs b/src-3.0/GF/Speech/FiniteState.hs
deleted file mode 100644
index c809eb544..000000000
--- a/src-3.0/GF/Speech/FiniteState.hs
+++ /dev/null
@@ -1,329 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : FiniteState
--- Maintainer : BB
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/11/10 16:43:44 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.16 $
---
--- A simple finite state network module.
------------------------------------------------------------------------------
-module GF.Speech.FiniteState (FA(..), State, NFA, DFA,
- startState, finalStates,
- states, transitions,
- isInternal,
- newFA, newFA_,
- addFinalState,
- newState, newStates,
- newTransition, newTransitions,
- insertTransitionWith, insertTransitionsWith,
- mapStates, mapTransitions,
- modifyTransitions,
- nonLoopTransitionsTo, nonLoopTransitionsFrom,
- loops,
- removeState,
- oneFinalState,
- insertNFA,
- onGraph,
- moveLabelsToNodes, removeTrivialEmptyNodes,
- minimize,
- dfa2nfa,
- unusedNames, renameStates,
- prFAGraphviz, faToGraphviz) where
-
-import Data.List
-import Data.Maybe
-import Data.Map (Map)
-import qualified Data.Map as Map
-import Data.Set (Set)
-import qualified Data.Set as Set
-
-import GF.Data.Utilities
-import GF.Speech.Graph
-import qualified GF.Speech.Graphviz as Dot
-
-type State = Int
-
--- | Type parameters: node id type, state label type, edge label type
--- Data constructor arguments: nodes and edges, start state, final states
-data FA n a b = FA !(Graph n a b) !n ![n]
-
-type NFA a = FA State () (Maybe a)
-
-type DFA a = FA State () a
-
-
-startState :: FA n a b -> n
-startState (FA _ s _) = s
-
-finalStates :: FA n a b -> [n]
-finalStates (FA _ _ ss) = ss
-
-states :: FA n a b -> [(n,a)]
-states (FA g _ _) = nodes g
-
-transitions :: FA n a b -> [(n,n,b)]
-transitions (FA g _ _) = edges g
-
-newFA :: Enum n => a -- ^ Start node label
- -> FA n a b
-newFA l = FA g s []
- where (g,s) = newNode l (newGraph [toEnum 0..])
-
--- | Create a new finite automaton with an initial and a final state.
-newFA_ :: Enum n => (FA n () b, n, n)
-newFA_ = (fa'', s, f)
- where fa = newFA ()
- s = startState fa
- (fa',f) = newState () fa
- fa'' = addFinalState f fa'
-
-addFinalState :: n -> FA n a b -> FA n a b
-addFinalState f (FA g s ss) = FA g s (f:ss)
-
-newState :: a -> FA n a b -> (FA n a b, n)
-newState x (FA g s ss) = (FA g' s ss, n)
- where (g',n) = newNode x g
-
-newStates :: [a] -> FA n a b -> (FA n a b, [(n,a)])
-newStates xs (FA g s ss) = (FA g' s ss, ns)
- where (g',ns) = newNodes xs g
-
-newTransition :: n -> n -> b -> FA n a b -> FA n a b
-newTransition f t l = onGraph (newEdge (f,t,l))
-
-newTransitions :: [(n, n, b)] -> FA n a b -> FA n a b
-newTransitions es = onGraph (newEdges es)
-
-insertTransitionWith :: Eq n =>
- (b -> b -> b) -> (n, n, b) -> FA n a b -> FA n a b
-insertTransitionWith f t = onGraph (insertEdgeWith f t)
-
-insertTransitionsWith :: Eq n =>
- (b -> b -> b) -> [(n, n, b)] -> FA n a b -> FA n a b
-insertTransitionsWith f ts fa =
- foldl' (flip (insertTransitionWith f)) fa ts
-
-mapStates :: (a -> c) -> FA n a b -> FA n c b
-mapStates f = onGraph (nmap f)
-
-mapTransitions :: (b -> c) -> FA n a b -> FA n a c
-mapTransitions f = onGraph (emap f)
-
-modifyTransitions :: ([(n,n,b)] -> [(n,n,b)]) -> FA n a b -> FA n a b
-modifyTransitions f = onGraph (\ (Graph r ns es) -> Graph r ns (f es))
-
-removeState :: Ord n => n -> FA n a b -> FA n a b
-removeState n = onGraph (removeNode n)
-
-minimize :: Ord a => NFA a -> DFA a
-minimize = determinize . reverseNFA . dfa2nfa . determinize . reverseNFA
-
-unusedNames :: FA n a b -> [n]
-unusedNames (FA (Graph names _ _) _ _) = names
-
--- | Gets all incoming transitions to a given state, excluding
--- transtions from the state itself.
-nonLoopTransitionsTo :: Eq n => n -> FA n a b -> [(n,b)]
-nonLoopTransitionsTo s fa =
- [(f,l) | (f,t,l) <- transitions fa, t == s && f /= s]
-
-nonLoopTransitionsFrom :: Eq n => n -> FA n a b -> [(n,b)]
-nonLoopTransitionsFrom s fa =
- [(t,l) | (f,t,l) <- transitions fa, f == s && t /= s]
-
-loops :: Eq n => n -> FA n a b -> [b]
-loops s fa = [l | (f,t,l) <- transitions fa, f == s && t == s]
-
--- | Give new names to all nodes.
-renameStates :: Ord x => [y] -- ^ Infinite supply of new names
- -> FA x a b
- -> FA y a b
-renameStates supply (FA g s fs) = FA (renameNodes newName rest g) s' fs'
- where (ns,rest) = splitAt (length (nodes g)) supply
- newNodes = Map.fromList (zip (map fst (nodes g)) ns)
- newName n = Map.findWithDefault (error "FiniteState.newName") n newNodes
- s' = newName s
- fs' = map newName fs
-
--- | Insert an NFA into another
-insertNFA :: NFA a -- ^ NFA to insert into
- -> (State, State) -- ^ States to insert between
- -> NFA a -- ^ NFA to insert.
- -> NFA a
-insertNFA (FA g1 s1 fs1) (f,t) (FA g2 s2 fs2)
- = FA (newEdges es g') s1 fs1
- where
- es = (f,ren s2,Nothing):[(ren f2,t,Nothing) | f2 <- fs2]
- (g',ren) = mergeGraphs g1 g2
-
-onGraph :: (Graph n a b -> Graph n c d) -> FA n a b -> FA n c d
-onGraph f (FA g s ss) = FA (f g) s ss
-
-
--- | Make the finite automaton have a single final state
--- by adding a new final state and adding an edge
--- from the old final states to the new state.
-oneFinalState :: a -- ^ Label to give the new node
- -> b -- ^ Label to give the new edges
- -> FA n a b -- ^ The old network
- -> FA n a b -- ^ The new network
-oneFinalState nl el fa =
- let (FA g s fs,nf) = newState nl fa
- es = [ (f,nf,el) | f <- fs ]
- in FA (newEdges es g) s [nf]
-
--- | Transform a standard finite automaton with labelled edges
--- to one where the labels are on the nodes instead. This can add
--- up to one extra node per edge.
-moveLabelsToNodes :: (Ord n,Eq a) => FA n () (Maybe a) -> FA n (Maybe a) ()
-moveLabelsToNodes = onGraph f
- where f g@(Graph c _ _) = Graph c' ns (concat ess)
- where is = [ ((n,l),inc) | (n, (l,inc,_)) <- Map.toList (nodeInfo g)]
- (c',is') = mapAccumL fixIncoming c is
- (ns,ess) = unzip (concat is')
-
-
--- | Remove empty nodes which are not start or final, and have
--- exactly one outgoing edge or exactly one incoming edge.
-removeTrivialEmptyNodes :: (Eq a, Ord n) => FA n (Maybe a) () -> FA n (Maybe a) ()
-removeTrivialEmptyNodes = pruneUnusable . skipSimpleEmptyNodes
-
--- | Move edges to empty nodes to point to the next node(s).
--- This is not done if the pointed-to node is a final node.
-skipSimpleEmptyNodes :: (Eq a, Ord n) => FA n (Maybe a) () -> FA n (Maybe a) ()
-skipSimpleEmptyNodes fa = onGraph og fa
- where
- og g@(Graph c ns es) = if es' == es then g else og (Graph c ns es')
- where
- es' = concatMap changeEdge es
- info = nodeInfo g
- changeEdge e@(f,t,())
- | isNothing (getNodeLabel info t)
- -- && (i * o <= i + o)
- && not (isFinal fa t)
- = [ (f,t',()) | (_,t',()) <- getOutgoing info t]
- | otherwise = [e]
--- where i = inDegree info t
--- o = outDegree info t
-
-isInternal :: Eq n => FA n a b -> n -> Bool
-isInternal (FA _ start final) n = n /= start && n `notElem` final
-
-isFinal :: Eq n => FA n a b -> n -> Bool
-isFinal (FA _ _ final) n = n `elem` final
-
--- | Remove all internal nodes with no incoming edges
--- or no outgoing edges.
-pruneUnusable :: Ord n => FA n (Maybe a) () -> FA n (Maybe a) ()
-pruneUnusable fa = onGraph f fa
- where
- f g = if Set.null rns then g else f (removeNodes rns g)
- where info = nodeInfo g
- rns = Set.fromList [ n | (n,_) <- nodes g,
- isInternal fa n,
- inDegree info n == 0
- || outDegree info n == 0]
-
-fixIncoming :: (Ord n, Eq a) => [n]
- -> (Node n (),[Edge n (Maybe a)]) -- ^ A node and its incoming edges
- -> ([n],[(Node n (Maybe a),[Edge n ()])]) -- ^ Replacement nodes with their
- -- incoming edges.
-fixIncoming cs c@((n,()),es) = (cs'', ((n,Nothing),es'):newContexts)
- where ls = nub $ map edgeLabel es
- (cs',cs'') = splitAt (length ls) cs
- newNodes = zip cs' ls
- es' = [ (x,n,()) | x <- map fst newNodes ]
- -- separate cyclic and non-cyclic edges
- (cyc,ncyc) = partition (\ (f,_,_) -> f == n) es
- -- keep all incoming non-cyclic edges with the right label
- to (x,l) = [ (f,x,()) | (f,_,l') <- ncyc, l == l']
- -- for each cyclic edge with the right label,
- -- add an edge from each of the new nodes (including this one)
- ++ [ (y,x,()) | (f,_,l') <- cyc, l == l', (y,_) <- newNodes]
- newContexts = [ (v, to v) | v <- newNodes ]
-
-alphabet :: Eq b => Graph n a (Maybe b) -> [b]
-alphabet = nub . catMaybes . map edgeLabel . edges
-
-determinize :: Ord a => NFA a -> DFA a
-determinize (FA g s f) = let (ns,es) = h (Set.singleton start) Set.empty Set.empty
- (ns',es') = (Set.toList ns, Set.toList es)
- final = filter isDFAFinal ns'
- fa = FA (Graph undefined [(n,()) | n <- ns'] es') start final
- in renameStates [0..] fa
- where info = nodeInfo g
--- reach = nodesReachable out
- start = closure info $ Set.singleton s
- isDFAFinal n = not (Set.null (Set.fromList f `Set.intersection` n))
- h currentStates oldStates es
- | Set.null currentStates = (oldStates,es)
- | otherwise = ((h $! uniqueNewStates) $! allOldStates) $! es'
- where
- allOldStates = oldStates `Set.union` currentStates
- (newStates,es') = new (Set.toList currentStates) Set.empty es
- uniqueNewStates = newStates Set.\\ allOldStates
- -- Get the sets of states reachable from the given states
- -- by consuming one symbol, and the associated edges.
- new [] rs es = (rs,es)
- new (n:ns) rs es = new ns rs' es'
- where cs = reachable info n --reachable reach n
- rs' = rs `Set.union` Set.fromList (map snd cs)
- es' = es `Set.union` Set.fromList [(n,s,c) | (c,s) <- cs]
-
-
--- | Get all the nodes reachable from a list of nodes by only empty edges.
-closure :: Ord n => NodeInfo n a (Maybe b) -> Set n -> Set n
-closure info x = closure_ x x
- where closure_ acc check | Set.null check = acc
- | otherwise = closure_ acc' check'
- where
- reach = Set.fromList [y | x <- Set.toList check,
- (_,y,Nothing) <- getOutgoing info x]
- acc' = acc `Set.union` reach
- check' = reach Set.\\ acc
-
--- | Get a map of labels to sets of all nodes reachable
--- from a the set of nodes by one edge with the given
--- label and then any number of empty edges.
-reachable :: (Ord n,Ord b) => NodeInfo n a (Maybe b) -> Set n -> [(b,Set n)]
-reachable info ns = Map.toList $ Map.map (closure info . Set.fromList) $ reachable1 info ns
-reachable1 info ns = Map.fromListWith (++) [(c, [y]) | n <- Set.toList ns, (_,y,Just c) <- getOutgoing info n]
-
-reverseNFA :: NFA a -> NFA a
-reverseNFA (FA g s fs) = FA g''' s' [s]
- where g' = reverseGraph g
- (g'',s') = newNode () g'
- g''' = newEdges [(s',f,Nothing) | f <- fs] g''
-
-dfa2nfa :: DFA a -> NFA a
-dfa2nfa = mapTransitions Just
-
---
--- * Visualization
---
-
-prFAGraphviz :: (Eq n,Show n) => FA n String String -> String
-prFAGraphviz = Dot.prGraphviz . faToGraphviz
-
-prFAGraphviz_ :: (Eq n,Show n,Show a, Show b) => FA n a b -> String
-prFAGraphviz_ = Dot.prGraphviz . faToGraphviz . mapStates show . mapTransitions show
-
-faToGraphviz :: (Eq n,Show n) => FA n String String -> Dot.Graph
-faToGraphviz (FA (Graph _ ns es) s f)
- = Dot.Graph Dot.Directed Nothing [] (map mkNode ns) (map mkEdge es) []
- where mkNode (n,l) = Dot.Node (show n) attrs
- where attrs = [("label",l)]
- ++ if n == s then [("shape","box")] else []
- ++ if n `elem` f then [("style","bold")] else []
- mkEdge (x,y,l) = Dot.Edge (show x) (show y) [("label",l)]
-
---
--- * Utilities
---
-
-lookups :: Ord k => [k] -> Map k a -> [a]
-lookups xs m = mapMaybe (flip Map.lookup m) xs
diff --git a/src-3.0/GF/Speech/GSL.hs b/src-3.0/GF/Speech/GSL.hs
deleted file mode 100644
index 637552bf4..000000000
--- a/src-3.0/GF/Speech/GSL.hs
+++ /dev/null
@@ -1,94 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : GF.Speech.GSL
---
--- This module prints a CFG as a Nuance GSL 2.0 grammar.
---
------------------------------------------------------------------------------
-
-module GF.Speech.GSL (gslPrinter) where
-
-import GF.Data.Utilities
-import GF.Speech.CFG
-import GF.Speech.SRG
-import GF.Speech.RegExp
-import GF.Infra.Ident
-import PGF.CId
-import PGF.Data
-
-import Data.Char (toUpper,toLower)
-import Data.List (partition)
-import Text.PrettyPrint.HughesPJ
-
-width :: Int
-width = 75
-
-gslPrinter :: PGF -> CId -> String
-gslPrinter pgf cnc = renderStyle st $ prGSL $ makeSimpleSRG pgf cnc
- where st = style { lineLength = width }
-
-prGSL :: SRG -> Doc
-prGSL srg = header $++$ mainCat $++$ foldr ($++$) empty (map prRule (srgRules srg))
- where
- header = text ";GSL2.0" $$
- comment ("Nuance speech recognition grammar for " ++ srgName srg) $$
- comment ("Generated by GF")
- mainCat = text ".MAIN" <+> prCat (srgStartCat srg)
- prRule (SRGRule cat rhs) = prCat cat <+> union (map prAlt rhs)
- -- FIXME: use the probability
- prAlt (SRGAlt mp _ rhs) = prItem rhs
-
-
-prItem :: SRGItem -> Doc
-prItem = f
- where
- f (REUnion xs) = (if null es then empty else text "?") <> union (map f nes)
- where (es,nes) = partition isEpsilon xs
- f (REConcat [x]) = f x
- f (REConcat xs) = text "(" <> fsep (map f xs) <> text ")"
- f (RERepeat x) = text "*" <> f x
- f (RESymbol s) = prSymbol s
-
-union :: [Doc] -> Doc
-union [x] = x
-union xs = text "[" <> fsep xs <> text "]"
-
-prSymbol :: Symbol SRGNT Token -> Doc
-prSymbol = symbol (prCat . fst) (doubleQuotes . showToken)
-
--- GSL requires an upper case letter in category names
-prCat :: Cat -> Doc
-prCat = text . firstToUpper
-
-
-firstToUpper :: String -> String
-firstToUpper [] = []
-firstToUpper (x:xs) = toUpper x : xs
-
-{-
-rmPunctCFG :: CGrammar -> CGrammar
-rmPunctCFG g = [CFRule c (filter keepSymbol ss) n | CFRule c ss n <- g]
-
-keepSymbol :: Symbol c Token -> Bool
-keepSymbol (Tok t) = not (all isPunct (prt t))
-keepSymbol _ = True
--}
-
--- Nuance does not like upper case characters in tokens
-showToken :: Token -> Doc
-showToken = text . map toLower
-
-isPunct :: Char -> Bool
-isPunct c = c `elem` "-_.:;.,?!()[]{}"
-
-comment :: String -> Doc
-comment s = text ";" <+> text s
-
-
--- Pretty-printing utilities
-
-emptyLine :: Doc
-emptyLine = text ""
-
-($++$) :: Doc -> Doc -> Doc
-x $++$ y = x $$ emptyLine $$ y
diff --git a/src-3.0/GF/Speech/Graph.hs b/src-3.0/GF/Speech/Graph.hs
deleted file mode 100644
index 1a0ebe0c0..000000000
--- a/src-3.0/GF/Speech/Graph.hs
+++ /dev/null
@@ -1,178 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : Graph
--- Maintainer : BB
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/11/10 16:43:44 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.2 $
---
--- A simple graph module.
------------------------------------------------------------------------------
-module GF.Speech.Graph ( Graph(..), Node, Edge, NodeInfo
- , newGraph, nodes, edges
- , nmap, emap, newNode, newNodes, newEdge, newEdges
- , insertEdgeWith
- , removeNode, removeNodes
- , nodeInfo
- , getIncoming, getOutgoing, getNodeLabel
- , inDegree, outDegree
- , nodeLabel
- , edgeFrom, edgeTo, edgeLabel
- , reverseGraph, mergeGraphs, renameNodes
- ) where
-
-import GF.Data.Utilities
-
-import Data.List
-import Data.Maybe
-import Data.Map (Map)
-import qualified Data.Map as Map
-import Data.Set (Set)
-import qualified Data.Set as Set
-
-data Graph n a b = Graph [n] ![Node n a] ![Edge n b]
- deriving (Eq,Show)
-
-type Node n a = (n,a)
-type Edge n b = (n,n,b)
-
-type NodeInfo n a b = Map n (a, [Edge n b], [Edge n b])
-
--- | Create a new empty graph.
-newGraph :: [n] -> Graph n a b
-newGraph ns = Graph ns [] []
-
--- | Get all the nodes in the graph.
-nodes :: Graph n a b -> [Node n a]
-nodes (Graph _ ns _) = ns
-
--- | Get all the edges in the graph.
-edges :: Graph n a b -> [Edge n b]
-edges (Graph _ _ es) = es
-
--- | Map a function over the node labels.
-nmap :: (a -> c) -> Graph n a b -> Graph n c b
-nmap f (Graph c ns es) = Graph c [(n,f l) | (n,l) <- ns] es
-
--- | Map a function over the edge labels.
-emap :: (b -> c) -> Graph n a b -> Graph n a c
-emap f (Graph c ns es) = Graph c ns [(x,y,f l) | (x,y,l) <- es]
-
--- | Add a node to the graph.
-newNode :: a -- ^ Node label
- -> Graph n a b
- -> (Graph n a b,n) -- ^ Node graph and name of new node
-newNode l (Graph (c:cs) ns es) = (Graph cs ((c,l):ns) es, c)
-
-newNodes :: [a] -> Graph n a b -> (Graph n a b,[Node n a])
-newNodes ls g = (g', zip ns ls)
- where (g',ns) = mapAccumL (flip newNode) g ls
--- lazy version:
---newNodes ls (Graph cs ns es) = (Graph cs' (ns'++ns) es, ns')
--- where (xs,cs') = splitAt (length ls) cs
--- ns' = zip xs ls
-
-newEdge :: Edge n b -> Graph n a b -> Graph n a b
-newEdge e (Graph c ns es) = Graph c ns (e:es)
-
-newEdges :: [Edge n b] -> Graph n a b -> Graph n a b
-newEdges es g = foldl' (flip newEdge) g es
--- lazy version:
--- newEdges es' (Graph c ns es) = Graph c ns (es'++es)
-
-insertEdgeWith :: Eq n =>
- (b -> b -> b) -> Edge n b -> Graph n a b -> Graph n a b
-insertEdgeWith f e@(x,y,l) (Graph c ns es) = Graph c ns (h es)
- where h [] = [e]
- h (e'@(x',y',l'):es') | x' == x && y' == y = (x',y', f l l'):es'
- | otherwise = e':h es'
-
--- | Remove a node and all edges to and from that node.
-removeNode :: Ord n => n -> Graph n a b -> Graph n a b
-removeNode n = removeNodes (Set.singleton n)
-
--- | Remove a set of nodes and all edges to and from those nodes.
-removeNodes :: Ord n => Set n -> Graph n a b -> Graph n a b
-removeNodes xs (Graph c ns es) = Graph c ns' es'
- where
- keepNode n = not (Set.member n xs)
- ns' = [ x | x@(n,_) <- ns, keepNode n ]
- es' = [ e | e@(f,t,_) <- es, keepNode f && keepNode t ]
-
--- | Get a map of node names to info about each node.
-nodeInfo :: Ord n => Graph n a b -> NodeInfo n a b
-nodeInfo g = Map.fromList [ (n, (x, fn inc n, fn out n)) | (n,x) <- nodes g ]
- where
- inc = groupEdgesBy edgeTo g
- out = groupEdgesBy edgeFrom g
- fn m n = fromMaybe [] (Map.lookup n m)
-
-groupEdgesBy :: (Ord n) => (Edge n b -> n) -- ^ Gets the node to group by
- -> Graph n a b -> Map n [Edge n b]
-groupEdgesBy f g = Map.fromListWith (++) [(f e, [e]) | e <- edges g]
-
-lookupNode :: Ord n => NodeInfo n a b -> n -> (a, [Edge n b], [Edge n b])
-lookupNode i n = fromJust $ Map.lookup n i
-
-getIncoming :: Ord n => NodeInfo n a b -> n -> [Edge n b]
-getIncoming i n = let (_,inc,_) = lookupNode i n in inc
-
-getOutgoing :: Ord n => NodeInfo n a b -> n -> [Edge n b]
-getOutgoing i n = let (_,_,out) = lookupNode i n in out
-
-inDegree :: Ord n => NodeInfo n a b -> n -> Int
-inDegree i n = length $ getIncoming i n
-
-outDegree :: Ord n => NodeInfo n a b -> n -> Int
-outDegree i n = length $ getOutgoing i n
-
-getNodeLabel :: Ord n => NodeInfo n a b -> n -> a
-getNodeLabel i n = let (l,_,_) = lookupNode i n in l
-
-nodeLabel :: Node n a -> a
-nodeLabel = snd
-
-edgeFrom :: Edge n b -> n
-edgeFrom (f,_,_) = f
-
-edgeTo :: Edge n b -> n
-edgeTo (_,t,_) = t
-
-edgeLabel :: Edge n b -> b
-edgeLabel (_,_,l) = l
-
-reverseGraph :: Graph n a b -> Graph n a b
-reverseGraph (Graph c ns es) = Graph c ns [ (t,f,l) | (f,t,l) <- es ]
-
--- | Add the nodes from the second graph to the first graph.
--- The nodes in the second graph will be renamed using the name
--- supply in the first graph.
--- This function is more efficient when the second graph
--- is smaller than the first.
-mergeGraphs :: Ord m => Graph n a b -> Graph m a b
- -> (Graph n a b, m -> n) -- ^ The new graph and a function translating
- -- the old names of nodes in the second graph
- -- to names in the new graph.
-mergeGraphs (Graph c ns1 es1) g2 = (Graph c' (ns2++ns1) (es2++es1), newName)
- where
- (xs,c') = splitAt (length (nodes g2)) c
- newNames = Map.fromList (zip (map fst (nodes g2)) xs)
- newName n = fromJust $ Map.lookup n newNames
- Graph _ ns2 es2 = renameNodes newName undefined g2
-
--- | Rename the nodes in the graph.
-renameNodes :: (n -> m) -- ^ renaming function
- -> [m] -- ^ infinite supply of fresh node names, to
- -- use when adding nodes in the future.
- -> Graph n a b -> Graph m a b
-renameNodes newName c (Graph _ ns es) = Graph c ns' es'
- where ns' = map' (\ (n,x) -> (newName n,x)) ns
- es' = map' (\ (f,t,l) -> (newName f, newName t, l)) es
-
--- | A strict 'map'
-map' :: (a -> b) -> [a] -> [b]
-map' _ [] = []
-map' f (x:xs) = ((:) $! f x) $! map' f xs
diff --git a/src-3.0/GF/Speech/Graphviz.hs b/src-3.0/GF/Speech/Graphviz.hs
deleted file mode 100644
index 1851fcb64..000000000
--- a/src-3.0/GF/Speech/Graphviz.hs
+++ /dev/null
@@ -1,116 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : Graphviz
--- Maintainer : BB
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/09/15 18:10:44 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.2 $
---
--- Graphviz DOT format representation and printing.
------------------------------------------------------------------------------
-
-module GF.Speech.Graphviz (
- Graph(..), GraphType(..),
- Node(..), Edge(..),
- Attr,
- addSubGraphs,
- setName,
- setAttr,
- prGraphviz
- ) where
-
-import Data.Char
-
-import GF.Data.Utilities
-
--- | Graph type, graph ID, graph attirbutes, graph nodes, graph edges, subgraphs
-data Graph = Graph {
- gType :: GraphType,
- gId :: Maybe String,
- gAttrs :: [Attr],
- gNodes :: [Node],
- gEdges :: [Edge],
- gSubgraphs :: [Graph]
- }
- deriving (Show)
-
-data GraphType = Directed | Undirected
- deriving (Show)
-
-data Node = Node String [Attr]
- deriving Show
-
-data Edge = Edge String String [Attr]
- deriving Show
-
-type Attr = (String,String)
-
---
--- * Graph construction
---
-
-addSubGraphs :: [Graph] -> Graph -> Graph
-addSubGraphs gs g = g { gSubgraphs = gs ++ gSubgraphs g }
-
-setName :: String -> Graph -> Graph
-setName n g = g { gId = Just n }
-
-setAttr :: String -> String -> Graph -> Graph
-setAttr n v g = g { gAttrs = tableSet n v (gAttrs g) }
-
---
--- * Pretty-printing
---
-
-prGraphviz :: Graph -> String
-prGraphviz g@(Graph t i _ _ _ _) =
- graphtype t ++ " " ++ maybe "" esc i ++ " {\n" ++ prGraph g ++ "}\n"
-
-prSubGraph :: Graph -> String
-prSubGraph g@(Graph _ i _ _ _ _) =
- "subgraph" ++ " " ++ maybe "" esc i ++ " {\n" ++ prGraph g ++ "}"
-
-prGraph :: Graph -> String
-prGraph (Graph t id at ns es ss) =
- unlines $ map (++";") (map prAttr at
- ++ map prNode ns
- ++ map (prEdge t) es
- ++ map prSubGraph ss)
-
-graphtype :: GraphType -> String
-graphtype Directed = "digraph"
-graphtype Undirected = "graph"
-
-prNode :: Node -> String
-prNode (Node n at) = esc n ++ " " ++ prAttrList at
-
-prEdge :: GraphType -> Edge -> String
-prEdge t (Edge x y at) = esc x ++ " " ++ edgeop t ++ " " ++ esc y ++ " " ++ prAttrList at
-
-edgeop :: GraphType -> String
-edgeop Directed = "->"
-edgeop Undirected = "--"
-
-prAttrList :: [Attr] -> String
-prAttrList [] = ""
-prAttrList at = "[" ++ join "," (map prAttr at) ++ "]"
-
-prAttr :: Attr -> String
-prAttr (n,v) = esc n ++ " = " ++ esc v
-
-esc :: String -> String
-esc s | needEsc s = "\"" ++ concat [ if shouldEsc c then ['\\',c] else [c] | c <- s ] ++ "\""
- | otherwise = s
- where shouldEsc = (`elem` ['"', '\\'])
-
-needEsc :: String -> Bool
-needEsc [] = True
-needEsc xs | all isDigit xs = False
-needEsc (x:xs) = not (isIDFirst x && all isIDChar xs)
-
-isIDFirst, isIDChar :: Char -> Bool
-isIDFirst c = c `elem` (['_']++['a'..'z']++['A'..'Z'])
-isIDChar c = isIDFirst c || isDigit c
diff --git a/src-3.0/GF/Speech/JSGF.hs b/src-3.0/GF/Speech/JSGF.hs
deleted file mode 100644
index dc9f4170a..000000000
--- a/src-3.0/GF/Speech/JSGF.hs
+++ /dev/null
@@ -1,111 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : GF.Speech.JSGF
---
--- This module prints a CFG as a JSGF grammar.
---
--- FIXME: remove \/ warn \/ fail if there are int \/ string literal
--- categories in the grammar
---
--- FIXME: convert to UTF-8
------------------------------------------------------------------------------
-
-module GF.Speech.JSGF (jsgfPrinter) where
-
-import GF.Data.Utilities
-import GF.Speech.CFG
-import GF.Speech.RegExp
-import GF.Speech.SISR
-import GF.Speech.SRG
-import PGF.CId
-import PGF.Data
-
-import Data.Char
-import Data.List
-import Data.Maybe
-import Text.PrettyPrint.HughesPJ
-import Debug.Trace
-
-width :: Int
-width = 75
-
-jsgfPrinter :: Maybe SISRFormat
- -> PGF
- -> CId -> String
-jsgfPrinter sisr pgf cnc = renderStyle st $ prJSGF sisr $ makeSimpleSRG pgf cnc
- where st = style { lineLength = width }
-
-prJSGF :: Maybe SISRFormat -> SRG -> Doc
-prJSGF sisr srg
- = header $++$ mainCat $++$ foldr ($++$) empty (map prRule (srgRules srg))
- where
- header = text "#JSGF" <+> text "V1.0" <+> text "UTF-8" <+> lang <> char ';' $$
- comment ("JSGF speech recognition grammar for " ++ srgName srg) $$
- comment "Generated by GF" $$
- text ("grammar " ++ srgName srg ++ ";")
- lang = maybe empty text (srgLanguage srg)
- mainCat = rule True "MAIN" [prCat (srgStartCat srg)]
- prRule (SRGRule cat rhs) = rule (isExternalCat srg cat) cat (map prAlt rhs)
- prAlt (SRGAlt mp n rhs) = sep [initTag, p (prItem sisr n rhs), finalTag]
- where initTag | isEmpty t = empty
- | otherwise = text "<NULL>" <+> t
- where t = tag sisr (profileInitSISR n)
- finalTag = tag sisr (profileFinalSISR n)
- p = if isEmpty initTag && isEmpty finalTag then id else parens
-
-prCat :: Cat -> Doc
-prCat c = char '<' <> text c <> char '>'
-
-prItem :: Maybe SISRFormat -> CFTerm -> SRGItem -> Doc
-prItem sisr t = f 0
- where
- f _ (REUnion []) = text "<VOID>"
- f p (REUnion xs)
- | not (null es) = brackets (f 0 (REUnion nes))
- | otherwise = (if p >= 1 then parens else id) (alts (map (f 1) xs))
- where (es,nes) = partition isEpsilon xs
- f _ (REConcat []) = text "<NULL>"
- f p (REConcat xs) = (if p >= 3 then parens else id) (fsep (map (f 2) xs))
- f p (RERepeat x) = f 3 x <> char '*'
- f _ (RESymbol s) = prSymbol sisr t s
-
-prSymbol :: Maybe SISRFormat -> CFTerm -> SRGSymbol -> Doc
-prSymbol sisr cn (NonTerminal n@(c,_)) = prCat c <+> tag sisr (catSISR cn n)
-prSymbol _ cn (Terminal t) | all isPunct t = empty -- removes punctuation
- | otherwise = text t -- FIXME: quote if there is whitespace or odd chars
-
-tag :: Maybe SISRFormat -> (SISRFormat -> SISRTag) -> Doc
-tag Nothing _ = empty
-tag (Just fmt) t = case t fmt of
- [] -> empty
- ts -> char '{' <+> (text (e $ prSISR ts)) <+> char '}'
- where e [] = []
- e ('}':xs) = '\\':'}':e xs
- e ('\n':xs) = ' ' : e (dropWhile isSpace xs)
- e (x:xs) = x:e xs
-
-isPunct :: Char -> Bool
-isPunct c = c `elem` "-_.;.,?!"
-
-comment :: String -> Doc
-comment s = text "//" <+> text s
-
-alts :: [Doc] -> Doc
-alts = fsep . prepunctuate (text "| ")
-
-rule :: Bool -> Cat -> [Doc] -> Doc
-rule pub c xs = p <+> prCat c <+> char '=' <+> nest 2 (alts xs) <+> char ';'
- where p = if pub then text "public" else empty
-
--- Pretty-printing utilities
-
-emptyLine :: Doc
-emptyLine = text ""
-
-prepunctuate :: Doc -> [Doc] -> [Doc]
-prepunctuate _ [] = []
-prepunctuate p (x:xs) = x : map (p <>) xs
-
-($++$) :: Doc -> Doc -> Doc
-x $++$ y = x $$ emptyLine $$ y
-
diff --git a/src-3.0/GF/Speech/PGFToCFG.hs b/src-3.0/GF/Speech/PGFToCFG.hs
deleted file mode 100644
index 1f3ebaeb4..000000000
--- a/src-3.0/GF/Speech/PGFToCFG.hs
+++ /dev/null
@@ -1,84 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : GF.Speech.PGFToCFG
---
--- Approximates PGF grammars with context-free grammars.
-----------------------------------------------------------------------
-module GF.Speech.PGFToCFG (bnfPrinter, pgfToCFG) where
-
-import PGF.CId
-import PGF.Data as PGF
-import PGF.Macros
-import GF.Infra.Ident
-import GF.Speech.CFG
-
-import Data.Array as Array
-import Data.Map (Map)
-import qualified Data.Map as Map
-import Data.Maybe
-import Data.Set (Set)
-import qualified Data.Set as Set
-
-bnfPrinter :: PGF -> CId -> String
-bnfPrinter pgf cnc = prCFG $ pgfToCFG pgf cnc
-
-pgfToCFG :: PGF
- -> CId -- ^ Concrete syntax name
- -> CFG
-pgfToCFG pgf lang = mkCFG (lookStartCat pgf) extCats (startRules ++ concatMap fruleToCFRule rules)
- where
- pinfo = fromMaybe (error "pgfToCFG: No parser.") (lookParser pgf lang)
-
- rules :: [FRule]
- rules = Array.elems (PGF.allRules pinfo)
-
- fcatGFCats :: Map FCat CId
- fcatGFCats = Map.fromList [(fc,c) | (c,fcs) <- Map.toList (startupCats pinfo), fc <- fcs]
-
- fcatGFCat :: FCat -> CId
- fcatGFCat c = fromMaybe (mkCId "Unknown") (Map.lookup c fcatGFCats)
-
- fcatToCat :: FCat -> FIndex -> Cat
- fcatToCat c l = prCId (fcatGFCat c) ++ "_" ++ show c ++ "_" ++ show l
-
- extCats :: Set Cat
- extCats = Set.fromList $ map lhsCat startRules
-
- -- NOTE: this is only correct for cats that have a lincat with exactly one row.
- startRules :: [CFRule]
- startRules = [CFRule (prCId c) [NonTerminal (fcatToCat fc 0)] (CFRes 0)
- | (c,fcs) <- Map.toList (startupCats pinfo),
- fc <- fcs, not (isLiteralFCat fc)]
-
- fruleToCFRule :: FRule -> [CFRule]
- fruleToCFRule (FRule f ps args c rhs) =
- [CFRule (fcatToCat c l) (mkRhs row) (profilesToTerm (map (fixProfile row) ps))
- | (l,row) <- Array.assocs rhs, not (containsLiterals row)]
- where
- mkRhs :: Array FPointPos FSymbol -> [CFSymbol]
- mkRhs = map fsymbolToSymbol . Array.elems
-
- containsLiterals :: Array FPointPos FSymbol -> Bool
- containsLiterals row = any isLiteralFCat [args!!n | FSymCat _ n <- Array.elems row]
-
- fsymbolToSymbol :: FSymbol -> CFSymbol
- fsymbolToSymbol (FSymCat l n) = NonTerminal (fcatToCat (args!!n) l)
- fsymbolToSymbol (FSymTok t) = Terminal t
-
- fixProfile :: Array FPointPos FSymbol -> Profile -> Profile
- fixProfile row = concatMap positions
- where
- nts = zip [0..] [nt | nt@(FSymCat _ _) <- Array.elems row ]
- positions i = [k | (k,FSymCat _ j) <- nts, j == i]
-
- profilesToTerm :: [Profile] -> CFTerm
- profilesToTerm [[n]] | f == wildCId = CFRes n
- profilesToTerm ps = CFObj f (zipWith profileToTerm argTypes ps)
- where (argTypes,_) = catSkeleton $ lookType pgf f
-
- profileToTerm :: CId -> Profile -> CFTerm
- profileToTerm t [] = CFMeta t
- profileToTerm _ xs = CFRes (last xs) -- FIXME: unify
-
-isLiteralFCat :: FCat -> Bool
-isLiteralFCat = (`elem` [fcatString, fcatInt, fcatFloat, fcatVar])
diff --git a/src-3.0/GF/Speech/PrRegExp.hs b/src-3.0/GF/Speech/PrRegExp.hs
deleted file mode 100644
index ae450dee8..000000000
--- a/src-3.0/GF/Speech/PrRegExp.hs
+++ /dev/null
@@ -1,27 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : GF.Speech.PrRegExp
---
--- This module prints a grammar as a regular expression.
------------------------------------------------------------------------------
-
-module GF.Speech.PrRegExp (regexpPrinter,multiRegexpPrinter) where
-
-import GF.Speech.CFG
-import GF.Speech.CFGToFA
-import GF.Speech.PGFToCFG
-import GF.Speech.RegExp
-import PGF
-
-regexpPrinter :: PGF -> CId -> String
-regexpPrinter pgf cnc = (++"\n") $ prRE $ dfa2re $ cfgToFA $ pgfToCFG pgf cnc
-
-multiRegexpPrinter :: PGF -> CId -> String
-multiRegexpPrinter pgf cnc = prREs $ mfa2res $ cfgToMFA $ pgfToCFG pgf cnc
-
-prREs :: [(String,RE CFSymbol)] -> String
-prREs res = unlines [l ++ " = " ++ prRE (mapRE showLabel re) | (l,re) <- res]
- where showLabel = symbol (\l -> "<" ++ l ++ ">") id
-
-mfa2res :: MFA -> [(String,RE CFSymbol)]
-mfa2res (MFA _ dfas) = [(l, minimizeRE (dfa2re dfa)) | (l,dfa) <- dfas]
diff --git a/src-3.0/GF/Speech/RegExp.hs b/src-3.0/GF/Speech/RegExp.hs
deleted file mode 100644
index 5ee40828e..000000000
--- a/src-3.0/GF/Speech/RegExp.hs
+++ /dev/null
@@ -1,143 +0,0 @@
-module GF.Speech.RegExp (RE(..),
- epsilonRE, nullRE,
- isEpsilon, isNull,
- unionRE, concatRE, seqRE,
- repeatRE, minimizeRE,
- mapRE, mapRE', joinRE,
- symbolsRE,
- dfa2re, prRE) where
-
-import Data.List
-
-import GF.Data.Utilities
-import GF.Speech.FiniteState
-
-data RE a =
- REUnion [RE a] -- ^ REUnion [] is null
- | REConcat [RE a] -- ^ REConcat [] is epsilon
- | RERepeat (RE a)
- | RESymbol a
- deriving (Eq,Ord,Show)
-
-
-dfa2re :: (Ord a) => DFA a -> RE a
-dfa2re = finalRE . elimStates . modifyTransitions merge . addLoops
- . oneFinalState () epsilonRE . mapTransitions RESymbol
- where addLoops fa = newTransitions [(s,s,nullRE) | (s,_) <- states fa] fa
- merge es = [(f,t,unionRE ls)
- | ((f,t),ls) <- buildMultiMap [((f,t),l) | (f,t,l) <- es]]
-
-elimStates :: (Ord a) => DFA (RE a) -> DFA (RE a)
-elimStates fa =
- case [s | (s,_) <- states fa, isInternal fa s] of
- [] -> fa
- sE:_ -> elimStates $ insertTransitionsWith (\x y -> unionRE [x,y]) ts $ removeState sE fa
- where sAs = nonLoopTransitionsTo sE fa
- sBs = nonLoopTransitionsFrom sE fa
- r2 = unionRE $ loops sE fa
- ts = [(sA, sB, r r1 r3) | (sA,r1) <- sAs, (sB,r3) <- sBs]
- r r1 r3 = concatRE [r1, repeatRE r2, r3]
-
-epsilonRE :: RE a
-epsilonRE = REConcat []
-
-nullRE :: RE a
-nullRE = REUnion []
-
-isNull :: RE a -> Bool
-isNull (REUnion []) = True
-isNull _ = False
-
-isEpsilon :: RE a -> Bool
-isEpsilon (REConcat []) = True
-isEpsilon _ = False
-
-unionRE :: Ord a => [RE a] -> RE a
-unionRE = unionOrId . sortNub . concatMap toList
- where
- toList (REUnion xs) = xs
- toList x = [x]
- unionOrId [r] = r
- unionOrId rs = REUnion rs
-
-concatRE :: [RE a] -> RE a
-concatRE xs | any isNull xs = nullRE
- | otherwise = case concatMap toList xs of
- [r] -> r
- rs -> REConcat rs
- where
- toList (REConcat xs) = xs
- toList x = [x]
-
-seqRE :: [a] -> RE a
-seqRE = concatRE . map RESymbol
-
-repeatRE :: RE a -> RE a
-repeatRE x | isNull x || isEpsilon x = epsilonRE
- | otherwise = RERepeat x
-
-finalRE :: Ord a => DFA (RE a) -> RE a
-finalRE fa = concatRE [repeatRE r1, r2,
- repeatRE (unionRE [r3, concatRE [r4, repeatRE r1, r2]])]
- where
- s0 = startState fa
- [sF] = finalStates fa
- r1 = unionRE $ loops s0 fa
- r2 = unionRE $ map snd $ nonLoopTransitionsTo sF fa
- r3 = unionRE $ loops sF fa
- r4 = unionRE $ map snd $ nonLoopTransitionsFrom sF fa
-
-reverseRE :: RE a -> RE a
-reverseRE (REConcat xs) = REConcat $ map reverseRE $ reverse xs
-reverseRE (REUnion xs) = REUnion (map reverseRE xs)
-reverseRE (RERepeat x) = RERepeat (reverseRE x)
-reverseRE x = x
-
-minimizeRE :: Ord a => RE a -> RE a
-minimizeRE = reverseRE . mergeForward . reverseRE . mergeForward
-
-mergeForward :: Ord a => RE a -> RE a
-mergeForward (REUnion xs) =
- unionRE [concatRE [mergeForward y,mergeForward (unionRE rs)] | (y,rs) <- buildMultiMap (map firstRE xs)]
-mergeForward (REConcat (x:xs)) = concatRE [mergeForward x,mergeForward (REConcat xs)]
-mergeForward (RERepeat r) = repeatRE (mergeForward r)
-mergeForward r = r
-
-firstRE :: RE a -> (RE a, RE a)
-firstRE (REConcat (x:xs)) = (x, REConcat xs)
-firstRE r = (r,epsilonRE)
-
-mapRE :: (a -> b) -> RE a -> RE b
-mapRE f = mapRE' (RESymbol . f)
-
-mapRE' :: (a -> RE b) -> RE a -> RE b
-mapRE' f (REConcat xs) = REConcat (map (mapRE' f) xs)
-mapRE' f (REUnion xs) = REUnion (map (mapRE' f) xs)
-mapRE' f (RERepeat x) = RERepeat (mapRE' f x)
-mapRE' f (RESymbol s) = f s
-
-joinRE :: RE (RE a) -> RE a
-joinRE (REConcat xs) = REConcat (map joinRE xs)
-joinRE (REUnion xs) = REUnion (map joinRE xs)
-joinRE (RERepeat xs) = RERepeat (joinRE xs)
-joinRE (RESymbol ss) = ss
-
-symbolsRE :: RE a -> [a]
-symbolsRE (REConcat xs) = concatMap symbolsRE xs
-symbolsRE (REUnion xs) = concatMap symbolsRE xs
-symbolsRE (RERepeat x) = symbolsRE x
-symbolsRE (RESymbol x) = [x]
-
--- Debugging
-
-prRE :: RE String -> String
-prRE = prRE' 0
-
-prRE' _ (REUnion []) = "<NULL>"
-prRE' n (REUnion xs) = p n 1 (concat (intersperse " | " (map (prRE' 1) xs)))
-prRE' n (REConcat xs) = p n 2 (unwords (map (prRE' 2) xs))
-prRE' n (RERepeat x) = p n 3 (prRE' 3 x) ++ "*"
-prRE' _ (RESymbol s) = s
-
-p n m s | n >= m = "(" ++ s ++ ")"
- | True = s
diff --git a/src-3.0/GF/Speech/Relation.hs b/src-3.0/GF/Speech/Relation.hs
deleted file mode 100644
index 641d671a9..000000000
--- a/src-3.0/GF/Speech/Relation.hs
+++ /dev/null
@@ -1,130 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : Relation
--- Maintainer : BB
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/10/26 17:13:13 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.1 $
---
--- A simple module for relations.
------------------------------------------------------------------------------
-
-module GF.Speech.Relation (Rel, mkRel, mkRel'
- , allRelated , isRelatedTo
- , transitiveClosure
- , reflexiveClosure, reflexiveClosure_
- , symmetricClosure
- , symmetricSubrelation, reflexiveSubrelation
- , reflexiveElements
- , equivalenceClasses
- , isTransitive, isReflexive, isSymmetric
- , isEquivalence
- , isSubRelationOf) where
-
-import Data.List
-import Data.Maybe
-import Data.Map (Map)
-import qualified Data.Map as Map
-import Data.Set (Set)
-import qualified Data.Set as Set
-
-import GF.Data.Utilities
-
-type Rel a = Map a (Set a)
-
--- | Creates a relation from a list of related pairs.
-mkRel :: Ord a => [(a,a)] -> Rel a
-mkRel ps = relates ps Map.empty
-
--- | Creates a relation from a list pairs of elements and the elements
--- related to them.
-mkRel' :: Ord a => [(a,[a])] -> Rel a
-mkRel' xs = Map.fromListWith Set.union [(x,Set.fromList ys) | (x,ys) <- xs]
-
-relToList :: Rel a -> [(a,a)]
-relToList r = [ (x,y) | (x,ys) <- Map.toList r, y <- Set.toList ys ]
-
--- | Add a pair to the relation.
-relate :: Ord a => a -> a -> Rel a -> Rel a
-relate x y r = Map.insertWith Set.union x (Set.singleton y) r
-
--- | Add a list of pairs to the relation.
-relates :: Ord a => [(a,a)] -> Rel a -> Rel a
-relates ps r = foldl (\r' (x,y) -> relate x y r') r ps
-
--- | Checks if an element is related to another.
-isRelatedTo :: Ord a => Rel a -> a -> a -> Bool
-isRelatedTo r x y = maybe False (y `Set.member`) (Map.lookup x r)
-
--- | Get the set of elements to which a given element is related.
-allRelated :: Ord a => Rel a -> a -> Set a
-allRelated r x = fromMaybe Set.empty (Map.lookup x r)
-
--- | Get all elements in the relation.
-domain :: Ord a => Rel a -> Set a
-domain r = foldl Set.union (Map.keysSet r) (Map.elems r)
-
--- | Keep only pairs for which both elements are in the given set.
-intersectSetRel :: Ord a => Set a -> Rel a -> Rel a
-intersectSetRel s = filterRel (\x y -> x `Set.member` s && y `Set.member` s)
-
-transitiveClosure :: Ord a => Rel a -> Rel a
-transitiveClosure r = fix (Map.map growSet) r
- where growSet ys = foldl Set.union ys (map (allRelated r) $ Set.toList ys)
-
-reflexiveClosure_ :: Ord a => [a] -- ^ The set over which the relation is defined.
- -> Rel a -> Rel a
-reflexiveClosure_ u r = relates [(x,x) | x <- u] r
-
--- | Uses 'domain'
-reflexiveClosure :: Ord a => Rel a -> Rel a
-reflexiveClosure r = reflexiveClosure_ (Set.toList $ domain r) r
-
-symmetricClosure :: Ord a => Rel a -> Rel a
-symmetricClosure r = relates [ (y,x) | (x,y) <- relToList r ] r
-
-symmetricSubrelation :: Ord a => Rel a -> Rel a
-symmetricSubrelation r = filterRel (flip $ isRelatedTo r) r
-
-reflexiveSubrelation :: Ord a => Rel a -> Rel a
-reflexiveSubrelation r = intersectSetRel (reflexiveElements r) r
-
--- | Get the set of elements which are related to themselves.
-reflexiveElements :: Ord a => Rel a -> Set a
-reflexiveElements r = Set.fromList [ x | (x,ys) <- Map.toList r, x `Set.member` ys ]
-
--- | Keep the related pairs for which the predicate is true.
-filterRel :: Ord a => (a -> a -> Bool) -> Rel a -> Rel a
-filterRel p = purgeEmpty . Map.mapWithKey (Set.filter . p)
-
--- | Remove keys that map to no elements.
-purgeEmpty :: Ord a => Rel a -> Rel a
-purgeEmpty r = Map.filter (not . Set.null) r
-
-
--- | Get the equivalence classes from an equivalence relation.
-equivalenceClasses :: Ord a => Rel a -> [Set a]
-equivalenceClasses r = equivalenceClasses_ (Map.keys r) r
- where equivalenceClasses_ [] _ = []
- equivalenceClasses_ (x:xs) r = ys:equivalenceClasses_ zs r
- where ys = allRelated r x
- zs = [x' | x' <- xs, not (x' `Set.member` ys)]
-
-isTransitive :: Ord a => Rel a -> Bool
-isTransitive r = and [z `Set.member` ys | (x,ys) <- Map.toList r,
- y <- Set.toList ys, z <- Set.toList (allRelated r y)]
-
-isReflexive :: Ord a => Rel a -> Bool
-isReflexive r = all (\ (x,ys) -> x `Set.member` ys) (Map.toList r)
-
-isSymmetric :: Ord a => Rel a -> Bool
-isSymmetric r = and [isRelatedTo r y x | (x,y) <- relToList r]
-
-isEquivalence :: Ord a => Rel a -> Bool
-isEquivalence r = isReflexive r && isSymmetric r && isTransitive r
-
-isSubRelationOf :: Ord a => Rel a -> Rel a -> Bool
-isSubRelationOf r1 r2 = all (uncurry (isRelatedTo r2)) (relToList r1)
diff --git a/src-3.0/GF/Speech/SISR.hs b/src-3.0/GF/Speech/SISR.hs
deleted file mode 100644
index 723dc1a49..000000000
--- a/src-3.0/GF/Speech/SISR.hs
+++ /dev/null
@@ -1,75 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : GF.Speech.SISR
---
--- Abstract syntax and pretty printer for SISR,
--- (Semantic Interpretation for Speech Recognition)
-----------------------------------------------------------------------
-module GF.Speech.SISR (SISRFormat(..), SISRTag, prSISR,
- topCatSISR, profileInitSISR, catSISR, profileFinalSISR) where
-
-import Data.List
-
-import GF.Data.Utilities
-import GF.Infra.Ident
-import GF.Infra.Option (SISRFormat(..))
-import GF.Speech.CFG
-import GF.Speech.SRG (SRGNT)
-import PGF.CId
-
-import qualified GF.JavaScript.AbsJS as JS
-import qualified GF.JavaScript.PrintJS as JS
-
-type SISRTag = [JS.DeclOrExpr]
-
-
-prSISR :: SISRTag -> String
-prSISR = JS.printTree
-
-topCatSISR :: String -> SISRFormat -> SISRTag
-topCatSISR c fmt = map JS.DExpr [fmtOut fmt `ass` fmtRef fmt c]
-
-profileInitSISR :: CFTerm -> SISRFormat -> SISRTag
-profileInitSISR t fmt
- | null (usedArgs t) = []
- | otherwise = [JS.Decl [JS.DInit args (JS.EArray [])]]
-
-usedArgs :: CFTerm -> [Int]
-usedArgs (CFObj _ ts) = foldr union [] (map usedArgs ts)
-usedArgs (CFAbs _ x) = usedArgs x
-usedArgs (CFApp x y) = usedArgs x `union` usedArgs y
-usedArgs (CFRes i) = [i]
-usedArgs _ = []
-
-catSISR :: CFTerm -> SRGNT -> SISRFormat -> SISRTag
-catSISR t (c,i) fmt
- | i `elem` usedArgs t = map JS.DExpr
- [JS.EIndex (JS.EVar args) (JS.EInt (fromIntegral i)) `ass` fmtRef fmt c]
- | otherwise = []
-
-profileFinalSISR :: CFTerm -> SISRFormat -> SISRTag
-profileFinalSISR term fmt = [JS.DExpr $ fmtOut fmt `ass` f term]
- where
- f (CFObj n ts) = tree (prCId n) (map f ts)
- f (CFAbs v x) = JS.EFun [var v] [JS.SReturn (f x)]
- f (CFApp x y) = JS.ECall (f x) [f y]
- f (CFRes i) = JS.EIndex (JS.EVar args) (JS.EInt (fromIntegral i))
- f (CFVar v) = JS.EVar (var v)
- f (CFMeta typ) = obj [("name",JS.EStr "?"), ("type",JS.EStr (prCId typ))]
-
-fmtOut SISR_WD20030401 = JS.EVar (JS.Ident "$")
-
-fmtRef SISR_WD20030401 c = JS.EVar (JS.Ident ("$" ++ c))
-
-args = JS.Ident "a"
-
-var v = JS.Ident ("x" ++ show v)
-
-field x y = JS.EMember x (JS.Ident y)
-
-ass = JS.EAssign
-
-tree n xs = obj [("name", JS.EStr n), ("args", JS.EArray xs)]
-
-obj ps = JS.EObj [JS.Prop (JS.StringPropName x) y | (x,y) <- ps]
-
diff --git a/src-3.0/GF/Speech/SLF.hs b/src-3.0/GF/Speech/SLF.hs
deleted file mode 100644
index 4bdc05212..000000000
--- a/src-3.0/GF/Speech/SLF.hs
+++ /dev/null
@@ -1,178 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : GF.Speech.SLF
---
--- This module converts a CFG to an SLF finite-state network
--- for use with the ATK recognizer. The SLF format is described
--- in the HTK manual, and an example for use in ATK is shown
--- in the ATK manual.
---
------------------------------------------------------------------------------
-
-module GF.Speech.SLF (slfPrinter,slfGraphvizPrinter,
- slfSubPrinter,slfSubGraphvizPrinter) where
-
-import GF.Data.Utilities
-import GF.Speech.CFG
-import GF.Speech.FiniteState
-import GF.Speech.CFG
-import GF.Speech.CFGToFA
-import GF.Speech.PGFToCFG
-import qualified GF.Speech.Graphviz as Dot
-import PGF
-import PGF.CId
-
-import Control.Monad
-import qualified Control.Monad.State as STM
-import Data.Char (toUpper)
-import Data.List
-import Data.Maybe
-
-data SLFs = SLFs [(String,SLF)] SLF
-
-data SLF = SLF { slfNodes :: [SLFNode], slfEdges :: [SLFEdge] }
-
-data SLFNode = SLFNode { nId :: Int, nWord :: SLFWord, nTag :: Maybe String }
- | SLFSubLat { nId :: Int, nLat :: String }
-
--- | An SLF word is a word, or the empty string.
-type SLFWord = Maybe String
-
-data SLFEdge = SLFEdge { eId :: Int, eStart :: Int, eEnd :: Int }
-
-type SLF_FA = FA State (Maybe CFSymbol) ()
-
-mkFAs :: PGF -> CId -> (SLF_FA, [(String,SLF_FA)])
-mkFAs pgf cnc = (slfStyleFA main, [(c,slfStyleFA n) | (c,n) <- subs])
- where MFA start subs = {- renameSubs $ -} cfgToMFA $ pgfToCFG pgf cnc
- main = let (fa,s,f) = newFA_ in newTransition s f (NonTerminal start) fa
-
-slfStyleFA :: Eq a => DFA a -> FA State (Maybe a) ()
-slfStyleFA = renameStates [0..] . removeTrivialEmptyNodes . oneFinalState Nothing ()
- . moveLabelsToNodes . dfa2nfa
-
--- | Give sequential names to subnetworks.
-renameSubs :: MFA -> MFA
-renameSubs (MFA start subs) = MFA (newName start) subs'
- where newNames = zip (map fst subs) ["sub"++show n | n <- [0..]]
- newName s = lookup' s newNames
- subs' = [(newName s,renameLabels n) | (s,n) <- subs]
- renameLabels = mapTransitions (mapSymbol newName id)
-
---
--- * SLF graphviz printing (without sub-networks)
---
-
-slfGraphvizPrinter :: PGF -> CId -> String
-slfGraphvizPrinter pgf cnc
- = prFAGraphviz $ gvFA $ slfStyleFA $ cfgToFA' $ pgfToCFG pgf cnc
- where
- gvFA = mapStates (fromMaybe "") . mapTransitions (const "")
-
---
--- * SLF graphviz printing (with sub-networks)
---
-
-slfSubGraphvizPrinter :: PGF -> CId -> String
-slfSubGraphvizPrinter pgf cnc = Dot.prGraphviz g
- where (main, subs) = mkFAs pgf cnc
- g = STM.evalState (liftM2 Dot.addSubGraphs ss m) [0..]
- ss = mapM (\ (c,f) -> gvSLFFA (Just c) f) subs
- m = gvSLFFA Nothing main
-
-gvSLFFA :: Maybe String -> SLF_FA -> STM.State [State] Dot.Graph
-gvSLFFA n fa =
- liftM (mkCluster n . faToGraphviz . mapStates (maybe "" mfaLabelToGv)
- . mapTransitions (const "")) (rename fa)
- where mfaLabelToGv = symbol ("#"++) id
- mkCluster Nothing = id
- mkCluster (Just x)
- = Dot.setName ("cluster_"++x) . Dot.setAttr "label" x
- rename fa = do
- names <- STM.get
- let fa' = renameStates names fa
- names' = unusedNames fa'
- STM.put names'
- return fa'
-
---
--- * SLF printing (without sub-networks)
---
-
-slfPrinter :: PGF -> CId -> String
-slfPrinter pgf cnc
- = prSLF $ automatonToSLF mkSLFNode $ slfStyleFA $ cfgToFA' $ pgfToCFG pgf cnc
-
---
--- * SLF printing (with sub-networks)
---
-
--- | Make a network with subnetworks in SLF
-slfSubPrinter :: PGF -> CId -> String
-slfSubPrinter pgf cnc = prSLFs slfs
- where
- (main,subs) = mkFAs pgf cnc
- slfs = SLFs [(c, faToSLF fa) | (c,fa) <- subs] (faToSLF main)
- faToSLF = automatonToSLF mfaNodeToSLFNode
-
-automatonToSLF :: (Int -> a -> SLFNode) -> FA State a () -> SLF
-automatonToSLF mkNode fa = SLF { slfNodes = ns, slfEdges = es }
- where ns = map (uncurry mkNode) (states fa)
- es = zipWith (\i (f,t,()) -> mkSLFEdge i (f,t)) [0..] (transitions fa)
-
-mfaNodeToSLFNode :: Int -> Maybe CFSymbol -> SLFNode
-mfaNodeToSLFNode i l = case l of
- Nothing -> mkSLFNode i Nothing
- Just (Terminal x) -> mkSLFNode i (Just x)
- Just (NonTerminal s) -> mkSLFSubLat i s
-
-mkSLFNode :: Int -> Maybe String -> SLFNode
-mkSLFNode i Nothing = SLFNode { nId = i, nWord = Nothing, nTag = Nothing }
-mkSLFNode i (Just w)
- | isNonWord w = SLFNode { nId = i,
- nWord = Nothing,
- nTag = Just w }
- | otherwise = SLFNode { nId = i,
- nWord = Just (map toUpper w),
- nTag = Just w }
-
-mkSLFSubLat :: Int -> String -> SLFNode
-mkSLFSubLat i sub = SLFSubLat { nId = i, nLat = sub }
-
-mkSLFEdge :: Int -> (Int,Int) -> SLFEdge
-mkSLFEdge i (f,t) = SLFEdge { eId = i, eStart = f, eEnd = t }
-
-prSLFs :: SLFs -> String
-prSLFs (SLFs subs main) = unlinesS (map prSub subs ++ [prOneSLF main]) ""
- where prSub (n,s) = showString "SUBLAT=" . shows n
- . nl . prOneSLF s . showString "." . nl
-
-prSLF :: SLF -> String
-prSLF slf = prOneSLF slf ""
-
-prOneSLF :: SLF -> ShowS
-prOneSLF (SLF { slfNodes = ns, slfEdges = es})
- = header . unlinesS (map prNode ns) . nl . unlinesS (map prEdge es) . nl
- where
- header = prFields [("N",show (length ns)),("L", show (length es))] . nl
- prNode (SLFNode { nId = i, nWord = w, nTag = t })
- = prFields $ [("I",show i),("W",showWord w)]
- ++ maybe [] (\t -> [("s",t)]) t
- prNode (SLFSubLat { nId = i, nLat = l })
- = prFields [("I",show i),("L",show l)]
- prEdge e = prFields [("J",show (eId e)),("S",show (eStart e)),("E",show (eEnd e))]
-
--- | Check if a word should not correspond to a word in the SLF file.
-isNonWord :: String -> Bool
-isNonWord = any isPunct
-
-isPunct :: Char -> Bool
-isPunct c = c `elem` "-_.;.,?!()[]{}"
-
-showWord :: SLFWord -> String
-showWord Nothing = "!NULL"
-showWord (Just w) | null w = "!NULL"
- | otherwise = w
-
-prFields :: [(String,String)] -> ShowS
-prFields fs = unwordsS [ showString l . showChar '=' . showString v | (l,v) <- fs ]
diff --git a/src-3.0/GF/Speech/SRG.hs b/src-3.0/GF/Speech/SRG.hs
deleted file mode 100644
index a861d889d..000000000
--- a/src-3.0/GF/Speech/SRG.hs
+++ /dev/null
@@ -1,175 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : SRG
---
--- Representation of, conversion to, and utilities for
--- printing of a general Speech Recognition Grammar.
---
--- FIXME: remove \/ warn \/ fail if there are int \/ string literal
--- categories in the grammar
-----------------------------------------------------------------------
-module GF.Speech.SRG (SRG(..), SRGRule(..), SRGAlt(..), SRGItem, SRGSymbol
- , SRGNT, CFTerm
- , makeSimpleSRG
- , makeNonRecursiveSRG
- , getSpeechLanguage
- , isExternalCat
- , lookupFM_, prtS
- ) where
-
-import GF.Data.Operations
-import GF.Data.Utilities
-import GF.Infra.Ident
-import GF.Infra.PrintClass
-import GF.Speech.CFG
-import GF.Speech.PGFToCFG
-import GF.Speech.Relation
-import GF.Speech.FiniteState
-import GF.Speech.RegExp
-import GF.Speech.CFGToFA
-import GF.Infra.Option
-import PGF.CId
-import PGF.Data
-import PGF.Macros
-
-import Data.List
-import Data.Maybe (fromMaybe, maybeToList)
-import Data.Map (Map)
-import qualified Data.Map as Map
-import Data.Set (Set)
-import qualified Data.Set as Set
-
-import Debug.Trace
-
-data SRG = SRG { srgName :: String -- ^ grammar name
- , srgStartCat :: Cat -- ^ start category name
- , srgExternalCats :: Set Cat
- , srgLanguage :: Maybe String -- ^ The language for which the grammar
- -- is intended, e.g. en-UK
- , srgRules :: [SRGRule]
- }
- deriving (Eq,Show)
-
-data SRGRule = SRGRule Cat [SRGAlt] -- ^ SRG category name, original category name
- -- and productions
- deriving (Eq,Show)
-
--- | maybe a probability, a rule name and an EBNF right-hand side
-data SRGAlt = SRGAlt (Maybe Double) CFTerm SRGItem
- deriving (Eq,Show)
-
-type SRGItem = RE SRGSymbol
-
-type SRGSymbol = Symbol SRGNT Token
-
--- | An SRG non-terminal. Category name and its number in the profile.
-type SRGNT = (Cat, Int)
-
-
--- | Create a compact filtered non-left-recursive SRG.
-makeSimpleSRG :: PGF -> CId -> SRG
-makeSimpleSRG = mkSRG cfgToSRG preprocess
- where
- preprocess = traceStats "After mergeIdentical"
- . mergeIdentical
- . traceStats "After removeLeftRecursion"
- . removeLeftRecursion
- . traceStats "After topDownFilter"
- . topDownFilter
- . traceStats "After bottomUpFilter"
- . bottomUpFilter
- . traceStats "After removeCycles"
- . removeCycles
- . traceStats "Inital CFG"
- cfgToSRG cfg = [cfRulesToSRGRule rs | (_,rs) <- allRulesGrouped cfg]
-
-traceStats s g = trace ("---- " ++ s ++ ": " ++ stats g {- ++ "\n" ++ prCFRules g ++ "----" -}) g
-
-stats g = "Categories: " ++ show (countCats g)
- ++ ", External categories: " ++ show (Set.size (cfgExternalCats g))
- ++ ", Rules: " ++ show (countRules g)
-
-makeNonRecursiveSRG :: PGF
- -> CId -- ^ Concrete syntax name.
- -> SRG
-makeNonRecursiveSRG = mkSRG cfgToSRG id
- where
- cfgToSRG cfg = [SRGRule l [SRGAlt Nothing dummyCFTerm (dfaToSRGItem dfa)] | (l,dfa) <- dfas]
- where
- MFA _ dfas = cfgToMFA cfg
- dfaToSRGItem = mapRE dummySRGNT . minimizeRE . dfa2re
- dummyCFTerm = CFMeta (mkCId "dummy")
- dummySRGNT = mapSymbol (\c -> (c,0)) id
-
-mkSRG :: (CFG -> [SRGRule]) -> (CFG -> CFG) -> PGF -> CId -> SRG
-mkSRG mkRules preprocess pgf cnc =
- SRG { srgName = prCId cnc,
- srgStartCat = cfgStartCat cfg,
- srgExternalCats = cfgExternalCats cfg,
- srgLanguage = getSpeechLanguage pgf cnc,
- srgRules = mkRules cfg }
- where cfg = renameCats (prCId cnc) $ preprocess $ pgfToCFG pgf cnc
-
--- | Renames all external cats C to C_cat, and all internal cats to
--- GrammarName_N where N is an integer.
-renameCats :: String -> CFG -> CFG
-renameCats prefix cfg = mapCFGCats renameCat cfg
- where renameCat c | isExternal c = c ++ "_cat"
- | otherwise = fromMaybe ("renameCats: " ++ c) (Map.lookup c names)
- isExternal c = c `Set.member` cfgExternalCats cfg
- names = Map.fromList $ zip (allCats cfg) [prefix ++ "_" ++ show x | x <- [0..]]
-
-getSpeechLanguage :: PGF -> CId -> Maybe String
-getSpeechLanguage pgf cnc = fmap (replace '_' '-') $ lookConcrFlag pgf cnc (mkCId "language")
-
-cfRulesToSRGRule :: [CFRule] -> SRGRule
-cfRulesToSRGRule rs@(r:_) = SRGRule (lhsCat r) rhs
- where
- alts = [((n,Nothing),mkSRGSymbols 0 ss) | CFRule c ss n <- rs]
- rhs = [SRGAlt p n (srgItem sss) | ((n,p),sss) <- buildMultiMap alts ]
-
- mkSRGSymbols _ [] = []
- mkSRGSymbols i (NonTerminal c:ss) = NonTerminal (c,i) : mkSRGSymbols (i+1) ss
- mkSRGSymbols i (Terminal t:ss) = Terminal t : mkSRGSymbols i ss
-
-allSRGCats :: SRG -> [String]
-allSRGCats SRG { srgRules = rs } = [c | SRGRule c _ <- rs]
-
-isExternalCat :: SRG -> Cat -> Bool
-isExternalCat srg c = c `Set.member` srgExternalCats srg
-
---
--- * Size-optimized EBNF SRGs
---
-
-srgItem :: [[SRGSymbol]] -> SRGItem
-srgItem = unionRE . map mergeItems . sortGroupBy (compareBy filterCats)
--- non-optimizing version:
---srgItem = unionRE . map seqRE
-
--- | Merges a list of right-hand sides which all have the same
--- sequence of non-terminals.
-mergeItems :: [[SRGSymbol]] -> SRGItem
-mergeItems = minimizeRE . ungroupTokens . minimizeRE . unionRE . map seqRE . map groupTokens
-
-groupTokens :: [SRGSymbol] -> [Symbol SRGNT [Token]]
-groupTokens [] = []
-groupTokens (Terminal t:ss) = case groupTokens ss of
- Terminal ts:ss' -> Terminal (t:ts):ss'
- ss' -> Terminal [t]:ss'
-groupTokens (NonTerminal c:ss) = NonTerminal c : groupTokens ss
-
-ungroupTokens :: RE (Symbol SRGNT [Token]) -> RE SRGSymbol
-ungroupTokens = joinRE . mapRE (symbol (RESymbol . NonTerminal) (REConcat . map (RESymbol . Terminal)))
-
---
--- * Utilities for building and printing SRGs
---
-
-lookupFM_ :: (Ord key, Show key) => Map key elt -> key -> elt
-lookupFM_ fm k = Map.findWithDefault err k fm
- where err = error $ "Key not found: " ++ show k
- ++ "\namong " ++ show (Map.keys fm)
-
-prtS :: Print a => a -> ShowS
-prtS = showString . prt
diff --git a/src-3.0/GF/Speech/SRGS_XML.hs b/src-3.0/GF/Speech/SRGS_XML.hs
deleted file mode 100644
index 33e2d0374..000000000
--- a/src-3.0/GF/Speech/SRGS_XML.hs
+++ /dev/null
@@ -1,104 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : GF.Speech.SRGS_XML
---
--- Prints an SRGS XML speech recognition grammars.
-----------------------------------------------------------------------
-module GF.Speech.SRGS_XML (srgsXmlPrinter, srgsXmlNonRecursivePrinter) where
-
-import GF.Data.Utilities
-import GF.Data.XML
-import GF.Infra.Option
-import GF.Speech.CFG
-import GF.Speech.RegExp
-import GF.Speech.SISR as SISR
-import GF.Speech.SRG
-import PGF (PGF, CId)
-
-import Control.Monad
-import Data.Char (toUpper,toLower)
-import Data.List
-import Data.Maybe
-import qualified Data.Map as Map
-
-srgsXmlPrinter :: Maybe SISRFormat
- -> PGF -> CId -> String
-srgsXmlPrinter sisr pgf cnc = prSrgsXml sisr $ makeSimpleSRG pgf cnc
-
-srgsXmlNonRecursivePrinter :: PGF -> CId -> String
-srgsXmlNonRecursivePrinter pgf cnc = prSrgsXml Nothing $ makeNonRecursiveSRG pgf cnc
-
-
-prSrgsXml :: Maybe SISRFormat -> SRG -> String
-prSrgsXml sisr srg = showXMLDoc (optimizeSRGS xmlGr)
- where
- xmlGr = grammar sisr (srgStartCat srg) (srgLanguage srg) $
- [meta "description"
- ("SRGS XML speech recognition grammar for " ++ srgName srg ++ "."),
- meta "generator" "Grammatical Framework"]
- ++ map ruleToXML (srgRules srg)
- ruleToXML (SRGRule cat alts) = Tag "rule" ([("id",cat)]++pub) (prRhs alts)
- where pub = if isExternalCat srg cat then [("scope","public")] else []
- prRhs rhss = [oneOf (map (mkProd sisr) rhss)]
-
-mkProd :: Maybe SISRFormat -> SRGAlt -> XML
-mkProd sisr (SRGAlt mp n rhs) = Tag "item" [] (ti ++ [x] ++ tf)
- where x = mkItem sisr n rhs
- ti = tag sisr (profileInitSISR n)
- tf = tag sisr (profileFinalSISR n)
-
-mkItem :: Maybe SISRFormat -> CFTerm -> SRGItem -> XML
-mkItem sisr cn = f
- where
- f (REUnion []) = ETag "ruleref" [("special","VOID")]
- f (REUnion xs)
- | not (null es) = Tag "item" [("repeat","0-1")] [f (REUnion nes)]
- | otherwise = oneOf (map f xs)
- where (es,nes) = partition isEpsilon xs
- f (REConcat []) = ETag "ruleref" [("special","NULL")]
- f (REConcat xs) = Tag "item" [] (map f xs)
- f (RERepeat x) = Tag "item" [("repeat","0-")] [f x]
- f (RESymbol s) = symItem sisr cn s
-
-symItem :: Maybe SISRFormat -> CFTerm -> Symbol SRGNT Token -> XML
-symItem sisr cn (NonTerminal n@(c,_)) =
- Tag "item" [] $ [ETag "ruleref" [("uri","#" ++ c)]] ++ tag sisr (catSISR cn n)
-symItem _ _ (Terminal t) = Tag "item" [] [Data (showToken t)]
-
-tag :: Maybe SISRFormat -> (SISRFormat -> SISRTag) -> [XML]
-tag Nothing _ = []
-tag (Just fmt) t = case t fmt of
- [] -> []
- ts -> [Tag "tag" [] [Data (prSISR ts)]]
-
-showToken :: Token -> String
-showToken t = t
-
-oneOf :: [XML] -> XML
-oneOf = Tag "one-of" []
-
-grammar :: Maybe SISRFormat
- -> String -- ^ root
- -> Maybe String -- ^language
- -> [XML] -> XML
-grammar sisr root ml =
- Tag "grammar" $ [("xmlns","http://www.w3.org/2001/06/grammar"),
- ("version","1.0"),
- ("mode","voice"),
- ("root",root)]
- ++ (if isJust sisr then [("tag-format","semantics/1.0")] else [])
- ++ maybe [] (\l -> [("xml:lang", l)]) ml
-
-meta :: String -> String -> XML
-meta n c = ETag "meta" [("name",n),("content",c)]
-
-optimizeSRGS :: XML -> XML
-optimizeSRGS = bottomUpXML f
- where f (Tag "item" [] [x@(Tag "item" _ _)]) = x
- f (Tag "item" [] [x@(Tag "one-of" _ _)]) = x
- f (Tag "item" as [Tag "item" [] xs]) = Tag "item" as xs
- f (Tag "item" as xs) = Tag "item" as (map g xs)
- where g (Tag "item" [] [x@(ETag "ruleref" _)]) = x
- g x = x
- f (Tag "one-of" [] [x]) = x
- f x = x
diff --git a/src-3.0/GF/Speech/VoiceXML.hs b/src-3.0/GF/Speech/VoiceXML.hs
deleted file mode 100644
index 14a93c796..000000000
--- a/src-3.0/GF/Speech/VoiceXML.hs
+++ /dev/null
@@ -1,247 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : GF.Speech.VoiceXML
---
--- Creates VoiceXML dialogue systems from PGF grammars.
------------------------------------------------------------------------------
-module GF.Speech.VoiceXML (grammar2vxml) where
-
-import GF.Data.Operations
-import GF.Data.Str (sstrV)
-import GF.Data.Utilities
-import GF.Data.XML
-import GF.Infra.Ident
-import GF.Infra.Modules
-import GF.Speech.SRG (getSpeechLanguage)
-import PGF.CId
-import PGF.Data
-import PGF.Macros
-import PGF.Linearize (realize)
-
-import Control.Monad (liftM)
-import Data.List (isPrefixOf, find, intersperse)
-import qualified Data.Map as Map
-import Data.Maybe (fromMaybe)
-
-import Debug.Trace
-
--- | the main function
-grammar2vxml :: PGF -> CId -> String
-grammar2vxml pgf cnc = showsXMLDoc (skel2vxml name language start skel qs) ""
- where skel = pgfSkeleton pgf
- name = prCId cnc
- qs = catQuestions pgf cnc (map fst skel)
- language = getSpeechLanguage pgf cnc
- start = mkCId (lookStartCat pgf)
-
---
--- * VSkeleton: a simple description of the abstract syntax.
---
-
-type Skeleton = [(CId, [(CId, [CId])])]
-
-pgfSkeleton :: PGF -> Skeleton
-pgfSkeleton pgf = [(c,[(f,fst (catSkeleton (lookType pgf f))) | f <- fs])
- | (c,fs) <- Map.toList (catfuns (abstract pgf)),
- not (isLiteralCat c)]
-
--- FIXME: should this go in a more general module?
-isLiteralCat :: CId -> Bool
-isLiteralCat = (`elem` [mkCId "String", mkCId "Float", mkCId "Int"])
-
---
--- * Questions to ask
---
-
-type CatQuestions = [(CId,String)]
-
-catQuestions :: PGF -> CId -> [CId] -> CatQuestions
-catQuestions pgf cnc cats = [(c,catQuestion pgf cnc c) | c <- cats]
-
-catQuestion :: PGF -> CId -> CId -> String
-catQuestion pgf cnc cat = realize (lookPrintName pgf cnc cat)
-
-
-{-
-lin :: StateGrammar -> String -> Err String
-lin gr fun = do
- tree <- string2treeErr gr fun
- let ls = map unt $ linTree2strings noMark g c tree
- case ls of
- [] -> fail $ "No linearization of " ++ fun
- l:_ -> return l
- where c = cncId gr
- g = stateGrammarST gr
- unt = formatAsText
--}
-
-getCatQuestion :: CId -> CatQuestions -> String
-getCatQuestion c qs =
- fromMaybe (error "No question for category " ++ prCId c) (lookup c qs)
-
---
--- * Generate VoiceXML
---
-
-skel2vxml :: String -> Maybe String -> CId -> Skeleton -> CatQuestions -> XML
-skel2vxml name language start skel qs =
- vxml language ([startForm] ++ concatMap (uncurry (catForms gr qs)) skel)
- where
- gr = grammarURI name
- startForm = Tag "form" [] [subdialog "sub" [("src", "#"++catFormId start)]
- [param "old" "{ name : '?' }"]]
-
-grammarURI :: String -> String
-grammarURI name = name ++ ".grxml"
-
-
-catForms :: String -> CatQuestions -> CId -> [(CId, [CId])] -> [XML]
-catForms gr qs cat fs =
- comments [prCId cat ++ " category."]
- ++ [cat2form gr qs cat fs]
-
-cat2form :: String -> CatQuestions -> CId -> [(CId, [CId])] -> XML
-cat2form gr qs cat fs =
- form (catFormId cat) $
- [var "old" Nothing,
- blockCond "old.name != '?'" [assign "term" "old"],
- field "term" []
- [promptString (getCatQuestion cat qs),
- vxmlGrammar (gr++"#"++catFormId cat)
- ]
- ]
- ++ concatMap (uncurry (fun2sub gr cat)) fs
- ++ [block [return_ ["term"]{-]-}]]
-
-fun2sub :: String -> CId -> CId -> [CId] -> [XML]
-fun2sub gr cat fun args =
- comments [prCId fun ++ " : ("
- ++ concat (intersperse ", " (map prCId args))
- ++ ") " ++ prCId cat] ++ ss
- where
- ss = zipWith mkSub [0..] args
- mkSub n t = subdialog s [("src","#"++catFormId t),
- ("cond","term.name == "++string (prCId fun))]
- [param "old" v,
- filled [] [assign v (s++".term")]]
- where s = prCId fun ++ "_" ++ show n
- v = "term.args["++show n++"]"
-
-catFormId :: CId -> String
-catFormId c = prCId c ++ "_cat"
-
-
---
--- * VoiceXML stuff
---
-
-vxml :: Maybe String -> [XML] -> XML
-vxml ml = Tag "vxml" $ [("version","2.0"),
- ("xmlns","http://www.w3.org/2001/vxml")]
- ++ maybe [] (\l -> [("xml:lang", l)]) ml
-
-form :: String -> [XML] -> XML
-form id xs = Tag "form" [("id", id)] xs
-
-field :: String -> [(String,String)] -> [XML] -> XML
-field name attrs = Tag "field" ([("name",name)]++attrs)
-
-subdialog :: String -> [(String,String)] -> [XML] -> XML
-subdialog name attrs = Tag "subdialog" ([("name",name)]++attrs)
-
-filled :: [(String,String)] -> [XML] -> XML
-filled = Tag "filled"
-
-vxmlGrammar :: String -> XML
-vxmlGrammar uri = ETag "grammar" [("src",uri)]
-
-prompt :: [XML] -> XML
-prompt = Tag "prompt" []
-
-promptString :: String -> XML
-promptString p = prompt [Data p]
-
-reprompt :: XML
-reprompt = ETag "reprompt" []
-
-assign :: String -> String -> XML
-assign n e = ETag "assign" [("name",n),("expr",e)]
-
-value :: String -> XML
-value expr = ETag "value" [("expr",expr)]
-
-if_ :: String -> [XML] -> XML
-if_ c b = if_else c b []
-
-if_else :: String -> [XML] -> [XML] -> XML
-if_else c t f = cond [(c,t)] f
-
-cond :: [(String,[XML])] -> [XML] -> XML
-cond ((c,b):rest) els = Tag "if" [("cond",c)] (b ++ es)
- where es = [Tag "elseif" [("cond",c')] b' | (c',b') <- rest]
- ++ if null els then [] else (Tag "else" [] []:els)
-
-goto_item :: String -> XML
-goto_item nextitem = ETag "goto" [("nextitem",nextitem)]
-
-return_ :: [String] -> XML
-return_ names = ETag "return" [("namelist", unwords names)]
-
-block :: [XML] -> XML
-block = Tag "block" []
-
-blockCond :: String -> [XML] -> XML
-blockCond cond = Tag "block" [("cond", cond)]
-
-throw :: String -> String -> XML
-throw event msg = Tag "throw" [("event",event),("message",msg)] []
-
-nomatch :: [XML] -> XML
-nomatch = Tag "nomatch" []
-
-help :: [XML] -> XML
-help = Tag "help" []
-
-param :: String -> String -> XML
-param name expr = ETag "param" [("name",name),("expr",expr)]
-
-var :: String -> Maybe String -> XML
-var name expr = ETag "var" ([("name",name)]++e)
- where e = maybe [] ((:[]) . (,) "expr") expr
-
-script :: String -> XML
-script s = Tag "script" [] [CData s]
-
-scriptURI :: String -> XML
-scriptURI uri = Tag "script" [("uri", uri)] []
-
---
--- * ECMAScript stuff
---
-
-string :: String -> String
-string s = "'" ++ concatMap esc s ++ "'"
- where esc '\'' = "\\'"
- esc c = [c]
-
-{-
---
--- * List stuff
---
-
-isListCat :: (CId, [(CId, [CId])]) -> Bool
-isListCat (cat,rules) = "List" `isPrefixOf` prIdent cat && length rules == 2
- && ("Base"++c) `elem` fs && ("Cons"++c) `elem` fs
- where c = drop 4 (prIdent cat)
- fs = map (prIdent . fst) rules
-
-isBaseFun :: CId -> Bool
-isBaseFun f = "Base" `isPrefixOf` prIdent f
-
-isConsFun :: CId -> Bool
-isConsFun f = "Cons" `isPrefixOf` prIdent f
-
-baseSize :: (CId, [(CId, [CId])]) -> Int
-baseSize (_,rules) = length bs
- where Just (_,bs) = find (isBaseFun . fst) rules
--}
diff --git a/src-3.0/GF/System/NoReadline.hs b/src-3.0/GF/System/NoReadline.hs
deleted file mode 100644
index 1f1050e8c..000000000
--- a/src-3.0/GF/System/NoReadline.hs
+++ /dev/null
@@ -1,33 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : GF.System.NoReadline
--- Maintainer : BB
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/05/10 15:04:01 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.1 $
---
--- Do not use readline.
------------------------------------------------------------------------------
-
-module GF.System.NoReadline (fetchCommand, setCompletionFunction, filenameCompletionFunction) where
-
-import System.IO.Error (try)
-import System.IO (stdout,hFlush)
-
-fetchCommand :: String -> IO (String)
-fetchCommand s = do
- putStr s
- hFlush stdout
- res <- try getLine
- case res of
- Left e -> return "q"
- Right l -> return l
-
-setCompletionFunction :: Maybe (String -> String -> Int -> IO [String]) -> IO ()
-setCompletionFunction _ = return ()
-
-filenameCompletionFunction :: String -> IO [String]
-filenameCompletionFunction _ = return []
diff --git a/src-3.0/GF/System/NoSignal.hs b/src-3.0/GF/System/NoSignal.hs
deleted file mode 100644
index 5d82a431e..000000000
--- a/src-3.0/GF/System/NoSignal.hs
+++ /dev/null
@@ -1,29 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : GF.System.NoSignal
--- Maintainer : Bjorn Bringert
--- Stability : (stability)
--- Portability : (portability)
---
--- > CVS $Date: 2005/11/11 11:12:50 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.1 $
---
--- Dummy implementation of signal handling.
------------------------------------------------------------------------------
-
-module GF.System.NoSignal where
-
-import Control.Exception (Exception,catch)
-import Prelude hiding (catch)
-
-{-# NOINLINE runInterruptibly #-}
-runInterruptibly :: IO a -> IO (Either Exception a)
---runInterruptibly = fmap Right
-runInterruptibly a =
- p `catch` h
- where p = a >>= \x -> return $! Right $! x
- h e = return $ Left e
-
-blockInterrupt :: IO a -> IO a
-blockInterrupt = id
diff --git a/src-3.0/GF/System/Readline.hs b/src-3.0/GF/System/Readline.hs
deleted file mode 100644
index db122c3e2..000000000
--- a/src-3.0/GF/System/Readline.hs
+++ /dev/null
@@ -1,27 +0,0 @@
-{-# OPTIONS -cpp #-}
-
-----------------------------------------------------------------------
--- |
--- Module : GF.System.Readline
--- Maintainer : BB
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/05/10 15:04:01 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.2 $
---
--- Uses the right readline library to read user input.
------------------------------------------------------------------------------
-
-module GF.System.Readline (fetchCommand, setCompletionFunction, filenameCompletionFunction) where
-
-#ifdef USE_READLINE
-
-import GF.System.UseReadline
-
-#else
-
-import GF.System.NoReadline
-
-#endif
diff --git a/src-3.0/GF/System/Signal.hs b/src-3.0/GF/System/Signal.hs
deleted file mode 100644
index fe8a12483..000000000
--- a/src-3.0/GF/System/Signal.hs
+++ /dev/null
@@ -1,27 +0,0 @@
-{-# OPTIONS -cpp #-}
-
-----------------------------------------------------------------------
--- |
--- Module : GF.System.Signal
--- Maintainer : Bjorn Bringert
--- Stability : (stability)
--- Portability : (portability)
---
--- > CVS $Date: 2005/11/11 11:12:50 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.3 $
---
--- Import the right singal handling module.
------------------------------------------------------------------------------
-
-module GF.System.Signal (runInterruptibly,blockInterrupt) where
-
-#ifdef USE_INTERRUPT
-
-import GF.System.UseSignal (runInterruptibly,blockInterrupt)
-
-#else
-
-import GF.System.NoSignal (runInterruptibly,blockInterrupt)
-
-#endif
diff --git a/src-3.0/GF/System/UseReadline.hs b/src-3.0/GF/System/UseReadline.hs
deleted file mode 100644
index a0e051601..000000000
--- a/src-3.0/GF/System/UseReadline.hs
+++ /dev/null
@@ -1,36 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : GF.System.UseReadline
--- Maintainer : BB
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/05/10 15:04:01 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.1 $
---
--- Use GNU readline
------------------------------------------------------------------------------
-
-module GF.System.UseReadline (fetchCommand, setCompletionFunction, filenameCompletionFunction) where
-
-import System.Console.Readline
-
-fetchCommand :: String -> IO (String)
-fetchCommand s = do
- setCompletionAppendCharacter Nothing
- setBasicQuoteCharacters ""
- res <- readline s
- case res of
- Nothing -> return "q"
- Just s -> do addHistory s
- return s
-
-setCompletionFunction :: Maybe (String -> String -> Int -> IO [String]) -> IO ()
-setCompletionFunction Nothing = setCompletionEntryFunction Nothing
-setCompletionFunction (Just fn) = setCompletionEntryFunction (Just my_fn)
- where
- my_fn prefix = do
- s <- getLineBuffer
- p <- getPoint
- fn s prefix p
diff --git a/src-3.0/GF/System/UseSignal.hs b/src-3.0/GF/System/UseSignal.hs
deleted file mode 100644
index 628f5888d..000000000
--- a/src-3.0/GF/System/UseSignal.hs
+++ /dev/null
@@ -1,72 +0,0 @@
-{-# OPTIONS -cpp #-}
-----------------------------------------------------------------------
--- |
--- Module : GF.System.UseSignal
--- Maintainer : Bjorn Bringert
--- Stability : (stability)
--- Portability : (portability)
---
--- > CVS $Date: 2005/11/11 11:12:50 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.1 $
---
--- Allows SIGINT (Ctrl-C) to interrupt computations.
------------------------------------------------------------------------------
-
-module GF.System.UseSignal where
-
-import Control.Concurrent (myThreadId, killThread)
-import Control.Exception (Exception,catch)
-import Prelude hiding (catch)
-import System.IO
-
-#ifdef mingw32_HOST_OS
-import GHC.ConsoleHandler
-
-myInstallHandler handler = installHandler handler
-myCatch = Catch . const
-myIgnore = Ignore
-#else
-import System.Posix.Signals
-
-myInstallHandler handler = installHandler sigINT handler Nothing
-myCatch = Catch
-myIgnore = Ignore
-#endif
-
-{-# NOINLINE runInterruptibly #-}
-
--- | Run an IO action, and allow it to be interrupted
--- by a SIGINT to the current process. Returns
--- an exception if the process did not complete
--- normally.
--- NOTES:
--- * This will replace any existing SIGINT
--- handler during the action. After the computation
--- has completed the existing handler will be restored.
--- * If the IO action is lazy (e.g. using readFile,
--- unsafeInterleaveIO etc.) the lazy computation will
--- not be interruptible, as it will be performed
--- after the signal handler has been removed.
-runInterruptibly :: IO a -> IO (Either Exception a)
-runInterruptibly a =
- do t <- myThreadId
- oldH <- myInstallHandler (myCatch (print "Seek and Destroy" >> killThread t))
- x <- p `catch` h
- myInstallHandler oldH
- return x
- where p = a >>= \x -> return $! Right $! x
- h e = return $ Left e
-
--- | Like 'runInterruptibly', but always returns (), whether
--- the computation fails or not.
-runInterruptibly_ :: IO () -> IO ()
-runInterruptibly_ = fmap (either (const ()) id) . runInterruptibly
-
--- | Run an action with SIGINT blocked.
-blockInterrupt :: IO a -> IO a
-blockInterrupt a =
- do oldH <- myInstallHandler Ignore
- x <- a
- myInstallHandler oldH
- return x
diff --git a/src-3.0/GF/Text/Lexing.hs b/src-3.0/GF/Text/Lexing.hs
deleted file mode 100644
index 2c6b417b8..000000000
--- a/src-3.0/GF/Text/Lexing.hs
+++ /dev/null
@@ -1,115 +0,0 @@
-module GF.Text.Lexing (stringOp) where
-
-import GF.Text.Transliterations
-import GF.Text.UTF8
-
-import Data.Char
-import Data.List (intersperse)
-
--- lexers and unlexers - they work on space-separated word strings
-
-stringOp :: String -> Maybe (String -> String)
-stringOp name = case name of
- "chars" -> Just $ appLexer (filter (not . all isSpace) . map return)
- "lextext" -> Just $ appLexer lexText
- "lexcode" -> Just $ appLexer lexText
- "lexmixed" -> Just $ appLexer lexMixed
- "words" -> Just $ appLexer words
- "bind" -> Just $ appUnlexer bindTok
- "uncars" -> Just $ appUnlexer concat
- "unlextext" -> Just $ appUnlexer unlexText
- "unlexcode" -> Just $ appUnlexer unlexCode
- "unlexmixed" -> Just $ appUnlexer unlexMixed
- "unwords" -> Just $ appUnlexer unwords
- "to_html" -> Just wrapHTML
- "to_utf8" -> Just encodeUTF8
- "from_utf8" -> Just decodeUTF8
- "to_cp1251" -> Just encodeCP1251
- "from_cp1251" -> Just decodeCP1251
- _ -> transliterate name
-
-appLexer :: (String -> [String]) -> String -> String
-appLexer f = unwords . filter (not . null) . f
-
-appUnlexer :: ([String] -> String) -> String -> String
-appUnlexer f = unlines . map (f . words) . lines
-
-wrapHTML :: String -> String
-wrapHTML = unlines . tag . intersperse "<br>" . lines where
- tag ss = "<html>":"<body>" : ss ++ ["</body>","</html>"]
-
-lexText :: String -> [String]
-lexText s = case s of
- c:cs | isPunct c -> [c] : lexText cs
- c:cs | isSpace c -> lexText cs
- _:_ -> let (w,cs) = break (\x -> isSpace x || isPunct x) s in w : lexText cs
- _ -> [s]
-
--- | Haskell lexer, usable for much code
-lexCode :: String -> [String]
-lexCode ss = case lex ss of
- [(w@(_:_),ws)] -> w : lexCode ws
- _ -> []
-
--- | LaTeX style lexer, with "math" environment using Code between $...$
-lexMixed :: String -> [String]
-lexMixed = concat . alternate False where
- alternate env s = case s of
- _:_ -> case break (=='$') s of
- (t,[]) -> lex env t : []
- (t,c:m) -> lex env t : [[c]] : alternate (not env) m
- _ -> []
- lex env = if env then lexCode else lexText
-
-bindTok :: [String] -> String
-bindTok ws = case ws of
- w:"&+":ws2 -> w ++ bindTok ws2
- w:[] -> w
- w:ws2 -> w ++ " " ++ bindTok ws2
- [] -> ""
-
-unlexText :: [String] -> String
-unlexText s = case s of
- w:[] -> w
- w:[c]:[] | isPunct c -> w ++ [c]
- w:[c]:cs | isPunct c -> w ++ [c] ++ " " ++ unlexText cs
- w:ws -> w ++ " " ++ unlexText ws
- _ -> []
-
-unlexCode :: [String] -> String
-unlexCode s = case s of
- w:[] -> w
- [c]:cs | isParen c -> [c] ++ unlexCode cs
- w:cs@([c]:_) | isClosing c -> w ++ unlexCode cs
- w:ws -> w ++ " " ++ unlexCode ws
- _ -> []
-
-
-unlexMixed :: [String] -> String
-unlexMixed = concat . alternate False where
- alternate env s = case s of
- _:_ -> case break (=="$") s of
- (t,[]) -> unlex env t : []
- (t,c:m) -> unlex env t : sep env c : alternate (not env) m
- _ -> []
- unlex env = if env then unlexCode else unlexText
- sep env c = if env then c ++ " " else " " ++ c
-
-isPunct = flip elem ".?!,:;"
-isParen = flip elem "()[]{}"
-isClosing = flip elem ")]}"
-
-
--- might be in a file of its own: Windows Cyrillic, used in Bulgarian resource
-
-decodeCP1251 = map convert where
- convert c
- | c >= '\192' && c <= '\255' = chr (ord c + 848)
- | otherwise = c
-
-encodeCP1251 = map convert where
- convert c
- | oc >= 1040 && oc <= 1103 = chr (oc - 848)
- | otherwise = c
- where oc = ord c
-
diff --git a/src-3.0/GF/Text/Transliterations.hs b/src-3.0/GF/Text/Transliterations.hs
deleted file mode 100644
index 30c098df8..000000000
--- a/src-3.0/GF/Text/Transliterations.hs
+++ /dev/null
@@ -1,97 +0,0 @@
-module GF.Text.Transliterations (transliterate,transliteration,characterTable) where
-
-import GF.Text.UTF8
-
-import Data.Char
-import qualified Data.Map as Map
-
--- transliterations between ASCII and a Unicode character set
-
--- current transliterations: devanagari, thai
-
--- to add a new one: define the Unicode range and the corresponding ASCII strings,
--- which may be one or two characters long
-
--- conventions to be followed:
--- each character is either [letter] or [letter+nonletter]
--- when using a sparse range of unicodes, mark missing codes as "-" in transliterations
--- characters can be invisible: ignored in translation to unicode
-
-transliterate :: String -> Maybe (String -> String)
-transliterate s = case s of
- 'f':'r':'o':'m':'_':t -> fmap appTransFromUnicode $ transliteration t
- 't':'o':'_':t -> fmap appTransToUnicode $ transliteration t
- _ -> Nothing
-
-transliteration :: String -> Maybe Transliteration
-transliteration s = case s of
- "devanagari" -> Just transDevanagari
- "thai" -> Just transThai
- _ -> Nothing
-
-characterTable :: Transliteration -> String
-characterTable = unlines . map prOne . Map.assocs . trans_from_unicode where
- prOne (i,s) = unwords ["|", show i, "|", encodeUTF8 [toEnum i], "|", s, "|"]
-
-data Transliteration = Trans {
- trans_to_unicode :: Map.Map String Int,
- trans_from_unicode :: Map.Map Int String,
- invisible_chars :: [String]
- }
-
-appTransToUnicode :: Transliteration -> String -> String
-appTransToUnicode trans =
- concat .
- map (\c -> maybe c (return . toEnum) $
- Map.lookup c (trans_to_unicode trans)
- ) .
- filter (flip notElem (invisible_chars trans)) .
- unchar
-
-appTransFromUnicode :: Transliteration -> String -> String
-appTransFromUnicode trans =
- concat .
- map (maybe "?" id .
- flip Map.lookup (trans_from_unicode trans)
- ) .
- map fromEnum
-
-
-mkTransliteration :: [String] -> [Int] -> Transliteration
-mkTransliteration ts us = Trans (Map.fromList (tzip ts us)) (Map.fromList (uzip us ts)) []
- where
- tzip ts us = [(t,u) | (t,u) <- zip ts us, t /= "-"]
- uzip us ts = [(u,t) | (u,t) <- zip us ts, t /= "-"]
-
-
-unchar :: String -> [String]
-unchar s = case s of
- c:d:cs
- | isAlpha d -> [c] : unchar (d:cs)
- | isSpace d -> [c]:[d]: unchar cs
- | otherwise -> [c,d] : unchar cs
- [_] -> [s]
- _ -> []
-
-transThai :: Transliteration
-transThai = mkTransliteration allTrans allCodes where
- allTrans = words $
- "- k k1 - k2 - k3 g c c1 c2 s' c3 y' d' t' " ++
- "t1 t2 t3 n' d t t4 t5 t6 n b p p1 f p2 f' " ++
- "p3 m y r - l - w s- s. s h l' O h' - " ++
- "a. a a: a+ i i: v v: u u: - - - - - - " ++
- "e e' o: a% a& L R S T1 T2 T3 T4 K - - - " ++
- "N0 N1 N2 N3 N4 N5 N6 N7 N8 N9 - - - - - - "
- allCodes = [0x0e00 .. 0x0e7f]
-
-transDevanagari :: Transliteration
-transDevanagari = (mkTransliteration allTrans allCodes){invisible_chars = ["a"]} where
- allTrans = words $
- "M N - - " ++
- "a- A- i- I- u- U- R- - - - e- E- - - o- O- " ++
- "k K g G N: c C j J n: t. T. d. D. n. t " ++
- "T d D n - p P b B m y r - l - - v " ++
- "S s. s h - - r. - A i I u U R - - " ++
- "- e E o O "
- allCodes = [0x0901 .. 0x094c]
-
diff --git a/src-3.0/GF/Text/UTF8.hs b/src-3.0/GF/Text/UTF8.hs
deleted file mode 100644
index 5e9687684..000000000
--- a/src-3.0/GF/Text/UTF8.hs
+++ /dev/null
@@ -1,48 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : UTF8
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/04/21 16:23:42 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.5 $
---
--- From the Char module supplied with HBC.
--- code by Thomas Hallgren (Jul 10 1999)
------------------------------------------------------------------------------
-
-module GF.Text.UTF8 (decodeUTF8, encodeUTF8) where
-
--- | Take a Unicode string and encode it as a string
--- with the UTF8 method.
-decodeUTF8 :: String -> String
-decodeUTF8 "" = ""
-decodeUTF8 (c:cs) | c < '\x80' = c : decodeUTF8 cs
-decodeUTF8 (c:c':cs) | '\xc0' <= c && c <= '\xdf' &&
- '\x80' <= c' && c' <= '\xbf' =
- toEnum ((fromEnum c `mod` 0x20) * 0x40 + fromEnum c' `mod` 0x40) : decodeUTF8 cs
-decodeUTF8 (c:c':c'':cs) | '\xe0' <= c && c <= '\xef' &&
- '\x80' <= c' && c' <= '\xbf' &&
- '\x80' <= c'' && c'' <= '\xbf' =
- toEnum ((fromEnum c `mod` 0x10 * 0x1000) + (fromEnum c' `mod` 0x40) * 0x40 + fromEnum c'' `mod` 0x40) : decodeUTF8 cs
-decodeUTF8 s = s ---- AR workaround 22/6/2006
-----decodeUTF8 _ = error "UniChar.decodeUTF8: bad data"
-
-encodeUTF8 :: String -> String
-encodeUTF8 "" = ""
-encodeUTF8 (c:cs) =
- if c > '\x0000' && c < '\x0080' then
- c : encodeUTF8 cs
- else if c < toEnum 0x0800 then
- let i = fromEnum c
- in toEnum (0xc0 + i `div` 0x40) :
- toEnum (0x80 + i `mod` 0x40) :
- encodeUTF8 cs
- else
- let i = fromEnum c
- in toEnum (0xe0 + i `div` 0x1000) :
- toEnum (0x80 + (i `mod` 0x1000) `div` 0x40) :
- toEnum (0x80 + i `mod` 0x40) :
- encodeUTF8 cs