use parser combinators to parse the shell commands. simplified CommandLine type

This commit is contained in:
kr.angelov
2008-06-05 07:33:42 +00:00
parent 4606271031
commit 0625cbb869
15 changed files with 164 additions and 1478 deletions

View File

@@ -37,6 +37,7 @@ library
PGF.Parsing.FCFG.Active PGF.Parsing.FCFG.Active
PGF.Parsing.FCFG.Incremental PGF.Parsing.FCFG.Incremental
PGF.Parsing.FCFG PGF.Parsing.FCFG
PGF.ExprSyntax
PGF.Raw.Parse PGF.Raw.Parse
PGF.Raw.Print PGF.Raw.Print
PGF.Raw.Convert PGF.Raw.Convert
@@ -79,9 +80,6 @@ executable gf3
GF.Source.PrintGF GF.Source.PrintGF
GF.JavaScript.AbsJS GF.JavaScript.AbsJS
GF.JavaScript.PrintJS GF.JavaScript.PrintJS
GF.Command.LexGFShell
GF.Command.AbsGFShell
GF.Command.PrintGFShell
GF.Infra.CompactPrint GF.Infra.CompactPrint
GF.Text.UTF8 GF.Text.UTF8
GF.Data.MultiMap GF.Data.MultiMap
@@ -91,8 +89,6 @@ executable gf3
GF.Infra.PrintClass GF.Infra.PrintClass
GF.Compile.GenerateFCFG GF.Compile.GenerateFCFG
GF.Data.ErrM GF.Data.ErrM
GF.Command.ParGFShell
GF.Command.PPrTree
GF.Source.ParGF GF.Source.ParGF
GF.Data.Operations GF.Data.Operations
GF.Infra.Ident GF.Infra.Ident
@@ -104,6 +100,9 @@ executable gf3
GF.Infra.UseIO GF.Infra.UseIO
GF.Command.Commands GF.Command.Commands
GF.Command.Interpreter GF.Command.Interpreter
GF.Command.Abstract
GF.Command.Parse
GF.Command.Importing
GF.Infra.Modules GF.Infra.Modules
GF.Grammar.Grammar GF.Grammar.Grammar
GF.Source.GrammarToSource GF.Source.GrammarToSource
@@ -139,7 +138,6 @@ executable gf3
GF.Source.SourceToGrammar GF.Source.SourceToGrammar
GF.Compile.GetGrammar GF.Compile.GetGrammar
GF.Compile GF.Compile
GF.Command.Importing
GF.System.Readline GF.System.Readline
PGF PGF
PGF.CId PGF.CId

View File

@@ -1,42 +0,0 @@
module GF.Command.AbsGFShell where
-- Haskell module generated by the BNF converter
newtype Ident = Ident String deriving (Eq,Ord,Show)
data CommandLine =
CLine [Pipe]
| CEmpty
deriving (Eq,Ord,Show)
data Pipe =
PComm [Command]
deriving (Eq,Ord,Show)
data Command =
Comm Ident [Option] Argument
| CNoarg Ident [Option]
deriving (Eq,Ord,Show)
data Option =
OOpt Ident
| OFlag Ident Value
deriving (Eq,Ord,Show)
data Value =
VId Ident
| VInt Integer
deriving (Eq,Ord,Show)
data Argument =
ATree Tree
deriving (Eq,Ord,Show)
data Tree =
TApp Ident [Tree]
| TAbs [Ident] Tree
| TId Ident
| TInt Integer
| TStr String
| TFloat Double
deriving (Eq,Ord,Show)

View File

@@ -0,0 +1,28 @@
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
deriving (Eq,Ord,Show)
data Argument
= AExp Exp
| ANoArg
deriving (Eq,Ord,Show)

View File

@@ -9,9 +9,8 @@ module GF.Command.Commands (
CommandOutput CommandOutput
) where ) where
import GF.Command.AbsGFShell import GF.Command.Abstract
import GF.Command.PPrTree import GF.Command.Parse
import GF.Command.ParGFShell
import PGF import PGF
import PGF.CId import PGF.CId
import PGF.ShowLinearize import PGF.ShowLinearize
@@ -66,24 +65,24 @@ commandHelp full (co,info) = unlines $ [
] else [] ] else []
valIdOpts :: String -> String -> [Option] -> String valIdOpts :: String -> String -> [Option] -> String
valIdOpts flag def opts = case valOpts flag (VId (Ident def)) opts of valIdOpts flag def opts = case valOpts flag (VId def) opts of
VId (Ident v) -> v VId v -> v
_ -> def _ -> def
valIntOpts :: String -> Integer -> [Option] -> Int valIntOpts :: String -> Integer -> [Option] -> Int
valIntOpts flag def opts = fromInteger $ case valOpts flag (VInt def) opts of valIntOpts flag def opts = fromInteger $ case valOpts flag (VInt def) opts of
VInt v -> v VInt v -> v
_ -> def _ -> def
valOpts :: String -> Value -> [Option] -> Value valOpts :: String -> Value -> [Option] -> Value
valOpts flag def opts = case lookup flag flags of valOpts flag def opts = case lookup flag flags of
Just v -> v Just v -> v
_ -> def _ -> def
where where
flags = [(f,v) | OFlag (Ident f) v <- opts] flags = [(f,v) | OFlag f v <- opts]
isOpt :: String -> [Option] -> Bool isOpt :: String -> [Option] -> Bool
isOpt o opts = elem o [x | OOpt (Ident x) <- opts] isOpt o opts = elem o [x | OOpt x <- opts]
-- this list must be kept sorted by the command name! -- this list must be kept sorted by the command name!
allCommands :: PGF -> Map.Map String CommandInfo allCommands :: PGF -> Map.Map String CommandInfo

View File

@@ -1,27 +0,0 @@
--entrypoints CommandLine, Tree ;
CLine. CommandLine ::= [Pipe] ;
CEmpty. CommandLine ::= ;
PComm. Pipe ::= [Command] ;
Comm. Command ::= Ident [Option] Argument ;
CNoarg. Command ::= Ident [Option] ;
OOpt. Option ::= "-" Ident ;
OFlag. Option ::= "-" Ident "=" Value ;
VId. Value ::= Ident ;
VInt. Value ::= Integer ;
ATree. Argument ::= Tree ;
TApp. Tree1 ::= Ident [Tree2] ;
TAbs. Tree ::= "\\" [Ident] "->" Tree ;
TId. Tree2 ::= Ident ;
TInt. Tree2 ::= Integer ;
TStr. Tree2 ::= String ;
TFloat. Tree2 ::= Double ;
coercions Tree 2 ;
separator nonempty Pipe ";" ;
separator nonempty Command "|" ;
terminator Option "" ;
terminator nonempty Tree2 "" ;
terminator nonempty Ident "," ;

View File

@@ -5,9 +5,8 @@ module GF.Command.Interpreter (
) where ) where
import GF.Command.Commands import GF.Command.Commands
import GF.Command.AbsGFShell import GF.Command.Abstract
import GF.Command.PPrTree import GF.Command.Parse
import GF.Command.ParGFShell
import PGF import PGF
import PGF.Data import PGF.Data
import PGF.Macros import PGF.Macros
@@ -26,15 +25,16 @@ mkCommandEnv :: PGF -> CommandEnv
mkCommandEnv pgf = CommandEnv pgf (allCommands pgf) mkCommandEnv pgf = CommandEnv pgf (allCommands pgf)
interpretCommandLine :: CommandEnv -> String -> IO () interpretCommandLine :: CommandEnv -> String -> IO ()
interpretCommandLine env line = case (pCommandLine (myLexer line)) of interpretCommandLine env line =
Ok CEmpty -> return () case readCommandLine line of
Ok (CLine pipes) -> do res <- runInterruptibly (mapM_ interPipe pipes) Just [] -> return ()
case res of Just pipes -> do res <- runInterruptibly (mapM_ interPipe pipes)
Left ex -> print ex case res of
Right x -> return x Left ex -> print ex
_ -> putStrLn "command not parsed" Right x -> return x
Nothing -> putStrLn "command not parsed"
where where
interPipe (PComm cs) = do interPipe cs = do
(_,s) <- intercs ([],"") cs (_,s) <- intercs ([],"") cs
putStrLn s putStrLn s
intercs treess [] = return treess intercs treess [] = return treess
@@ -60,8 +60,8 @@ interpret env trees0 comm = case lookCommand co comms of
comms = commands env comms = commands env
checkOpts info = checkOpts info =
case case
[o | OOpt (Ident o) <- opts, notElem o (options info)] ++ [o | OOpt o <- opts, notElem o (options info)] ++
[o | OFlag (Ident o) _ <- opts, notElem o (flags info)] [o | OFlag o _ <- opts, notElem o (flags info)]
of of
[] -> return () [] -> return ()
[o] -> putStrLn $ "option not interpreted: " ++ o [o] -> putStrLn $ "option not interpreted: " ++ o
@@ -70,8 +70,8 @@ interpret env trees0 comm = case lookCommand co comms of
-- analyse command parse tree to a uniform datastructure, normalizing comm name -- analyse command parse tree to a uniform datastructure, normalizing comm name
getCommand :: Command -> [Exp] -> (String,[Option],[Exp]) getCommand :: Command -> [Exp] -> (String,[Option],[Exp])
getCommand co ts = case co of getCommand co ts = case co of
Comm (Ident c) opts (ATree t) -> (getOp c,opts,[tree2exp t]) -- ignore piped Command c opts (AExp t) -> (getOp c,opts,[t]) -- ignore piped
CNoarg (Ident c) opts -> (getOp c,opts,ts) -- use piped Command c opts ANoArg -> (getOp c,opts,ts) -- use piped
where where
-- abbreviation convention from gf -- abbreviation convention from gf
getOp s = case break (=='_') s of getOp s = case break (=='_') s of

File diff suppressed because one or more lines are too long

View File

@@ -1,26 +0,0 @@
module GF.Command.PPrTree (tree2exp, exp2tree) where
import PGF.CId
import PGF.Data
import GF.Command.AbsGFShell
tree2exp t = case t of
TApp f ts -> EApp (i2i f) (map tree2exp ts)
TAbs xs t -> EAbs (map i2i xs) (tree2exp t)
TId c -> EApp (i2i c) []
TInt i -> EInt i
TStr s -> EStr s
TFloat d -> EFloat d
where
i2i (Ident s) = mkCId s
exp2tree t = case t of
(EAbs xs e) -> TAbs (map i4i xs) (exp2tree e)
(EApp f []) -> TId (i4i f)
(EApp f es) -> TApp (i4i f) (map exp2tree es)
(EInt i) -> TInt i
(EStr i) -> TStr i
(EFloat i) -> TFloat i
(EMeta i) -> TId (Ident "?") ----
where
i4i s = Ident (prCId s)

View File

@@ -1,809 +0,0 @@
{-# OPTIONS -fglasgow-exts -cpp #-}
{-# OPTIONS -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-}
module GF.Command.ParGFShell where
import GF.Command.AbsGFShell
import GF.Command.LexGFShell
import GF.Data.ErrM
#if __GLASGOW_HASKELL__ >= 503
import Data.Array
#else
import Array
#endif
#if __GLASGOW_HASKELL__ >= 503
import GHC.Exts
#else
import GlaExts
#endif
-- parser produced by Happy Version 1.16
newtype HappyAbsSyn = HappyAbsSyn (() -> ())
happyIn17 :: (Ident) -> (HappyAbsSyn )
happyIn17 x = unsafeCoerce# x
{-# INLINE happyIn17 #-}
happyOut17 :: (HappyAbsSyn ) -> (Ident)
happyOut17 x = unsafeCoerce# x
{-# INLINE happyOut17 #-}
happyIn18 :: (Integer) -> (HappyAbsSyn )
happyIn18 x = unsafeCoerce# x
{-# INLINE happyIn18 #-}
happyOut18 :: (HappyAbsSyn ) -> (Integer)
happyOut18 x = unsafeCoerce# x
{-# INLINE happyOut18 #-}
happyIn19 :: (String) -> (HappyAbsSyn )
happyIn19 x = unsafeCoerce# x
{-# INLINE happyIn19 #-}
happyOut19 :: (HappyAbsSyn ) -> (String)
happyOut19 x = unsafeCoerce# x
{-# INLINE happyOut19 #-}
happyIn20 :: (Double) -> (HappyAbsSyn )
happyIn20 x = unsafeCoerce# x
{-# INLINE happyIn20 #-}
happyOut20 :: (HappyAbsSyn ) -> (Double)
happyOut20 x = unsafeCoerce# x
{-# INLINE happyOut20 #-}
happyIn21 :: (CommandLine) -> (HappyAbsSyn )
happyIn21 x = unsafeCoerce# x
{-# INLINE happyIn21 #-}
happyOut21 :: (HappyAbsSyn ) -> (CommandLine)
happyOut21 x = unsafeCoerce# x
{-# INLINE happyOut21 #-}
happyIn22 :: (Pipe) -> (HappyAbsSyn )
happyIn22 x = unsafeCoerce# x
{-# INLINE happyIn22 #-}
happyOut22 :: (HappyAbsSyn ) -> (Pipe)
happyOut22 x = unsafeCoerce# x
{-# INLINE happyOut22 #-}
happyIn23 :: (Command) -> (HappyAbsSyn )
happyIn23 x = unsafeCoerce# x
{-# INLINE happyIn23 #-}
happyOut23 :: (HappyAbsSyn ) -> (Command)
happyOut23 x = unsafeCoerce# x
{-# INLINE happyOut23 #-}
happyIn24 :: (Option) -> (HappyAbsSyn )
happyIn24 x = unsafeCoerce# x
{-# INLINE happyIn24 #-}
happyOut24 :: (HappyAbsSyn ) -> (Option)
happyOut24 x = unsafeCoerce# x
{-# INLINE happyOut24 #-}
happyIn25 :: (Value) -> (HappyAbsSyn )
happyIn25 x = unsafeCoerce# x
{-# INLINE happyIn25 #-}
happyOut25 :: (HappyAbsSyn ) -> (Value)
happyOut25 x = unsafeCoerce# x
{-# INLINE happyOut25 #-}
happyIn26 :: (Argument) -> (HappyAbsSyn )
happyIn26 x = unsafeCoerce# x
{-# INLINE happyIn26 #-}
happyOut26 :: (HappyAbsSyn ) -> (Argument)
happyOut26 x = unsafeCoerce# x
{-# INLINE happyOut26 #-}
happyIn27 :: (Tree) -> (HappyAbsSyn )
happyIn27 x = unsafeCoerce# x
{-# INLINE happyIn27 #-}
happyOut27 :: (HappyAbsSyn ) -> (Tree)
happyOut27 x = unsafeCoerce# x
{-# INLINE happyOut27 #-}
happyIn28 :: (Tree) -> (HappyAbsSyn )
happyIn28 x = unsafeCoerce# x
{-# INLINE happyIn28 #-}
happyOut28 :: (HappyAbsSyn ) -> (Tree)
happyOut28 x = unsafeCoerce# x
{-# INLINE happyOut28 #-}
happyIn29 :: (Tree) -> (HappyAbsSyn )
happyIn29 x = unsafeCoerce# x
{-# INLINE happyIn29 #-}
happyOut29 :: (HappyAbsSyn ) -> (Tree)
happyOut29 x = unsafeCoerce# x
{-# INLINE happyOut29 #-}
happyIn30 :: ([Pipe]) -> (HappyAbsSyn )
happyIn30 x = unsafeCoerce# x
{-# INLINE happyIn30 #-}
happyOut30 :: (HappyAbsSyn ) -> ([Pipe])
happyOut30 x = unsafeCoerce# x
{-# INLINE happyOut30 #-}
happyIn31 :: ([Command]) -> (HappyAbsSyn )
happyIn31 x = unsafeCoerce# x
{-# INLINE happyIn31 #-}
happyOut31 :: (HappyAbsSyn ) -> ([Command])
happyOut31 x = unsafeCoerce# x
{-# INLINE happyOut31 #-}
happyIn32 :: ([Option]) -> (HappyAbsSyn )
happyIn32 x = unsafeCoerce# x
{-# INLINE happyIn32 #-}
happyOut32 :: (HappyAbsSyn ) -> ([Option])
happyOut32 x = unsafeCoerce# x
{-# INLINE happyOut32 #-}
happyIn33 :: ([Tree]) -> (HappyAbsSyn )
happyIn33 x = unsafeCoerce# x
{-# INLINE happyIn33 #-}
happyOut33 :: (HappyAbsSyn ) -> ([Tree])
happyOut33 x = unsafeCoerce# x
{-# INLINE happyOut33 #-}
happyIn34 :: ([Ident]) -> (HappyAbsSyn )
happyIn34 x = unsafeCoerce# x
{-# INLINE happyIn34 #-}
happyOut34 :: (HappyAbsSyn ) -> ([Ident])
happyOut34 x = unsafeCoerce# x
{-# INLINE happyOut34 #-}
happyInTok :: Token -> (HappyAbsSyn )
happyInTok x = unsafeCoerce# x
{-# INLINE happyInTok #-}
happyOutTok :: (HappyAbsSyn ) -> Token
happyOutTok x = unsafeCoerce# x
{-# INLINE happyOutTok #-}
happyActOffsets :: HappyAddr
happyActOffsets = HappyA# "\x8d\x00\x8d\x00\x8d\x00\x91\x00\x16\x00\x80\x00\x89\x00\x80\x00\x89\x00\x7c\x00\x7c\x00\x00\x00\x89\x00\x7c\x00\x7c\x00\x00\x00\x7b\x00\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x00\x73\x00\x80\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x79\x00\x6c\x00\x72\x00\x69\x00\x00\x00\x69\x00\x89\x00\x00\x00\x69\x00\x00\x00\x62\x00\x5f\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x5f\x00\x5d\x00\x54\x00\x54\x00\x54\x00\x00\x00\x60\x00\x52\x00\x00\x00\x3a\x00\x3a\x00\x6a\x00\x00\x00\x24\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x16\x00\x00\x00\x00\x00\x00\x00"#
happyGotoOffsets :: HappyAddr
happyGotoOffsets = HappyA# "\x1f\x00\x09\x00\x35\x00\x2a\x00\x90\x00\x49\x00\x70\x00\x5e\x00\x7d\x00\x33\x00\x34\x00\x42\x00\x1b\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x5a\x00\x00\x00\x00\x00\x00\x00\x12\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x29\x00\x22\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x00\x87\x00\x00\x00\x00\x00\x00\x00"#
happyDefActions :: HappyAddr
happyDefActions = HappyA# "\xec\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\xff\x00\x00\x00\x00\x00\x00\xf1\xff\x00\x00\x00\x00\xdf\xff\xde\xff\xdd\xff\xdc\xff\xd4\xff\x00\x00\x00\x00\xf0\xff\xef\xff\xee\xff\x00\x00\xd6\xff\xd8\xff\x00\x00\xda\xff\x00\x00\xeb\xff\x00\x00\xdf\xff\xe0\xff\x00\x00\xe2\xff\x00\x00\x00\x00\x00\x00\xe4\xff\xe6\xff\xe5\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\xff\xe8\xff\x00\x00\xe3\xff\x00\x00\x00\x00\xe9\xff\xd5\xff\x00\x00\xd3\xff\xd2\xff\xd1\xff\xdb\xff\xea\xff\xd7\xff\xd9\xff\x00\x00\x00\x00\xe7\xff\xe1\xff"#
happyCheck :: HappyAddr
happyCheck = HappyA# "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x00\x03\x00\x00\x00\x00\x00\x01\x00\x02\x00\x03\x00\x05\x00\x06\x00\x0a\x00\x0c\x00\x11\x00\x11\x00\x11\x00\x10\x00\x0c\x00\x0e\x00\x01\x00\x07\x00\x10\x00\x00\x00\x01\x00\x02\x00\x03\x00\x00\x00\x0a\x00\x0b\x00\x00\x00\x04\x00\x05\x00\x06\x00\x0f\x00\x0c\x00\x06\x00\x00\x00\x06\x00\x10\x00\x0d\x00\x0e\x00\x05\x00\x06\x00\x0e\x00\x07\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x0e\x00\x05\x00\x06\x00\x06\x00\x06\x00\x00\x00\x01\x00\x02\x00\x03\x00\x0d\x00\x0e\x00\x0e\x00\x07\x00\x0a\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x00\x00\x01\x00\x02\x00\x03\x00\x00\x00\x01\x00\x02\x00\x03\x00\x0f\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x04\x00\x0a\x00\x0b\x00\x0c\x00\x00\x00\x01\x00\x02\x00\x03\x00\x00\x00\x01\x00\x02\x00\x03\x00\x02\x00\x0f\x00\x0a\x00\x0b\x00\x0c\x00\x0a\x00\x0a\x00\x0b\x00\x0c\x00\x01\x00\x0a\x00\x03\x00\x0f\x00\x05\x00\x00\x00\x01\x00\x02\x00\x03\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0f\x00\x07\x00\x0a\x00\x0f\x00\x0c\x00\x00\x00\x01\x00\x02\x00\x03\x00\x08\x00\x0f\x00\x03\x00\x09\x00\x05\x00\x0a\x00\x00\x00\x01\x00\x0c\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x05\x00\x08\x00\x00\x00\x01\x00\x01\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x08\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"#
happyTable :: HappyAddr
happyTable = HappyA# "\x00\x00\x10\x00\x10\x00\x10\x00\x35\x00\x12\x00\x13\x00\x14\x00\x15\x00\x1d\x00\x12\x00\x13\x00\x14\x00\x15\x00\x32\x00\x1e\x00\x10\x00\x16\x00\x3f\x00\x36\x00\x11\x00\x37\x00\x16\x00\x22\x00\x31\x00\x3b\x00\x3d\x00\x12\x00\x13\x00\x14\x00\x15\x00\x1d\x00\x10\x00\x1a\x00\x1d\x00\x33\x00\x20\x00\x1e\x00\xff\xff\x16\x00\x1e\x00\x1d\x00\x41\x00\x17\x00\x34\x00\x22\x00\x20\x00\x1e\x00\x42\x00\x2f\x00\x3a\x00\x1d\x00\x1d\x00\x1d\x00\x43\x00\x22\x00\x20\x00\x1e\x00\x1e\x00\x31\x00\x24\x00\x13\x00\x14\x00\x15\x00\x21\x00\x22\x00\x1f\x00\x3b\x00\x10\x00\x41\x00\x25\x00\x2b\x00\x27\x00\x24\x00\x13\x00\x14\x00\x15\x00\x24\x00\x13\x00\x14\x00\x15\x00\x1c\x00\x2a\x00\x25\x00\x2b\x00\x27\x00\x45\x00\x25\x00\x47\x00\x27\x00\x24\x00\x13\x00\x14\x00\x15\x00\x24\x00\x13\x00\x14\x00\x15\x00\x46\x00\xff\xff\x25\x00\x3c\x00\x27\x00\x10\x00\x25\x00\x26\x00\x27\x00\x31\x00\x10\x00\x29\x00\xff\xff\x19\x00\x24\x00\x13\x00\x14\x00\x15\x00\x10\x00\x1a\x00\x1b\x00\x1c\x00\xff\xff\x39\x00\x29\x00\xff\xff\x27\x00\x12\x00\x13\x00\x14\x00\x15\x00\x3a\x00\xff\xff\x29\x00\x3f\x00\x19\x00\x10\x00\x2c\x00\x2d\x00\x23\x00\x10\x00\x1a\x00\x1b\x00\x1c\x00\x19\x00\x46\x00\x2c\x00\x2d\x00\x31\x00\x10\x00\x1a\x00\x1b\x00\x1c\x00\x10\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
happyReduceArr = array (14, 46) [
(14 , happyReduce_14),
(15 , happyReduce_15),
(16 , happyReduce_16),
(17 , happyReduce_17),
(18 , happyReduce_18),
(19 , happyReduce_19),
(20 , happyReduce_20),
(21 , happyReduce_21),
(22 , happyReduce_22),
(23 , happyReduce_23),
(24 , happyReduce_24),
(25 , happyReduce_25),
(26 , happyReduce_26),
(27 , happyReduce_27),
(28 , happyReduce_28),
(29 , happyReduce_29),
(30 , happyReduce_30),
(31 , happyReduce_31),
(32 , happyReduce_32),
(33 , happyReduce_33),
(34 , happyReduce_34),
(35 , happyReduce_35),
(36 , happyReduce_36),
(37 , happyReduce_37),
(38 , happyReduce_38),
(39 , happyReduce_39),
(40 , happyReduce_40),
(41 , happyReduce_41),
(42 , happyReduce_42),
(43 , happyReduce_43),
(44 , happyReduce_44),
(45 , happyReduce_45),
(46 , happyReduce_46)
]
happy_n_terms = 16 :: Int
happy_n_nonterms = 18 :: Int
happyReduce_14 = happySpecReduce_1 0# happyReduction_14
happyReduction_14 happy_x_1
= case happyOutTok happy_x_1 of { (PT _ (TV happy_var_1)) ->
happyIn17
(Ident happy_var_1
)}
happyReduce_15 = happySpecReduce_1 1# happyReduction_15
happyReduction_15 happy_x_1
= case happyOutTok happy_x_1 of { (PT _ (TI happy_var_1)) ->
happyIn18
((read happy_var_1) :: Integer
)}
happyReduce_16 = happySpecReduce_1 2# happyReduction_16
happyReduction_16 happy_x_1
= case happyOutTok happy_x_1 of { (PT _ (TL happy_var_1)) ->
happyIn19
(happy_var_1
)}
happyReduce_17 = happySpecReduce_1 3# happyReduction_17
happyReduction_17 happy_x_1
= case happyOutTok happy_x_1 of { (PT _ (TD happy_var_1)) ->
happyIn20
((read happy_var_1) :: Double
)}
happyReduce_18 = happySpecReduce_1 4# happyReduction_18
happyReduction_18 happy_x_1
= case happyOut30 happy_x_1 of { happy_var_1 ->
happyIn21
(CLine happy_var_1
)}
happyReduce_19 = happySpecReduce_0 4# happyReduction_19
happyReduction_19 = happyIn21
(CEmpty
)
happyReduce_20 = happySpecReduce_1 5# happyReduction_20
happyReduction_20 happy_x_1
= case happyOut31 happy_x_1 of { happy_var_1 ->
happyIn22
(PComm happy_var_1
)}
happyReduce_21 = happySpecReduce_3 6# happyReduction_21
happyReduction_21 happy_x_3
happy_x_2
happy_x_1
= case happyOut17 happy_x_1 of { happy_var_1 ->
case happyOut32 happy_x_2 of { happy_var_2 ->
case happyOut26 happy_x_3 of { happy_var_3 ->
happyIn23
(Comm happy_var_1 (reverse happy_var_2) happy_var_3
)}}}
happyReduce_22 = happySpecReduce_2 6# happyReduction_22
happyReduction_22 happy_x_2
happy_x_1
= case happyOut17 happy_x_1 of { happy_var_1 ->
case happyOut32 happy_x_2 of { happy_var_2 ->
happyIn23
(CNoarg happy_var_1 (reverse happy_var_2)
)}}
happyReduce_23 = happySpecReduce_2 7# happyReduction_23
happyReduction_23 happy_x_2
happy_x_1
= case happyOut17 happy_x_2 of { happy_var_2 ->
happyIn24
(OOpt happy_var_2
)}
happyReduce_24 = happyReduce 4# 7# happyReduction_24
happyReduction_24 (happy_x_4 `HappyStk`
happy_x_3 `HappyStk`
happy_x_2 `HappyStk`
happy_x_1 `HappyStk`
happyRest)
= case happyOut17 happy_x_2 of { happy_var_2 ->
case happyOut25 happy_x_4 of { happy_var_4 ->
happyIn24
(OFlag happy_var_2 happy_var_4
) `HappyStk` happyRest}}
happyReduce_25 = happySpecReduce_1 8# happyReduction_25
happyReduction_25 happy_x_1
= case happyOut17 happy_x_1 of { happy_var_1 ->
happyIn25
(VId happy_var_1
)}
happyReduce_26 = happySpecReduce_1 8# happyReduction_26
happyReduction_26 happy_x_1
= case happyOut18 happy_x_1 of { happy_var_1 ->
happyIn25
(VInt happy_var_1
)}
happyReduce_27 = happySpecReduce_1 9# happyReduction_27
happyReduction_27 happy_x_1
= case happyOut28 happy_x_1 of { happy_var_1 ->
happyIn26
(ATree happy_var_1
)}
happyReduce_28 = happySpecReduce_2 10# happyReduction_28
happyReduction_28 happy_x_2
happy_x_1
= case happyOut17 happy_x_1 of { happy_var_1 ->
case happyOut33 happy_x_2 of { happy_var_2 ->
happyIn27
(TApp happy_var_1 happy_var_2
)}}
happyReduce_29 = happySpecReduce_1 10# happyReduction_29
happyReduction_29 happy_x_1
= case happyOut29 happy_x_1 of { happy_var_1 ->
happyIn27
(happy_var_1
)}
happyReduce_30 = happyReduce 4# 11# happyReduction_30
happyReduction_30 (happy_x_4 `HappyStk`
happy_x_3 `HappyStk`
happy_x_2 `HappyStk`
happy_x_1 `HappyStk`
happyRest)
= case happyOut34 happy_x_2 of { happy_var_2 ->
case happyOut28 happy_x_4 of { happy_var_4 ->
happyIn28
(TAbs happy_var_2 happy_var_4
) `HappyStk` happyRest}}
happyReduce_31 = happySpecReduce_1 11# happyReduction_31
happyReduction_31 happy_x_1
= case happyOut27 happy_x_1 of { happy_var_1 ->
happyIn28
(happy_var_1
)}
happyReduce_32 = happySpecReduce_1 12# happyReduction_32
happyReduction_32 happy_x_1
= case happyOut17 happy_x_1 of { happy_var_1 ->
happyIn29
(TId happy_var_1
)}
happyReduce_33 = happySpecReduce_1 12# happyReduction_33
happyReduction_33 happy_x_1
= case happyOut18 happy_x_1 of { happy_var_1 ->
happyIn29
(TInt happy_var_1
)}
happyReduce_34 = happySpecReduce_1 12# happyReduction_34
happyReduction_34 happy_x_1
= case happyOut19 happy_x_1 of { happy_var_1 ->
happyIn29
(TStr happy_var_1
)}
happyReduce_35 = happySpecReduce_1 12# happyReduction_35
happyReduction_35 happy_x_1
= case happyOut20 happy_x_1 of { happy_var_1 ->
happyIn29
(TFloat happy_var_1
)}
happyReduce_36 = happySpecReduce_3 12# happyReduction_36
happyReduction_36 happy_x_3
happy_x_2
happy_x_1
= case happyOut28 happy_x_2 of { happy_var_2 ->
happyIn29
(happy_var_2
)}
happyReduce_37 = happySpecReduce_1 13# happyReduction_37
happyReduction_37 happy_x_1
= case happyOut22 happy_x_1 of { happy_var_1 ->
happyIn30
((:[]) happy_var_1
)}
happyReduce_38 = happySpecReduce_3 13# happyReduction_38
happyReduction_38 happy_x_3
happy_x_2
happy_x_1
= case happyOut22 happy_x_1 of { happy_var_1 ->
case happyOut30 happy_x_3 of { happy_var_3 ->
happyIn30
((:) happy_var_1 happy_var_3
)}}
happyReduce_39 = happySpecReduce_1 14# happyReduction_39
happyReduction_39 happy_x_1
= case happyOut23 happy_x_1 of { happy_var_1 ->
happyIn31
((:[]) happy_var_1
)}
happyReduce_40 = happySpecReduce_3 14# happyReduction_40
happyReduction_40 happy_x_3
happy_x_2
happy_x_1
= case happyOut23 happy_x_1 of { happy_var_1 ->
case happyOut31 happy_x_3 of { happy_var_3 ->
happyIn31
((:) happy_var_1 happy_var_3
)}}
happyReduce_41 = happySpecReduce_0 15# happyReduction_41
happyReduction_41 = happyIn32
([]
)
happyReduce_42 = happySpecReduce_2 15# happyReduction_42
happyReduction_42 happy_x_2
happy_x_1
= case happyOut32 happy_x_1 of { happy_var_1 ->
case happyOut24 happy_x_2 of { happy_var_2 ->
happyIn32
(flip (:) happy_var_1 happy_var_2
)}}
happyReduce_43 = happySpecReduce_1 16# happyReduction_43
happyReduction_43 happy_x_1
= case happyOut29 happy_x_1 of { happy_var_1 ->
happyIn33
((:[]) happy_var_1
)}
happyReduce_44 = happySpecReduce_2 16# happyReduction_44
happyReduction_44 happy_x_2
happy_x_1
= case happyOut29 happy_x_1 of { happy_var_1 ->
case happyOut33 happy_x_2 of { happy_var_2 ->
happyIn33
((:) happy_var_1 happy_var_2
)}}
happyReduce_45 = happySpecReduce_2 17# happyReduction_45
happyReduction_45 happy_x_2
happy_x_1
= case happyOut17 happy_x_1 of { happy_var_1 ->
happyIn34
((:[]) happy_var_1
)}
happyReduce_46 = happySpecReduce_3 17# happyReduction_46
happyReduction_46 happy_x_3
happy_x_2
happy_x_1
= case happyOut17 happy_x_1 of { happy_var_1 ->
case happyOut34 happy_x_3 of { happy_var_3 ->
happyIn34
((:) happy_var_1 happy_var_3
)}}
happyNewToken action sts stk [] =
happyDoAction 15# notHappyAtAll action sts stk []
happyNewToken action sts stk (tk:tks) =
let cont i = happyDoAction i tk action sts stk tks in
case tk of {
PT _ (TS "-") -> cont 1#;
PT _ (TS "=") -> cont 2#;
PT _ (TS "\\") -> cont 3#;
PT _ (TS "->") -> cont 4#;
PT _ (TS "(") -> cont 5#;
PT _ (TS ")") -> cont 6#;
PT _ (TS ";") -> cont 7#;
PT _ (TS "|") -> cont 8#;
PT _ (TS ",") -> cont 9#;
PT _ (TV happy_dollar_dollar) -> cont 10#;
PT _ (TI happy_dollar_dollar) -> cont 11#;
PT _ (TL happy_dollar_dollar) -> cont 12#;
PT _ (TD happy_dollar_dollar) -> cont 13#;
_ -> cont 14#;
_ -> 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
pCommandLine tks = happySomeParser where
happySomeParser = happyThen (happyParse 0# tks) (\x -> happyReturn (happyOut21 x))
pPipe tks = happySomeParser where
happySomeParser = happyThen (happyParse 1# tks) (\x -> happyReturn (happyOut22 x))
pCommand tks = happySomeParser where
happySomeParser = happyThen (happyParse 2# tks) (\x -> happyReturn (happyOut23 x))
pOption tks = happySomeParser where
happySomeParser = happyThen (happyParse 3# tks) (\x -> happyReturn (happyOut24 x))
pValue tks = happySomeParser where
happySomeParser = happyThen (happyParse 4# tks) (\x -> happyReturn (happyOut25 x))
pArgument tks = happySomeParser where
happySomeParser = happyThen (happyParse 5# tks) (\x -> happyReturn (happyOut26 x))
pTree1 tks = happySomeParser where
happySomeParser = happyThen (happyParse 6# tks) (\x -> happyReturn (happyOut27 x))
pTree tks = happySomeParser where
happySomeParser = happyThen (happyParse 7# tks) (\x -> happyReturn (happyOut28 x))
pTree2 tks = happySomeParser where
happySomeParser = happyThen (happyParse 8# tks) (\x -> happyReturn (happyOut29 x))
pListPipe tks = happySomeParser where
happySomeParser = happyThen (happyParse 9# tks) (\x -> happyReturn (happyOut30 x))
pListCommand tks = happySomeParser where
happySomeParser = happyThen (happyParse 10# tks) (\x -> happyReturn (happyOut31 x))
pListOption tks = happySomeParser where
happySomeParser = happyThen (happyParse 11# tks) (\x -> happyReturn (happyOut32 x))
pListTree2 tks = happySomeParser where
happySomeParser = happyThen (happyParse 12# tks) (\x -> happyReturn (happyOut33 x))
pListIdent tks = happySomeParser where
happySomeParser = happyThen (happyParse 13# tks) (\x -> happyReturn (happyOut34 x))
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 prToken (take 4 ts))
myLexer = tokens
{-# LINE 1 "GenericTemplate.hs" #-}
{-# LINE 1 "<built-in>" #-}
{-# LINE 1 "<command line>" #-}
{-# LINE 1 "GenericTemplate.hs" #-}
-- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp
{-# LINE 28 "GenericTemplate.hs" #-}
data Happy_IntList = HappyCons Int# Happy_IntList
{-# LINE 49 "GenericTemplate.hs" #-}
{-# LINE 59 "GenericTemplate.hs" #-}
{-# LINE 68 "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 0#, 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 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =
happyReturn1 ans
happyAccept j tk st sts (HappyStk ans _) =
(happyTcHack j (happyTcHack st)) (happyReturn1 ans)
-----------------------------------------------------------------------------
-- Arrays only: do the next action
happyDoAction i tk st
= {- nothing -}
case action of
0# -> {- nothing -}
happyFail i tk st
-1# -> {- nothing -}
happyAccept i tk st
n | (n <# (0# :: Int#)) -> {- nothing -}
(happyReduceArr ! rule) i tk st
where rule = (I# ((negateInt# ((n +# (1# :: Int#))))))
n -> {- nothing -}
happyShift new_state i tk st
where new_state = (n -# (1# :: Int#))
where off = indexShortOffAddr happyActOffsets st
off_i = (off +# i)
check = if (off_i >=# (0# :: Int#))
then (indexShortOffAddr happyCheck off_i ==# i)
else False
action | check = indexShortOffAddr happyTable off_i
| otherwise = indexShortOffAddr happyDefActions st
{-# LINE 127 "GenericTemplate.hs" #-}
indexShortOffAddr (HappyA# arr) off =
#if __GLASGOW_HASKELL__ > 500
narrow16Int# i
#elif __GLASGOW_HASKELL__ == 500
intToInt16# i
#else
(i `iShiftL#` 16#) `iShiftRA#` 16#
#endif
where
#if __GLASGOW_HASKELL__ >= 503
i = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)
#else
i = word2Int# ((high `shiftL#` 8#) `or#` low)
#endif
high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
low = int2Word# (ord# (indexCharOffAddr# arr off'))
off' = off *# 2#
data HappyAddr = HappyA# Addr#
-----------------------------------------------------------------------------
-- HappyState data type (not arrays)
{-# LINE 170 "GenericTemplate.hs" #-}
-----------------------------------------------------------------------------
-- Shifting a token
happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =
let i = (case unsafeCoerce# x of { (I# (i)) -> i }) in
-- trace "shifting the error token" $
happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)
happyShift new_state i tk st sts stk =
happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)
-- happyReduce is specialised for the common cases.
happySpecReduce_0 i fn 0# tk st sts stk
= happyFail 0# tk st sts stk
happySpecReduce_0 nt fn j tk st@((action)) sts stk
= happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)
happySpecReduce_1 i fn 0# tk st sts stk
= happyFail 0# tk st sts stk
happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')
= let r = fn v1 in
happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
happySpecReduce_2 i fn 0# tk st sts stk
= happyFail 0# tk st sts stk
happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')
= let r = fn v1 v2 in
happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
happySpecReduce_3 i fn 0# tk st sts stk
= happyFail 0# tk st sts stk
happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')
= let r = fn v1 v2 v3 in
happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
happyReduce k i fn 0# tk st sts stk
= happyFail 0# tk st sts stk
happyReduce k nt fn j tk st sts stk
= case happyDrop (k -# (1# :: Int#)) sts of
sts1@((HappyCons (st1@(action)) (_))) ->
let r = fn stk in -- it doesn't hurt to always seq here...
happyDoSeq r (happyGoto nt j tk st1 sts1 r)
happyMonadReduce k nt fn 0# tk st sts stk
= happyFail 0# tk st sts stk
happyMonadReduce k nt fn j tk st sts stk =
happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))
where sts1@((HappyCons (st1@(action)) (_))) = happyDrop k (HappyCons (st) (sts))
drop_stk = happyDropStk k stk
happyMonad2Reduce k nt fn 0# tk st sts stk
= happyFail 0# 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@((HappyCons (st1@(action)) (_))) = happyDrop k (HappyCons (st) (sts))
drop_stk = happyDropStk k stk
off = indexShortOffAddr happyGotoOffsets st1
off_i = (off +# nt)
new_state = indexShortOffAddr happyTable off_i
happyDrop 0# l = l
happyDrop n (HappyCons (_) (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
happyGoto nt j tk st =
{- nothing -}
happyDoAction j tk new_state
where off = indexShortOffAddr happyGotoOffsets st
off_i = (off +# nt)
new_state = indexShortOffAddr happyTable off_i
-----------------------------------------------------------------------------
-- Error recovery (0# is the error token)
-- parse error if we are in recovery and we fail again
happyFail 0# 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 0# tk old_st (HappyCons ((action)) (sts))
(saved_tok `HappyStk` _ `HappyStk` stk) =
-- trace ("discarding state, depth " ++ show (length stk)) $
happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))
-}
-- Enter error recovery: generate an error token,
-- save the old token and carry on.
happyFail i tk (action) sts stk =
-- trace "entering error recovery" $
happyDoAction 0# tk action sts ( (unsafeCoerce# (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.
{-# NOINLINE happyDoAction #-}
{-# NOINLINE happyTable #-}
{-# NOINLINE happyCheck #-}
{-# NOINLINE happyActOffsets #-}
{-# NOINLINE happyGotoOffsets #-}
{-# NOINLINE happyDefActions #-}
{-# 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.

View File

@@ -0,0 +1,35 @@
module GF.Command.Parse(readCommandLine) where
import PGF.ExprSyntax
import GF.Command.Abstract
import Data.Char
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.sepBy (RP.skipSpaces >> pCommand) (RP.skipSpaces >> RP.char '|')
pCommand = do
cmd <- pIdent
RP.skipSpaces
opts <- RP.many pOption
arg <- RP.option ANoArg (fmap AExp (pExp False))
return (Command cmd opts arg)
pOption = do
RP.char '-'
flg <- pIdent
RP.option (OOpt flg) (fmap (OFlag flg) (RP.char '=' >> pValue))
pValue = do
fmap VId pIdent
RP.<++
fmap (VInt . read) (RP.munch1 isDigit)

View File

@@ -1,144 +0,0 @@
{-# OPTIONS -fno-warn-incomplete-patterns #-}
module GF.Command.PrintGFShell where
-- pretty-printer generated by the BNF converter
import GF.Command.AbsGFShell
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
"[" :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 Ident where
prt _ (Ident i) = doc (showString i)
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 CommandLine where
prt i e = case e of
CLine pipes -> prPrec i 0 (concatD [prt 0 pipes])
CEmpty -> prPrec i 0 (concatD [])
instance Print Pipe where
prt i e = case e of
PComm commands -> prPrec i 0 (concatD [prt 0 commands])
prtList es = case es of
[x] -> (concatD [prt 0 x])
x:xs -> (concatD [prt 0 x , doc (showString ";") , prt 0 xs])
instance Print Command where
prt i e = case e of
Comm id options argument -> prPrec i 0 (concatD [prt 0 id , prt 0 options , prt 0 argument])
CNoarg id options -> prPrec i 0 (concatD [prt 0 id , prt 0 options])
prtList es = case es of
[x] -> (concatD [prt 0 x])
x:xs -> (concatD [prt 0 x , doc (showString "|") , prt 0 xs])
instance Print Option where
prt i e = case e of
OOpt id -> prPrec i 0 (concatD [doc (showString "-") , prt 0 id])
OFlag id value -> prPrec i 0 (concatD [doc (showString "-") , prt 0 id , doc (showString "=") , prt 0 value])
prtList es = case es of
[] -> (concatD [])
x:xs -> (concatD [prt 0 x , prt 0 xs])
instance Print Value where
prt i e = case e of
VId id -> prPrec i 0 (concatD [prt 0 id])
VInt n -> prPrec i 0 (concatD [prt 0 n])
instance Print Argument where
prt i e = case e of
ATree tree -> prPrec i 0 (concatD [prt 0 tree])
instance Print Tree where
prt i e = case e of
TApp id trees -> prPrec i 1 (concatD [prt 0 id , prt 2 trees])
TAbs ids tree -> prPrec i 0 (concatD [doc (showString "\\") , prt 0 ids , doc (showString "->") , prt 0 tree])
TId id -> prPrec i 2 (concatD [prt 0 id])
TInt n -> prPrec i 2 (concatD [prt 0 n])
TStr str -> prPrec i 2 (concatD [prt 0 str])
TFloat d -> prPrec i 2 (concatD [prt 0 d])
prtList es = case es of
[x] -> (concatD [prt 2 x])
x:xs -> (concatD [prt 2 x , prt 2 xs])

View File

@@ -128,7 +128,7 @@ mkExp t = case t of
EInt i -> C.EInt i EInt i -> C.EInt i
EFloat f -> C.EFloat f EFloat f -> C.EFloat f
K s -> C.EStr s K s -> C.EStr s
Meta (MetaSymb i) -> C.EMeta (toInteger i) Meta (MetaSymb i) -> C.EMeta i
_ -> C.EMeta 0 _ -> C.EMeta 0
mkPatt p = case p of mkPatt p = case p of
A.PP _ c ps -> C.EApp (i2i c) (map mkPatt ps) A.PP _ c ps -> C.EApp (i2i c) (map mkPatt ps)

View File

@@ -52,6 +52,7 @@ import qualified PGF.Linearize (linearize)
import PGF.Generate import PGF.Generate
import PGF.Macros import PGF.Macros
import PGF.Data import PGF.Data
import PGF.ExprSyntax
import PGF.Raw.Convert import PGF.Raw.Convert
import PGF.Raw.Parse import PGF.Raw.Parse
import PGF.Raw.Print (printTree) import PGF.Raw.Print (printTree)
@@ -61,14 +62,8 @@ import GF.Text.UTF8
import GF.Data.ErrM import GF.Data.ErrM
import Data.Char
import qualified Data.Map as Map import qualified Data.Map as Map
import Control.Monad
import System.Random (newStdGen) import System.Random (newStdGen)
import System.Directory (doesFileExist)
import qualified Text.PrettyPrint as PP
import qualified Text.ParserCombinators.ReadP as RP
--------------------------------------------------- ---------------------------------------------------
-- Interface -- Interface
@@ -148,12 +143,6 @@ generateRandom :: PGF -> Category -> IO [Exp]
-- to limit the search space. -- to limit the search space.
generateAllDepth :: PGF -> Category -> Maybe Int -> [Exp] generateAllDepth :: PGF -> Category -> Maybe Int -> [Exp]
-- | parses 'String' as an expression
readExp :: String -> Maybe Exp
-- | renders expression as 'String'
showExp :: Exp -> String
-- | List of all languages available in the given grammar. -- | List of all languages available in the given grammar.
languages :: PGF -> [Language] languages :: PGF -> [Language]
@@ -215,55 +204,6 @@ generateRandom pgf cat = do
generateAll pgf cat = generate pgf (mkCId cat) Nothing generateAll pgf cat = generate pgf (mkCId cat) Nothing
generateAllDepth pgf cat = generate pgf (mkCId cat) generateAllDepth pgf cat = generate pgf (mkCId cat)
readExp s = case RP.readP_to_S (pExp False) s of
[(x,"")] -> Just x
_ -> Nothing
pExps :: RP.ReadP [Exp]
pExps = liftM2 (:) (pExp True) pExps RP.<++ (RP.skipSpaces >> return [])
pExp :: Bool -> RP.ReadP Exp
pExp isNested = RP.skipSpaces >> (pParen RP.<++ pAbs RP.<++ pApp RP.<++ pNum RP.<++ pStr RP.<++ pMeta)
where
pParen = RP.between (RP.char '(') (RP.char ')') (pExp False)
pAbs = do xs <- RP.between (RP.char '\\') (RP.skipSpaces >> RP.string "->") (RP.sepBy1 (RP.skipSpaces >> pIdent) (RP.skipSpaces >> RP.char ','))
t <- pExp False
return (EAbs xs t)
pApp = do f <- pIdent
ts <- (if isNested then return [] else pExps)
return (EApp f ts)
pStr = RP.char '"' >> liftM EStr (RP.manyTill (pEsc RP.<++ RP.get) (RP.char '"'))
pEsc = RP.char '\\' >> RP.get
pNum = do x <- RP.munch1 isDigit
((RP.char '.' >> RP.munch1 isDigit >>= \y -> return (EFloat (read (x++"."++y))))
RP.<++
(return (EInt (read x))))
pMeta = do RP.char '?'
x <- RP.munch1 isDigit
return (EMeta (read x))
pIdent = fmap mkCId (liftM2 (:) (RP.satisfy isIdentFirst) (RP.munch isIdentRest))
isIdentFirst c = c == '_' || isLetter c
isIdentRest c = c == '_' || c == '\'' || isAlphaNum c
showExp = PP.render . ppExp False
ppExp isNested (EAbs xs t) = ppParens isNested (PP.char '\\' PP.<>
PP.hsep (PP.punctuate PP.comma (map (PP.text . prCId) xs)) PP.<+>
PP.text "->" PP.<+>
ppExp False t)
ppExp isNested (EApp f []) = PP.text (prCId f)
ppExp isNested (EApp f ts) = ppParens isNested (PP.text (prCId f) PP.<+> PP.hsep (map (ppExp True) ts))
ppExp isNested (EStr s) = PP.text (show s)
ppExp isNested (EInt n) = PP.integer n
ppExp isNested (EFloat d) = PP.double d
ppExp isNested (EMeta n) = PP.char '?' PP.<> PP.integer n
ppExp isNested (EVar id) = PP.text (prCId id)
ppParens True = PP.parens
ppParens False = id
abstractName pgf = prCId (absname pgf) abstractName pgf = prCId (absname pgf)
languages pgf = [prCId l | l <- cncnames pgf] languages pgf = [prCId l | l <- cncnames pgf]

View File

@@ -51,7 +51,7 @@ data Exp =
| EStr String -- ^ string constant | EStr String -- ^ string constant
| EInt Integer -- ^ integer constant | EInt Integer -- ^ integer constant
| EFloat Double -- ^ floating point constant | EFloat Double -- ^ floating point constant
| EMeta Integer -- ^ meta variable | EMeta Int -- ^ meta variable
| EVar CId -- ^ variable reference | EVar CId -- ^ variable reference
| EEq [Equation] -- ^ lambda function defined as a set of equations with pattern matching | EEq [Equation] -- ^ lambda function defined as a set of equations with pattern matching
deriving (Eq,Ord,Show) deriving (Eq,Ord,Show)

71
src-3.0/PGF/ExprSyntax.hs Normal file
View File

@@ -0,0 +1,71 @@
module PGF.ExprSyntax(readExp, showExp,
pExp,ppExp,
-- helpers
pIdent
) where
import PGF.CId
import PGF.Data
import Data.Char
import Control.Monad
import qualified Text.PrettyPrint as PP
import qualified Text.ParserCombinators.ReadP as RP
-- | parses 'String' as an expression
readExp :: String -> Maybe Exp
readExp s = case [x | (x,cs) <- RP.readP_to_S (pExp False) s, all isSpace cs] of
[x] -> Just x
_ -> Nothing
-- | renders expression as 'String'
showExp :: Exp -> String
showExp = PP.render . ppExp False
pExps :: RP.ReadP [Exp]
pExps = liftM2 (:) (pExp True) pExps RP.<++ (RP.skipSpaces >> return [])
pExp :: Bool -> RP.ReadP Exp
pExp isNested = RP.skipSpaces >> (pParen RP.<++ pAbs RP.<++ pApp RP.<++ pNum RP.<++ pStr RP.<++ pMeta)
where
pParen = RP.between (RP.char '(') (RP.char ')') (pExp False)
pAbs = do xs <- RP.between (RP.char '\\') (RP.skipSpaces >> RP.string "->") (RP.sepBy1 (RP.skipSpaces >> pCId) (RP.skipSpaces >> RP.char ','))
t <- pExp False
return (EAbs xs t)
pApp = do f <- pCId
ts <- (if isNested then return [] else pExps)
return (EApp f ts)
pMeta = do RP.char '?'
x <- RP.munch1 isDigit
return (EMeta (read x))
pStr = RP.char '"' >> liftM EStr (RP.manyTill (pEsc RP.<++ RP.get) (RP.char '"'))
where
pEsc = RP.char '\\' >> RP.get
pNum = do x <- RP.munch1 isDigit
((RP.char '.' >> RP.munch1 isDigit >>= \y -> return (EFloat (read (x++"."++y))))
RP.<++
(return (EInt (read x))))
pCId = fmap mkCId pIdent
pIdent = liftM2 (:) (RP.satisfy isIdentFirst) (RP.munch isIdentRest)
where
isIdentFirst c = c == '_' || isLetter c
isIdentRest c = c == '_' || c == '\'' || isAlphaNum c
ppExp isNested (EAbs xs t) = ppParens isNested (PP.char '\\' PP.<>
PP.hsep (PP.punctuate PP.comma (map (PP.text . prCId) xs)) PP.<+>
PP.text "->" PP.<+>
ppExp False t)
ppExp isNested (EApp f []) = PP.text (prCId f)
ppExp isNested (EApp f ts) = ppParens isNested (PP.text (prCId f) PP.<+> PP.hsep (map (ppExp True) ts))
ppExp isNested (EStr s) = PP.text (show s)
ppExp isNested (EInt n) = PP.integer n
ppExp isNested (EFloat d) = PP.double d
ppExp isNested (EMeta n) = PP.char '?' PP.<> PP.int n
ppExp isNested (EVar id) = PP.text (prCId id)
ppParens True = PP.parens
ppParens False = id