CSPM-Frontend 0.4.1.1 → 0.6.8.0
raw patch · 15 files changed
+1016/−879 lines, 15 filesdep +parsec2dep −haskell98dep −old-timedep −parsecdep ~containersdep ~mtldep ~sybPVP ok
version bump matches the API change (PVP)
Dependencies added: parsec2
Dependencies removed: haskell98, old-time, parsec, template-haskell
Dependency ranges changed: containers, mtl, syb
API changes (from Hackage documentation)
- Language.CSPM.AST: AssertRef :: LExp -> String -> LExp -> Decl
- Language.CSPM.AST: class (Monad m) => NodeIdSupply m
- Language.CSPM.AST: getNewNodeId :: (NodeIdSupply m) => m NodeId
- Language.CSPM.AST: instance (Data t) => Data (Labeled t)
- Language.CSPM.AST: instance (Show t) => Show (Labeled t)
- Language.CSPM.AST: instance Data Module
- Language.CSPM.AST: instance Eq (Labeled t)
- Language.CSPM.AST: instance Eq Module
- Language.CSPM.AST: instance Functor Labeled
- Language.CSPM.AST: instance Ord (Labeled t)
- Language.CSPM.AST: instance Ord Module
- Language.CSPM.AST: instance Show Module
- Language.CSPM.AST: instance Typeable Module
- Language.CSPM.AST: mkLabeledNode :: (NodeIdSupply m) => SrcLoc -> t -> m (Labeled t)
- Language.CSPM.AST: type LModule = Labeled Module
- Language.CSPM.AstUtils: relabelAst :: NodeId -> LModule -> LModule
- Language.CSPM.Frontend: compilePattern :: LModule -> LModule
- Language.CSPM.Frontend: relabelAst :: NodeId -> LModule -> LModule
- Language.CSPM.Frontend: testFrontend :: FilePath -> IO (LModule, LModule)
- Language.CSPM.Frontend: type LModule = Labeled Module
- Language.CSPM.Frontend: version :: IO String
- Language.CSPM.Parser: data PState
- Language.CSPM.Parser: instance MonadState PState (GenParser Token PState)
- Language.CSPM.Parser: instance NodeIdSupply (GenParser Token PState)
- Language.CSPM.Parser: instance Show GtMode
- Language.CSPM.PatternCompiler: compilePattern :: LModule -> LModule
- Language.CSPM.PrettyPrinter: comp_gen_list :: [LCompGen] -> Doc
- Language.CSPM.PrettyPrinter: compareTrees :: FilePath -> IO Bool
- Language.CSPM.PrettyPrinter: hcatComma :: (PP x) => [x] -> Doc
- Language.CSPM.PrettyPrinter: hcatCommaSpace :: (PP x) => [x] -> Doc
- Language.CSPM.PrettyPrinter: instance (PP x) => PP (Labeled x)
- Language.CSPM.PrettyPrinter: instance (PP x) => PP (Maybe x)
- Language.CSPM.PrettyPrinter: instance PP CompGen
- Language.CSPM.PrettyPrinter: instance PP Constructor
- Language.CSPM.PrettyPrinter: instance PP FunCase
- Language.CSPM.PrettyPrinter: instance PP Ident
- Language.CSPM.PrettyPrinter: instance PP Module
- Language.CSPM.PrettyPrinter: instance PP TypeDef
- Language.CSPM.PrettyPrinter: mapPP :: (PP x) => [x] -> [Doc]
- Language.CSPM.PrettyPrinter: prettyExp :: Exp -> Doc
- Language.CSPM.PrettyPrinter: runPretty :: FilePath -> IO String
- Language.CSPM.PrettyPrinter: simpleCompare :: FilePath -> FilePath -> IO Bool
- Language.CSPM.PrettyPrinter: to_PString :: LModule -> String
- Language.CSPM.Rename: instance Show RState
- Language.CSPM.TokenClasses: L_CSPFDR :: PrimToken
- Language.CSPM.Utils: testFrontend :: FilePath -> IO (LModule, LModule)
+ Language.CSPM.AST: Assert :: LAssertDecl -> Decl
+ Language.CSPM.AST: AssertModelCheck :: Bool -> LExp -> LFDRModels -> (Maybe LFdrExt) -> AssertDecl
+ Language.CSPM.AST: AssertRefine :: Bool -> LExp -> LRefineOp -> LExp -> AssertDecl
+ Language.CSPM.AST: AssertTauPrio :: Bool -> LExp -> LTauRefineOp -> LExp -> LExp -> AssertDecl
+ Language.CSPM.AST: DeadlockFree :: FDRModels
+ Language.CSPM.AST: Deterministic :: FDRModels
+ Language.CSPM.AST: F :: FdrExt
+ Language.CSPM.AST: FD :: FdrExt
+ Language.CSPM.AST: Failure :: RefineOp
+ Language.CSPM.AST: FailureDivergence :: RefineOp
+ Language.CSPM.AST: LivelockFree :: FDRModels
+ Language.CSPM.AST: ProcException :: LExp -> LProc -> LProc -> Exp
+ Language.CSPM.AST: ProcSet :: Exp
+ Language.CSPM.AST: RefusalTesting :: RefineOp
+ Language.CSPM.AST: RefusalTestingDiv :: RefineOp
+ Language.CSPM.AST: RevivalTesting :: RefineOp
+ Language.CSPM.AST: RevivalTestingDiv :: RefineOp
+ Language.CSPM.AST: T :: FdrExt
+ Language.CSPM.AST: TauPriorityOp :: RefineOp
+ Language.CSPM.AST: TauRefine :: TauRefineOp
+ Language.CSPM.AST: TauTrace :: TauRefineOp
+ Language.CSPM.AST: Trace :: RefineOp
+ Language.CSPM.AST: castModule :: Module a -> Module b
+ Language.CSPM.AST: data AssertDecl
+ Language.CSPM.AST: data FDRModels
+ Language.CSPM.AST: data FdrExt
+ Language.CSPM.AST: data FromParser
+ Language.CSPM.AST: data RefineOp
+ Language.CSPM.AST: data TauRefineOp
+ Language.CSPM.AST: instance Data AssertDecl
+ Language.CSPM.AST: instance Data FDRModels
+ Language.CSPM.AST: instance Data FdrExt
+ Language.CSPM.AST: instance Data FromParser
+ Language.CSPM.AST: instance Data RefineOp
+ Language.CSPM.AST: instance Data TauRefineOp
+ Language.CSPM.AST: instance Data a => Data (Module a)
+ Language.CSPM.AST: instance Data t => Data (Labeled t)
+ Language.CSPM.AST: instance Eq (Module a)
+ Language.CSPM.AST: instance Eq AssertDecl
+ Language.CSPM.AST: instance Eq FDRModels
+ Language.CSPM.AST: instance Eq FdrExt
+ Language.CSPM.AST: instance Eq FromParser
+ Language.CSPM.AST: instance Eq RefineOp
+ Language.CSPM.AST: instance Eq TauRefineOp
+ Language.CSPM.AST: instance Eq t => Eq (Labeled t)
+ Language.CSPM.AST: instance Ord (Module a)
+ Language.CSPM.AST: instance Ord AssertDecl
+ Language.CSPM.AST: instance Ord FDRModels
+ Language.CSPM.AST: instance Ord FdrExt
+ Language.CSPM.AST: instance Ord RefineOp
+ Language.CSPM.AST: instance Ord TauRefineOp
+ Language.CSPM.AST: instance Ord t => Ord (Labeled t)
+ Language.CSPM.AST: instance Show (Module a)
+ Language.CSPM.AST: instance Show AssertDecl
+ Language.CSPM.AST: instance Show FDRModels
+ Language.CSPM.AST: instance Show FdrExt
+ Language.CSPM.AST: instance Show RefineOp
+ Language.CSPM.AST: instance Show TauRefineOp
+ Language.CSPM.AST: instance Show t => Show (Labeled t)
+ Language.CSPM.AST: instance Typeable AssertDecl
+ Language.CSPM.AST: instance Typeable FDRModels
+ Language.CSPM.AST: instance Typeable FdrExt
+ Language.CSPM.AST: instance Typeable FromParser
+ Language.CSPM.AST: instance Typeable RefineOp
+ Language.CSPM.AST: instance Typeable TauRefineOp
+ Language.CSPM.AST: instance Typeable1 Module
+ Language.CSPM.AST: moduleSrcLoc :: Module a -> SrcLoc
+ Language.CSPM.AST: type LAssertDecl = Labeled AssertDecl
+ Language.CSPM.AST: type LFDRModels = Labeled FDRModels
+ Language.CSPM.AST: type LFdrExt = Labeled FdrExt
+ Language.CSPM.AST: type LRefineOp = Labeled RefineOp
+ Language.CSPM.AST: type LTauRefineOp = Labeled TauRefineOp
+ Language.CSPM.AST: type ModuleFromParser = Module FromParser
+ Language.CSPM.AstUtils: getModuleAsserts :: Module a -> [LAssertDecl]
+ Language.CSPM.AstUtils: setNodeIdsZero :: Data a => Labeled (Module a) -> Labeled (Module a)
+ Language.CSPM.Frontend: RenameInfo :: Int -> Bindings -> Bindings -> AstAnnotation UniqueIdent -> AstAnnotation UniqueIdent -> Set String -> PrologMode -> BindType -> RenameInfo
+ Language.CSPM.Frontend: benchmarkFrontend :: FilePath -> IO (ModuleFromParser, ModuleFromRenaming)
+ Language.CSPM.Frontend: bindType :: RenameInfo -> BindType
+ Language.CSPM.Frontend: castModule :: Module a -> Module b
+ Language.CSPM.Frontend: data RenameInfo
+ Language.CSPM.Frontend: identDefinition :: RenameInfo -> AstAnnotation UniqueIdent
+ Language.CSPM.Frontend: identUse :: RenameInfo -> AstAnnotation UniqueIdent
+ Language.CSPM.Frontend: localBindings :: RenameInfo -> Bindings
+ Language.CSPM.Frontend: nameSupply :: RenameInfo -> Int
+ Language.CSPM.Frontend: prettyPrintFile :: FilePath -> IO ()
+ Language.CSPM.Frontend: prologMode :: RenameInfo -> PrologMode
+ Language.CSPM.Frontend: renameModule :: ModuleFromParser -> Either RenameError (ModuleFromRenaming, RenameInfo)
+ Language.CSPM.Frontend: setNodeIdsZero :: Data a => Labeled (Module a) -> Labeled (Module a)
+ Language.CSPM.Frontend: type ModuleFromParser = Module FromParser
+ Language.CSPM.Frontend: type ModuleFromRenaming = Module FromRenaming
+ Language.CSPM.Frontend: usedNames :: RenameInfo -> Set String
+ Language.CSPM.Frontend: visible :: RenameInfo -> Bindings
+ Language.CSPM.LexHelper: filterIgnoredToken :: [Token] -> [Token]
+ Language.CSPM.LexHelper: lexInclude :: String -> IO (Either LexError [Token])
+ Language.CSPM.LexHelper: lexPlain :: String -> Either LexError [Token]
+ Language.CSPM.LexHelper: tokenIsComment :: Token -> Bool
+ Language.CSPM.PrettyPrinter: instance PP (Module a)
+ Language.CSPM.PrettyPrinter: instance PP AssertDecl
+ Language.CSPM.PrettyPrinter: instance PP FDRModels
+ Language.CSPM.PrettyPrinter: instance PP FdrExt
+ Language.CSPM.PrettyPrinter: instance PP RefineOp
+ Language.CSPM.PrettyPrinter: instance PP TauRefineOp
+ Language.CSPM.PrettyPrinter: instance PP x => PP (Labeled x)
+ Language.CSPM.PrettyPrinter: prettyPrintFile :: FilePath -> IO ()
+ Language.CSPM.Rename: RenameInfo :: Int -> Bindings -> Bindings -> AstAnnotation UniqueIdent -> AstAnnotation UniqueIdent -> Set String -> PrologMode -> BindType -> RenameInfo
+ Language.CSPM.Rename: bindType :: RenameInfo -> BindType
+ Language.CSPM.Rename: data FromRenaming
+ Language.CSPM.Rename: data RenameInfo
+ Language.CSPM.Rename: identDefinition :: RenameInfo -> AstAnnotation UniqueIdent
+ Language.CSPM.Rename: identUse :: RenameInfo -> AstAnnotation UniqueIdent
+ Language.CSPM.Rename: instance Data FromRenaming
+ Language.CSPM.Rename: instance Show RenameInfo
+ Language.CSPM.Rename: instance Typeable FromRenaming
+ Language.CSPM.Rename: localBindings :: RenameInfo -> Bindings
+ Language.CSPM.Rename: nameSupply :: RenameInfo -> Int
+ Language.CSPM.Rename: prologMode :: RenameInfo -> PrologMode
+ Language.CSPM.Rename: renameModule :: ModuleFromParser -> Either RenameError (ModuleFromRenaming, RenameInfo)
+ Language.CSPM.Rename: type ModuleFromRenaming = Module FromRenaming
+ Language.CSPM.Rename: usedNames :: RenameInfo -> Set String
+ Language.CSPM.Rename: visible :: RenameInfo -> Bindings
+ Language.CSPM.TokenClasses: L_Newline :: PrimToken
+ Language.CSPM.TokenClasses: T_F :: PrimToken
+ Language.CSPM.TokenClasses: T_FD :: PrimToken
+ Language.CSPM.TokenClasses: T_Proc :: PrimToken
+ Language.CSPM.TokenClasses: T_T :: PrimToken
+ Language.CSPM.TokenClasses: T_deadlock :: PrimToken
+ Language.CSPM.TokenClasses: T_deterministic :: PrimToken
+ Language.CSPM.TokenClasses: T_exp :: PrimToken
+ Language.CSPM.TokenClasses: T_failure :: PrimToken
+ Language.CSPM.TokenClasses: T_failureDivergence :: PrimToken
+ Language.CSPM.TokenClasses: T_free :: PrimToken
+ Language.CSPM.TokenClasses: T_livelock :: PrimToken
+ Language.CSPM.TokenClasses: T_over :: PrimToken
+ Language.CSPM.TokenClasses: T_priority :: PrimToken
+ Language.CSPM.TokenClasses: T_refusalTesting :: PrimToken
+ Language.CSPM.TokenClasses: T_refusalTestingDiv :: PrimToken
+ Language.CSPM.TokenClasses: T_revivalTesting :: PrimToken
+ Language.CSPM.TokenClasses: T_revivalTestingDiv :: PrimToken
+ Language.CSPM.TokenClasses: T_startAssert :: PrimToken
+ Language.CSPM.TokenClasses: T_tau :: PrimToken
+ Language.CSPM.TokenClasses: T_tauPriorityOp :: PrimToken
+ Language.CSPM.TokenClasses: T_trace :: PrimToken
+ Language.CSPM.Utils: benchmarkFrontend :: FilePath -> IO (ModuleFromParser, ModuleFromRenaming)
+ Language.CSPM.Utils: parseString :: String -> IO ModuleFromParser
- Language.CSPM.AST: AssertBool :: LExp -> Decl
+ Language.CSPM.AST: AssertBool :: LExp -> AssertDecl
- Language.CSPM.AST: Module :: [LDecl] -> Maybe [Token] -> Module
+ Language.CSPM.AST: Module :: [LDecl] -> Maybe [Token] -> SrcLoc -> Module a
- Language.CSPM.AST: data Module
+ Language.CSPM.AST: data Module a
- Language.CSPM.AST: moduleDecls :: Module -> [LDecl]
+ Language.CSPM.AST: moduleDecls :: Module a -> [LDecl]
- Language.CSPM.AST: moduleTokens :: Module -> Maybe [Token]
+ Language.CSPM.AST: moduleTokens :: Module a -> Maybe [Token]
- Language.CSPM.AstUtils: computeFreeNames :: (Data a) => a -> FreeNames
+ Language.CSPM.AstUtils: computeFreeNames :: Data a => a -> FreeNames
- Language.CSPM.AstUtils: removeModuleTokens :: LModule -> LModule
+ Language.CSPM.AstUtils: removeModuleTokens :: Labeled (Module a) -> Labeled (Module a)
- Language.CSPM.AstUtils: removeParens :: LModule -> LModule
+ Language.CSPM.AstUtils: removeParens :: Data a => Labeled (Module a) -> Labeled (Module a)
- Language.CSPM.AstUtils: removeSourceLocations :: LModule -> LModule
+ Language.CSPM.AstUtils: removeSourceLocations :: Data a => Labeled (Module a) -> Labeled (Module a)
- Language.CSPM.AstUtils: showAst :: (Data a) => Labeled a -> String
+ Language.CSPM.AstUtils: showAst :: Data a => Labeled a -> String
- Language.CSPM.AstUtils: unUniqueIdent :: LModule -> LModule
+ Language.CSPM.AstUtils: unUniqueIdent :: Data a => Labeled (Module a) -> Labeled (Module a)
- Language.CSPM.Frontend: applyRenaming :: (Bindings, AstAnnotation UniqueIdent, AstAnnotation UniqueIdent) -> LModule -> LModule
+ Language.CSPM.Frontend: applyRenaming :: (Bindings, AstAnnotation UniqueIdent, AstAnnotation UniqueIdent) -> ModuleFromParser -> ModuleFromRenaming
- Language.CSPM.Frontend: computeFreeNames :: (Data a) => a -> FreeNames
+ Language.CSPM.Frontend: computeFreeNames :: Data a => a -> FreeNames
- Language.CSPM.Frontend: data Module
+ Language.CSPM.Frontend: data Module a
- Language.CSPM.Frontend: eitherToExc :: (Exception a) => Either a b -> IO b
+ Language.CSPM.Frontend: eitherToExc :: Exception a => Either a b -> IO b
- Language.CSPM.Frontend: getRenaming :: LModule -> Either RenameError (Bindings, AstAnnotation UniqueIdent, AstAnnotation UniqueIdent)
+ Language.CSPM.Frontend: getRenaming :: ModuleFromParser -> Either RenameError (Bindings, AstAnnotation UniqueIdent, AstAnnotation UniqueIdent)
- Language.CSPM.Frontend: parse :: SourceName -> [Token] -> Either ParseError LModule
+ Language.CSPM.Frontend: parse :: SourceName -> [Token] -> Either ParseError ModuleFromParser
- Language.CSPM.Frontend: parseFile :: FilePath -> IO LModule
+ Language.CSPM.Frontend: parseFile :: FilePath -> IO ModuleFromParser
- Language.CSPM.Frontend: pp :: (PP x) => x -> Doc
+ Language.CSPM.Frontend: pp :: PP x => x -> Doc
- Language.CSPM.Frontend: removeModuleTokens :: LModule -> LModule
+ Language.CSPM.Frontend: removeModuleTokens :: Labeled (Module a) -> Labeled (Module a)
- Language.CSPM.Frontend: removeParens :: LModule -> LModule
+ Language.CSPM.Frontend: removeParens :: Data a => Labeled (Module a) -> Labeled (Module a)
- Language.CSPM.Frontend: removeSourceLocations :: LModule -> LModule
+ Language.CSPM.Frontend: removeSourceLocations :: Data a => Labeled (Module a) -> Labeled (Module a)
- Language.CSPM.Frontend: showAst :: (Data a) => Labeled a -> String
+ Language.CSPM.Frontend: showAst :: Data a => Labeled a -> String
- Language.CSPM.Frontend: unUniqueIdent :: LModule -> LModule
+ Language.CSPM.Frontend: unUniqueIdent :: Data a => Labeled (Module a) -> Labeled (Module a)
- Language.CSPM.Parser: parse :: SourceName -> [Token] -> Either ParseError LModule
+ Language.CSPM.Parser: parse :: SourceName -> [Token] -> Either ParseError ModuleFromParser
- Language.CSPM.PrettyPrinter: pp :: (PP x) => x -> Doc
+ Language.CSPM.PrettyPrinter: pp :: PP x => x -> Doc
- Language.CSPM.Rename: applyRenaming :: (Bindings, AstAnnotation UniqueIdent, AstAnnotation UniqueIdent) -> LModule -> LModule
+ Language.CSPM.Rename: applyRenaming :: (Bindings, AstAnnotation UniqueIdent, AstAnnotation UniqueIdent) -> ModuleFromParser -> ModuleFromRenaming
- Language.CSPM.Rename: getRenaming :: LModule -> Either RenameError (Bindings, AstAnnotation UniqueIdent, AstAnnotation UniqueIdent)
+ Language.CSPM.Rename: getRenaming :: ModuleFromParser -> Either RenameError (Bindings, AstAnnotation UniqueIdent, AstAnnotation UniqueIdent)
- Language.CSPM.Utils: eitherToExc :: (Exception a) => Either a b -> IO b
+ Language.CSPM.Utils: eitherToExc :: Exception a => Either a b -> IO b
- Language.CSPM.Utils: parseFile :: FilePath -> IO LModule
+ Language.CSPM.Utils: parseFile :: FilePath -> IO ModuleFromParser
Files
- CSPM-Frontend.cabal +22/−38
- LICENSE +1/−1
- src/Language/CSPM/AST.hs +85/−68
- src/Language/CSPM/AstUtils.hs +49/−32
- src/Language/CSPM/Frontend.hs +48/−32
- src/Language/CSPM/LexHelper.hs +55/−22
- src/Language/CSPM/Lexer.x +50/−28
- src/Language/CSPM/Parser.hs +218/−179
- src/Language/CSPM/PatternCompiler.hs +0/−160
- src/Language/CSPM/PrettyPrinter.hs +328/−219
- src/Language/CSPM/Rename.hs +107/−29
- src/Language/CSPM/Token.hs +4/−5
- src/Language/CSPM/TokenClasses.hs +27/−4
- src/Language/CSPM/Utils.hs +22/−14
- src/Language/CSPM/Version.hs +0/−48
CSPM-Frontend.cabal view
@@ -1,70 +1,54 @@ Name: CSPM-Frontend-Version: 0.4.1.1+Version: 0.6.8.0 -Synopsis: A CSP-M parser compatible with FDR-2.83+Synopsis: A CSP-M parser compatible with FDR-2.91 Description: CSP-M is the machine readable syntax of CSP (concurrent sequential processes) as used by the formal methods tools FDR, Probe and ProB. This Package contains functions for lexing, parsing, renaming and pretty-printing CSP-M specifications.- The parser is (almost) 100% compatible with the FDR-2.83 parser.+ The parser is (almost) 100% compatible with the FDR-2.91 parser. License: BSD3 category: Language,Formal Methods,Concurrency License-File: LICENSE-Author: Marc Fontaine-Maintainer: Marc Fontaine <fontaine@cs.uni-duesseldorf.de>+Author: Marc Fontaine 2007 - 2011+Maintainer: Marc Fontaine <fontaine@cs.uni-duesseldorf.de>, me@dobrikov.biz Homepage: http://www.stups.uni-duesseldorf.de/~fontaine/csp-Stability: unstable-Tested-With: GHC == 6.12.3+Stability: maintained+Tested-With: GHC == 7.0.2 -cabal-Version: >= 1.6+cabal-Version: >= 1.10 build-type: Simple-Extra-source-files: -flag testing {- description : Testing mode- default: False-}-- library- if flag(testing) {- buildable: False- }- Build-Depends: base >=4.0 && < 5.0- ,containers >= 0.3 && < 0.4+ ,containers >= 0.4 && < 0.5 ,array >= 0.3 && < 0.4- ,parsec >= 2.1.0.0 && < 3.0- ,old-time >= 1.0 && < 1.1- ,template-haskell >= 2.4 && < 2.5+ ,parsec2 >= 1.0.0 && < 1.1.0 ,pretty >= 1.0 && < 1.1- ,mtl >= 1.1 && < 1.2- ,haskell98 >= 1.0 && < 1.1- ,syb >= 0.1 && < 0.2+ ,mtl (>= 2.0 && < 2.1 ) || (>= 1.1 && < 1.2)+ ,syb >= 0.3 && < 0.4 - GHC-Options: -funbox-strict-fields -O2 -fasm -optl-Wl,-s -Wall- Extensions: DeriveDataTypeable, GeneralizedNewtypeDeriving- Hs-Source-Dirs: src,dist/build/autogen+ Default-Language: Haskell2010+ Other-Extensions: DeriveDataTypeable+ GHC-Options: -funbox-strict-fields -O2 -Wall+ Hs-Source-Dirs: src Exposed-modules: Language.CSPM.Frontend- Language.CSPM.Utils- Language.CSPM.AST Language.CSPM.Parser+ Language.CSPM.AST+ Language.CSPM.PrettyPrinter+ Language.CSPM.SrcLoc Language.CSPM.Rename+ Language.CSPM.Utils Language.CSPM.Token- Language.CSPM.SrcLoc Language.CSPM.AstUtils Language.CSPM.TokenClasses- Language.CSPM.PrettyPrinter- Language.CSPM.PatternCompiler+ Language.CSPM.LexHelper Other-modules:- Paths_CSPM_Frontend- Language.CSPM.Version+ Text.ParserCombinators.Parsec.ExprM Language.CSPM.Lexer Language.CSPM.AlexWrapper- Language.CSPM.LexHelper- Text.ParserCombinators.Parsec.ExprM
LICENSE view
@@ -1,4 +1,4 @@-Copyright (c) Marc Fontaine 2007-2009+Copyright (c) Marc Fontaine 2007-2011 All rights reserved.
src/Language/CSPM/AST.hs view
@@ -1,8 +1,8 @@ ---------------------------------------------------------------------------- -- | -- Module : Language.CSPM.AST--- Copyright : (c) Fontaine 2008--- License : BSD+-- Copyright : (c) Fontaine 2008 - 2011+-- License : BSD3 -- -- Maintainer : Fontaine@cs.uni-duesseldorf.de -- Stability : experimental@@ -11,7 +11,10 @@ -- This Module defines an Abstract Syntax Tree for CSPM. -- This is the AST that is computed by the parser. -- For historycal reasons, it is rather unstructured+ {-# LANGUAGE DeriveDataTypeable, GeneralizedNewtypeDeriving #-}+{-# LANGUAGE EmptyDataDecls, RankNTypes #-}+ module Language.CSPM.AST where @@ -30,7 +33,7 @@ type FreeNames = IntMap UniqueIdent newtype NodeId = NodeId {unNodeId :: Int}- deriving (Show,Eq,Ord,Enum,Ix, Typeable, Data)+ deriving ( Eq, Ord, Show,Enum,Ix, Typeable, Data) mkNodeId :: Int -> NodeId mkNodeId = NodeId@@ -39,13 +42,7 @@ nodeId :: NodeId ,srcLoc :: SrcLoc ,unLabel :: t- } deriving (Typeable, Data,Show)--instance Eq (Labeled t) where- (==) a b = (nodeId a) == (nodeId b)--instance Ord (Labeled t) where- compare a b = compare (nodeId a) (nodeId b)+ } deriving ( Eq, Ord, Typeable, Data,Show) -- | Wrap a node with a dummyLabel -- | todo: redo we need a specal case in DataConstructor Labeled@@ -65,9 +62,15 @@ data Ident = Ident {unIdent :: String}- | UIdent {unUIdent :: UniqueIdent}- deriving (Show,Eq,Ord,Typeable, Data)+-- | UIdent {unUIdent :: UniqueIdent}+ | UIdent UniqueIdent+ deriving ( Eq, Ord, Show,Typeable, Data) +unUIdent :: Ident -> UniqueIdent+unUIdent (UIdent u) = u+unUIdent other+ = error $ "Identifier is not of variant UIdent (missing Renaming) " ++ show other+ identId :: LIdent -> Int identId = uniqueIdentId . unUIdent . unLabel @@ -81,30 +84,37 @@ ,newName :: String ,prologMode :: PrologMode ,bindType :: BindType- } deriving (Show,Eq,Ord,Typeable, Data)+ } deriving ( Eq, Ord, Show,Typeable, Data) data IDType = VarID | ChannelID | NameTypeID | FunID Int | ConstrID String | DataTypeID | TransparentID- deriving (Show,Eq,Ord,Typeable, Data)+ deriving ( Eq, Ord, Show,Typeable, Data) {- actually BindType and PrologMode are semantically aquivalent -} data BindType = LetBound | NotLetBound- deriving (Show,Eq,Ord,Typeable, Data)+ deriving ( Eq, Ord, Show,Typeable, Data) isLetBound :: BindType -> Bool isLetBound x = x==LetBound data PrologMode = PrologGround | PrologVariable- deriving (Show,Eq,Ord,Typeable, Data)+ deriving ( Eq, Ord, Show,Typeable, Data) -type LModule = Labeled Module-data Module = Module {+data Module a = Module { moduleDecls :: [LDecl] ,moduleTokens :: Maybe [Token]- } deriving (Show,Eq,Ord,Typeable, Data)+ ,moduleSrcLoc :: SrcLoc+ } deriving ( Eq, Ord, Show,Typeable, Data) +data FromParser deriving Typeable+instance Data FromParser+instance Eq FromParser +castModule :: Module a -> Module b+castModule (Module t d s) = Module t d s++type ModuleFromParser = Module FromParser {- LProc is just a typealias for better readablility todo : maybe use a real type@@ -132,6 +142,7 @@ | Events | BoolSet | IntSet+ | ProcSet | TupleExp [LExp] | Parens LExp | AndExp LExp LExp@@ -146,50 +157,50 @@ | ProcAParallel LExp LExp LProc LProc | ProcLinkParallel LLinkList LProc LProc | ProcRenaming [LRename] (Maybe LCompGenList) LProc--- | ProcRenamingComprehension [LRename] [LCompGen] LProc+ | ProcException LExp LProc LProc | ProcRepSequence LCompGenList LProc | ProcRepInternalChoice LCompGenList LProc | ProcRepExternalChoice LCompGenList LProc | ProcRepInterleave LCompGenList LProc | ProcRepAParallel LCompGenList LExp LProc | ProcRepLinkParallel LCompGenList LLinkList LProc- | ProcRepSharing LCompGenList LExp LProc- | PrefixExp LExp [LCommField] LProc+ | ProcRepSharing LCompGenList LExp LProc--+ | PrefixExp LExp [LCommField] LProc-- -- only used in later stages | PrefixI FreeNames LExp [LCommField] LProc | LetI [LDecl] FreeNames LExp -- freenames of all localBound names | LambdaI FreeNames [LPattern] LExp | ExprWithFreeNames FreeNames LExp- deriving (Show, Eq, Ord, Typeable, Data)+ deriving ( Eq, Ord, Show, Typeable, Data) type LRange = Labeled Range data Range = RangeEnum [LExp] | RangeClosed LExp LExp | RangeOpen LExp- deriving (Show, Eq, Ord, Typeable, Data)+ deriving ( Eq, Ord, Show, Typeable, Data) type LCommField = Labeled CommField data CommField = InComm LPattern | InCommGuarded LPattern LExp | OutComm LExp- deriving (Show,Eq,Ord,Typeable, Data)+ deriving ( Eq, Ord, Show,Typeable, Data) type LLinkList = Labeled LinkList data LinkList = LinkList [LLink] | LinkListComprehension [LCompGen] [LLink]- deriving (Show,Eq,Ord,Typeable, Data)+ deriving ( Eq, Ord, Show,Typeable, Data) type LLink = Labeled Link-data Link = Link LExp LExp deriving (Show,Eq,Ord,Typeable, Data)+data Link = Link LExp LExp deriving ( Eq, Ord, Show,Typeable, Data) type LRename = Labeled Rename-data Rename = Rename LExp LExp deriving (Show,Eq,Ord,Typeable, Data)+data Rename = Rename LExp LExp deriving ( Eq, Ord, Show,Typeable, Data) type LBuiltIn = Labeled BuiltIn-data BuiltIn = BuiltIn Const deriving (Show,Eq,Ord,Typeable, Data)+data BuiltIn = BuiltIn Const deriving ( Eq, Ord, Show,Typeable, Data) lBuiltInToConst :: LBuiltIn -> Const lBuiltInToConst = h . unLabel where@@ -200,8 +211,7 @@ data CompGen = Generator LPattern LExp | Guard LExp- deriving (Show,Eq,Ord,Typeable, Data)-+ deriving ( Eq, Ord, Show,Typeable, Data) type LPattern = Labeled Pattern data Pattern@@ -224,7 +234,7 @@ selectors :: Array Int Selector ,idents :: Array Int (Maybe LIdent) } | Selector Selector (Maybe LIdent)- deriving (Show,Eq,Ord,Typeable, Data)+ deriving ( Eq, Ord, Show,Typeable, Data) {- a Selector is a path in a Pattern/Expression -} data Selector@@ -246,21 +256,19 @@ | TailSel Selector | SliceSel Int Int Selector | SuffixSel Int Int Selector- deriving (Show, Eq, Ord, Typeable, Data)+ deriving ( Eq, Ord, Show, Typeable, Data) type LDecl = Labeled Decl data Decl = PatBind LPattern LExp | FunBind LIdent [FunCase]- | AssertRef LExp String LExp- | AssertBool LExp+ | Assert LAssertDecl | Transparent [LIdent] | SubType LIdent [LConstructor] | DataType LIdent [LConstructor] | NameType LIdent LTypeDef | Channel [LIdent] (Maybe LTypeDef) | Print LExp--- | FunBindI LIdent FreeNames [FunCase] deriving (Show,Eq,Ord,Typeable, Data) {-@@ -274,55 +282,64 @@ -} type FunArgs = [[LPattern]] -- CSPM confusion of currying/tuples data FunCase - = FunCase FunArgs LExp -- osolete version+ = FunCase FunArgs LExp -- oldVersion (returned by parser) | FunCaseI [LPattern] LExp -- newVersion for interpreter- deriving (Show,Eq,Ord,Typeable, Data)+ deriving ( Eq, Ord, Show,Typeable, Data) type LTypeDef = Labeled TypeDef data TypeDef = TypeTuple [LExp] | TypeDot [LExp]- deriving (Show,Eq,Ord,Typeable, Data)+ deriving ( Eq, Ord, Show,Typeable, Data) type LConstructor = Labeled Constructor data Constructor = Constructor LIdent (Maybe LTypeDef) - deriving (Show,Eq,Ord,Typeable, Data)----{--some helper functions--}-{- does not make sense if nodId should be unique -}-instance Functor Labeled where- fmap f x = x {unLabel = f $ unLabel x }+ deriving ( Eq, Ord, Show,Typeable, Data) withLabel :: ( NodeId -> a -> b ) -> Labeled a -> Labeled b withLabel f x = x {unLabel = f (nodeId x) (unLabel x) } -mkLabeledNode :: (NodeIdSupply m) => SrcLoc -> t -> m (Labeled t)-mkLabeledNode loc node = do- i <- getNewNodeId- return $ Labeled {- nodeId = i- ,srcLoc = loc- ,unLabel = node }+type LAssertDecl = Labeled AssertDecl+data AssertDecl+ = AssertBool LExp+ | AssertRefine Bool LExp LRefineOp LExp+ | AssertTauPrio Bool LExp LTauRefineOp LExp LExp+ | AssertModelCheck Bool LExp LFDRModels (Maybe LFdrExt)+ deriving ( Eq, Ord, Show,Typeable,Data) -{---- user must supply a unique NodeId-unsafeMkLabeledNode :: NodeId -> SrcLoc -> t -> Labeled t-unsafeMkLabeledNode i loc node- = Labeled {- nodeId = i- ,srcLoc = loc- ,unLabel = node }--}+type LFDRModels = Labeled FDRModels+data FDRModels+ = DeadlockFree+ | Deterministic+ | LivelockFree+ deriving ( Eq, Ord, Show,Typeable,Data) -class (Monad m) => NodeIdSupply m where- getNewNodeId :: m NodeId+type LFdrExt = Labeled FdrExt+data FdrExt + = F + | FD+ | T+ deriving ( Eq, Ord, Show,Typeable,Data) +type LTauRefineOp = Labeled TauRefineOp +data TauRefineOp+ = TauTrace+ | TauRefine+ deriving ( Eq, Ord, Show,Typeable, Data) +type LRefineOp = Labeled RefineOp+data RefineOp + = Trace+ | Failure+ | FailureDivergence+ | RefusalTesting+ | RefusalTestingDiv+ | RevivalTesting+ | RevivalTestingDiv+ | TauPriorityOp+ deriving ( Eq, Ord, Show,Typeable, Data)+ data Const = F_true | F_false@@ -373,4 +390,4 @@ | F_Hiding | F_Timeout | F_Interleave- deriving (Show,Eq,Ord,Typeable, Data)+ deriving ( Eq, Ord, Show,Typeable, Data)
src/Language/CSPM/AstUtils.hs view
@@ -1,8 +1,8 @@ ----------------------------------------------------------------------------- -- | -- Module : Language.CSPM.AstUtils--- Copyright : (c) Fontaine 2008--- License : BSD+-- Copyright : (c) Fontaine 2008 - 2011+-- License : BSD3 -- -- Maintainer : Fontaine@cs.uni-duesseldorf.de -- Stability : experimental@@ -10,6 +10,7 @@ -- -- Some utility functions for converting the AST +{-# LANGUAGE RankNTypes #-} module Language.CSPM.AstUtils ( removeSourceLocations@@ -17,24 +18,24 @@ ,removeModuleTokens ,unUniqueIdent ,showAst- ,relabelAst ,computeFreeNames+ ,getModuleAsserts+ ,setNodeIdsZero ) where import Language.CSPM.AST hiding (prologMode)-import qualified Language.CSPM.AST as AST import qualified Language.CSPM.SrcLoc as SrcLoc -import Data.IntMap (IntMap) import qualified Data.IntMap as IntMap import Data.Data+import Data.Maybe import Data.Generics.Schemes (everywhere,listify) import Data.Generics.Aliases (mkT,extQ)-import Data.Generics.Basics (gmapQ,toConstr,showConstr)+--import Data.Generics.Basics (gmapQ,toConstr,showConstr) -- | 'removeSourceLocations' sets all locationsInfos to 'NoLocation'-removeSourceLocations :: LModule -> LModule +removeSourceLocations :: Data a => Labeled (Module a) -> Labeled (Module a) removeSourceLocations ast = everywhere (mkT patchLabel) ast where@@ -42,12 +43,12 @@ patchLabel _ = SrcLoc.NoLocation -- | set the tokenlist in the module datatype to Nothing-removeModuleTokens :: LModule -> LModule+removeModuleTokens :: Labeled (Module a) -> Labeled (Module a) removeModuleTokens t = t {unLabel = m} where m = (unLabel t ) {moduleTokens = Nothing} -- | 'removeParens' removes all occurences of of Parens,i.e. explicit parentheses from the AST-removeParens :: LModule -> LModule +removeParens :: Data a => Labeled (Module a) -> Labeled (Module a) removeParens ast = everywhere (mkT patchExp) ast where@@ -56,10 +57,18 @@ Parens e -> e _ -> x +-- | Set all NodeIds to zero.+setNodeIdsZero :: Data a => Labeled (Module a) -> Labeled (Module a)+setNodeIdsZero ast + = everywhere (mkT nID) ast+ where+ nID :: NodeId -> NodeId+ nID _ = NodeId { unNodeId = 0 }+ -- | unUniqueIdent replaces the all UIdent with the Ident of the the new name, thus forgetting -- | additional information like the bindingside, etc. -- | Usefull to get a smaller AST. -unUniqueIdent :: LModule -> LModule +unUniqueIdent :: Data a => Labeled (Module a) -> Labeled (Module a) unUniqueIdent ast = everywhere (mkT patchIdent) ast where@@ -67,13 +76,6 @@ patchIdent (UIdent u) = Ident $ newName u patchIdent _ = error "unUniqueIdent : did not expect and 'Ident' in the AST" --- | 'relabelAst' compute an AST with new NodeIds starting with the given NodeId-relabelAst :: - NodeId - -> LModule - -> LModule-relabelAst = error "relabel not yet implemented (TODO)"- -- | 'a show function that omits the node labeles. -- | TODO : fix this is very buggy. -- | this does not work for Compiles pattern / Arrays@@ -90,31 +92,46 @@ ++ concat (gmapQ ((++) " " . gshow) t) ++ ")" -- -- | Compute the "FreeNames" of an Expression. -- | This function does only work after renaming has been done. -- | This implementation is inefficient. computeFreeNames :: Data a => a -> FreeNames computeFreeNames syntax- = IntMap.difference (toIntMap used) (toIntMap def)+ = IntMap.difference (IntMap.fromList used) (IntMap.fromList def) where- toIntMap :: [UniqueIdent] -> IntMap UniqueIdent- toIntMap- = IntMap.fromList . map (\x -> (uniqueIdentId x,x))- used :: [UniqueIdent]- used = map (\(Var x) -> unUIdent $ unLabel x) $ listify isUse syntax- def :: [UniqueIdent]- def = (map (\(VarPat x) -> unUIdent $ unLabel x) $ listify isDef syntax)- ++(map (\(FunBind x _) -> unUIdent $ unLabel x) $ listify isFunDef syntax)+ used :: [(Int, UniqueIdent)]+ used = map (getIdent . unUse) $ listify isUse syntax+ def :: [(Int, UniqueIdent)]+ def = (map (getIdent . unDef) $ listify isDef syntax)+ ++ (map (getIdent . unDecl) $ listify isDecl syntax)+ getIdent :: LIdent -> (Int, UniqueIdent)+ getIdent x = (uniqueIdentId h, h)+ where h = unUIdent $ unLabel x+ isUse :: Exp -> Bool isUse (Var {}) = True isUse _ = False + unUse (Var x) = x+ unUse _ = error "computeFreeNames : expecting Var"+ isDef :: Pattern -> Bool isDef (VarPat {}) = True isDef _ = False- - isFunDef :: Decl -> Bool- isFunDef (FunBind {}) = True- isFunDef _ = False++ isDecl (FunBind {}) = True+ isDecl _ = False++ unDef (VarPat x) = x+ unDef _ = error "computeFreeNames : expecting VarPar"++ unDecl (FunBind x _) = x+ unDecl _ = error "computeFreeNames : expecting FunBind"++-- | Get the assert declarations of a module+getModuleAsserts :: Module a -> [LAssertDecl]+getModuleAsserts = mapMaybe justAssert . moduleDecls+ where+ justAssert decl = case unLabel decl of+ Assert a -> Just a+ _ -> Nothing
src/Language/CSPM/Frontend.hs view
@@ -1,8 +1,8 @@ ----------------------------------------------------------------------------- -- | -- Module : Language.CSPM.Frontend--- Copyright : (c) Fontaine 2008--- License : BSD+-- Copyright : (c) Fontaine 2008 - 2011+-- License : BSD3 -- -- Maintainer : Fontaine@cs.uni-duesseldorf.de -- Stability : experimental@@ -12,57 +12,73 @@ module Language.CSPM.Frontend (- testFrontend+ -- Language.CSPM.Parser+ parse+ ,ParseError(..)++ -- Language.CSPM.Utils ,parseFile+ ,benchmarkFrontend+ ,eitherToExc+ ,handleLexError+ ,handleParseError+ ,handleRenameError++-- Language.CSPM.Token ,Token+ ,LexError(..)++-- Language.CSPM.LexHelper ,Lexer.lexInclude ,Lexer.lexPlain ,Lexer.filterIgnoredToken- ,LexError(..)- ,parse- ,ParseError(..)++-- Language.CSPM.AST ,Module- ,LModule- ,Labeled(..)+ ,ModuleFromParser+ ,ModuleFromRenaming+ ,Labeled (..)+ ,castModule+ ,Bindings ,SrcLoc (..)++-- Language.CSPM.Rename+ ,renameModule+ ,RenameInfo (..) ,getRenaming ,applyRenaming- -- AstUtils+ ,RenameError (..)++-- AstUtils ,removeSourceLocations ,removeParens ,removeModuleTokens ,unUniqueIdent ,showAst- ,relabelAst ,computeFreeNames- --- ,RenameError(..)- ,eitherToExc- ,handleLexError- ,handleParseError- ,handleRenameError- ,compilePattern- ,version+ ,setNodeIdsZero++-- PrettyPrinter ,pp+ ,prettyPrintFile ) where -import Language.CSPM.Parser (ParseError(..),parse)-import Language.CSPM.Rename (RenameError(..),getRenaming,applyRenaming)-import Language.CSPM.PatternCompiler (compilePattern)-import Language.CSPM.Token (Token,LexError(..))-import Language.CSPM.AST (Labeled(..),LModule,Module(..),Bindings)+import Language.CSPM.Parser (ParseError(..), parse)+import Language.CSPM.Rename+ (RenameError (..), RenameInfo (..), renameModule, getRenaming, applyRenaming+ ,ModuleFromRenaming)+import Language.CSPM.Token (Token, LexError(..))+import Language.CSPM.AST+ (Labeled (..), Module (..), Bindings, castModule, ModuleFromParser) import Language.CSPM.SrcLoc (SrcLoc(..)) import Language.CSPM.AstUtils - (removeSourceLocations,removeModuleTokens,removeParens,relabelAst- ,unUniqueIdent,showAst,computeFreeNames)-+ (removeSourceLocations, removeModuleTokens, removeParens+ ,unUniqueIdent, showAst, computeFreeNames, setNodeIdsZero) import qualified Language.CSPM.LexHelper as Lexer- (lexInclude,lexPlain,filterIgnoredToken)-import Language.CSPM.Version--import Language.CSPM.PrettyPrinter (pp)+ (lexInclude, lexPlain, filterIgnoredToken)+import Language.CSPM.PrettyPrinter (pp, prettyPrintFile) import Language.CSPM.Utils- (eitherToExc,handleLexError,handleParseError,handleRenameError- ,parseFile,testFrontend)+ (eitherToExc, handleLexError, handleParseError, handleRenameError+ ,parseFile, benchmarkFrontend)
src/Language/CSPM/LexHelper.hs view
@@ -3,20 +3,20 @@ lexInclude ,lexPlain ,filterIgnoredToken- ,tokenIsIgnored ,tokenIsComment- ,tokenIsFDR ) where import qualified Language.CSPM.Lexer as Lexer (scanner)-import Language.CSPM.Token (Token(..), LexError(..) )+import Language.CSPM.Token (Token(..), LexError(..)) import Language.CSPM.TokenClasses (PrimToken(..))---import qualified Language.CSPM.Token as Token--- (Token(..), LexError(..))+import qualified Data.Set as Set -{- todo : use an error monad -}+-- | lex a String .+lexPlain :: String -> Either LexError [Token]+lexPlain src = fmap reverse $ Lexer.scanner src +-- | lex a String and process CSP-M include statements. lexInclude :: String -> IO (Either LexError [Token]) lexInclude src = do case Lexer.scanner src of@@ -27,9 +27,7 @@ Left err -> return $ Left err Right t -> return $ Right t -lexPlain :: String -> Either LexError [Token]-lexPlain src = fmap reverse $ Lexer.scanner src-+-- | Monsterfunction : todo refactor processIncludeAndReverse :: [Token] -> IO (Either LexError [Token] ) processIncludeAndReverse tokens = picl_acc tokens [] where @@ -53,21 +51,56 @@ } picl_acc (h:rest) acc = picl_acc rest $ h:acc +-- | remove newlines, that do not end a declaration from the token stream.+-- For example newlines next to binary operators.+soakNewlines :: [Token] -> [Token]+soakNewlines = worker+ where + worker [] = []+ worker [x] = case tokenClass x of+ L_Newline -> []+ _ -> [x] + worker (h1:h2:t) = case (tokenClass h1, tokenClass h2) of+ (L_Newline, L_Newline) -> worker (h1:t)+ (L_Newline, _) | isH2NewLineConsumer -> worker $ h2:t+ (L_Newline, _) -> h1 : (worker $ h2:t)+ (_, L_Newline) | isH1NewLineConsumer -> worker $ h1:t+ (_, L_Newline) -> h1: (worker $ h2:t)+ _ -> h1: (worker $ h2:t)+ where+ isH2NewLineConsumer = tokenClass h2 `Set.member` consumeNLBeforeToken+ isH1NewLineConsumer = tokenClass h1 `Set.member` consumeNLAfterToken + binaryOperators =+ [T_is, T_hat, T_hash, T_times, T_slash, + T_percent, T_plus, T_minus, T_eq, T_neq,+ T_ge, T_le, T_not, T_amp, T_semicolon,+ T_comma, T_triangle, T_box, T_rhd, T_exp,+ T_sqcap, T_interleave, T_backslash, T_parallel,+ T_mid, T_at, T_atat, T_rightarrow, T_leftarrow,+ T_leftrightarrow, T_dot, T_dotdot, T_exclamation,+ T_questionmark, T_colon, T_openBrack, T_closeBrack,+ T_openOxBrack, T_closeOxBrack,T_openPBrace,+ T_openBrackBrack, T_if, T_then,T_else, T_let, T_and,+ T_or, T_Refine, T_trace,T_failure, T_failureDivergence,+ T_refusalTesting, T_refusalTestingDiv, T_revivalTesting, + T_revivalTestingDiv,T_tauPriorityOp, T_within]+ consumeNLBeforeToken + = Set.fromList (+ [T_closeParen, T_gt, T_closeBrace, T_closeBrackBrack, T_closePBrace] + ++ binaryOperators)+ consumeNLAfterToken+ = Set.fromList ( [T_openParen, T_openBrace, T_lt] ++ binaryOperators)++-- | Remove comments and unneeded newlines. filterIgnoredToken :: [Token] -> [Token]-filterIgnoredToken = filter ( not . tokenIsIgnored)+filterIgnoredToken = soakNewlines . removeComments -tokenIsIgnored :: Token -> Bool-tokenIsIgnored (Token _ _ _ L_LComment _) = True-tokenIsIgnored (Token _ _ _ L_CSPFDR _) = True-tokenIsIgnored (Token _ _ _ L_BComment _) = True-tokenIsIgnored _ = False+-- | Remove comments from the token stream.+removeComments :: [Token] -> [Token]+removeComments = filter (not . tokenIsComment) +-- | Is the token a line-comment or block-comment ? tokenIsComment :: Token -> Bool-tokenIsComment (Token _ _ _ L_LComment _) = True-tokenIsComment (Token _ _ _ L_BComment _) = True-tokenIsComment _ = False--tokenIsFDR :: Token -> Bool-tokenIsFDR (Token _ _ _ L_CSPFDR _) = True-tokenIsFDR _ = False+tokenIsComment t = tc == L_LComment || tc == L_BComment+ where tc = tokenClass t
src/Language/CSPM/Lexer.x view
@@ -15,12 +15,12 @@ import Language.CSPM.AlexWrapper } -$whitechar = [\ \t\n\r\f\v]-+$whitechar = [\ \t\r\n\f\v]+$whitechar' = [\ \t\r\f\v] $digit = 0-9 $symbol = [\!\#\$\%\&\*\+\.\/\<\=\>\?\@\\\^\|\-\~\(\)\,\;\[\]\`\{\}\_\:\']-+$symbol1 = [\_\'] --$large = [A-Z \xc0-\xd6 \xd8-\xde] --$small = [a-z \xdf-\xf6 \xf8-\xff \_] $large = [A-Z]@@ -28,8 +28,8 @@ $alpha = [$small $large] $graphic = [$small $large $symbol $digit]--$octit = 0-7+$graphic1 = [$small $large $symbol1 $digit]+$octit = 0-7 $hexit = [0-9 A-F a-f] $idchar = [$alpha $digit \' \_] @@ -40,12 +40,9 @@ @hexadecimal = $hexit+ @string = $graphic # [\"\\] | " " $whitechar--@assertExts = $whitechar+ "[FD]" | $whitechar+ "[F]"-@assertCore = "deterministic" @assertExts?- | "livelock" $whitechar+ "free" @assertExts?- | "deadlock" $whitechar+ "free" @assertExts?- | "divergence" $whitechar+ "free" @assertExts?+@str = $graphic # [ \[ \] ] +@w = $whitechar*+$nl = [\n] csp :- @@ -56,14 +53,14 @@ <0> "subtype" { mkL T_subtype } <0> "assert" { mkL T_assert } <0> "pragma" { mkL T_pragma }-<0> "transparent" { mkL T_transparent }+<0> "transparent" { mkL T_transparent } <0> "external" { mkL T_external }-<0> "print" { mkL T_print }-<0> "if" { mkL T_if }-<0> "then" { mkL T_then }-<0> "else" { mkL T_else }-<0> "let" { mkL T_let }-<0> "within" { mkL T_within }+<0> "print" { mkL T_print }+<0> "if" { mkL T_if }+<0> "then" { mkL T_then }+<0> "else" { mkL T_else }+<0> "let" { mkL T_let }+<0> "within" { mkL T_within } -- CSP-M builtIns @@ -76,6 +73,7 @@ <0> "or" { mkL T_or } <0> "Int" { mkL T_Int } <0> "Bool" { mkL T_Bool }+<0> "Proc" { mkL T_Proc } <0> "Events" { mkL T_Events } <0> "CHAOS" { mkL T_CHAOS } <0> "union" { mkL T_union }@@ -96,6 +94,18 @@ <0> "elem" { mkL T_elem } <0> "length" { mkL T_length } +-- assetion Lists refinement operators+<0> "[=" { mkL T_Refine }+<0> "[T=" { mkL T_trace }+<0> "[F=" { mkL T_failure }+<0> "[FD=" { mkL T_failureDivergence }+<0> "[R=" { mkL T_refusalTesting }+<0> "[RD=" { mkL T_refusalTestingDiv }+<0> "[V=" { mkL T_revivalTesting }+<0> "[VD=" { mkL T_revivalTestingDiv }+<0> "[TP=" { mkL T_tauPriorityOp }+<0> ":[" { begin ref } -- jump to the other lexer specification ref+ -- symbols <0> "^" { mkL T_hat } <0> "#" { mkL T_hash }@@ -108,7 +118,7 @@ <0> "!=" { mkL T_neq } <0> ">=" { mkL T_ge } <0> "<=" { mkL T_le }-<0> "<" { mkL T_lt }+<0> "<" { mkL T_lt } <0> ">" { mkL T_gt } <0> "&" { mkL T_amp } <0> ";" { mkL T_semicolon }@@ -116,6 +126,7 @@ <0> "/\" { mkL T_triangle } <0> "[]" { mkL T_box } <0> "[>" { mkL T_rhd }+<0> "|>" { mkL T_exp } <0> "|~|" { mkL T_sqcap } <0> "|||" { mkL T_interleave } <0> "\" { mkL T_backslash }@@ -145,14 +156,14 @@ <0> "=" { mkL T_is } <0> "[[" { mkL T_openBrackBrack } <0> "]]" { mkL T_closeBrackBrack }--<0> $white+ { skip }-<0> "--".* { mkL L_LComment }-"{-" { block_comment }+<0> $nl { mkL L_Newline}+<0> $whitechar'+ { skip }+<0> "--".* { mkL L_LComment }+"{-" { block_comment } -- Fixme : tread this properly-<0> ":[" $whitechar* @assertCore $whitechar* "]" { mkL L_CSPFDR } + <0> "include" { mkL L_Include } <0> @ident { mkL L_Ident} -- ambiguity for wildcardpattern _@@ -164,10 +175,21 @@ <0> \" @string* \" { mkL L_String } -<0> "[" $large + "=" { mkL T_Refine }-<0> "[=" { mkL T_Refine }--+<ref> "deadlock" { mkL T_deadlock }+<ref> "deterministic" { mkL T_deterministic }+<ref> "livelock" { mkL T_livelock }+<ref> "divergence" { mkL T_livelock }+<ref> "free" { mkL T_free }+<ref> "[FD]" { mkL T_FD }+<ref> "[F]" { mkL T_F }+<ref> "[T]" { mkL T_T }+<ref> "tau" { mkL T_tau }+<ref> "priority" { mkL T_priority }+<ref> "over" { mkL T_over }+<ref> "]:" { begin 0 }+<ref> "]" { begin 0 }+<ref> $white+ { skip }+<ref> @str { skip } { alexMonadScan = do
src/Language/CSPM/Parser.hs view
@@ -1,26 +1,22 @@ ----------------------------------------------------------------------------- -- | -- Module : Language.CSPM.Parser--- Copyright : (c) Fontaine 2008--- License : BSD+-- Copyright : (c) Fontaine 2008 - 2011+-- License : BSD3 -- --- Maintainer : Fontaine@cs.uni-duesseldorf.de+-- Maintainer : fontaine@cs.uni-duesseldorf.de, me@dobrikov.biz -- Stability : experimental -- Portability : GHC-only ----- This modules defines a Parser for CSPM+-- This modules defines a Parser for CSP-M -- ------------------------------------------------------------------------------{- todo:-* add Autoversion to packet-* add wrappers for functions that throw dynamic exceptions--}-{-# OPTIONS_GHC -fglasgow-exts #-}+{-# LANGUAGE DeriveDataTypeable #-}+ module Language.CSPM.Parser ( parse ,ParseError(..)- ,PState() -- need to export this to satisfy haddock ) where import Language.CSPM.AST@@ -35,7 +31,7 @@ import Text.ParserCombinators.Parsec.ExprM import Text.ParserCombinators.Parsec- hiding (parse,eof,notFollowedBy,anyToken,label,ParseError,errorPos,token)+ hiding (parse,eof,notFollowedBy,anyToken,label,ParseError,errorPos,token,newline) import Text.ParserCombinators.Parsec.Pos (newPos) import qualified Text.ParserCombinators.Parsec.Error as ParsecError import Data.Typeable (Typeable)@@ -44,7 +40,7 @@ import Prelude hiding (exp) import Control.Exception (Exception) -type PT a= GenParser Token PState a+type PT a = GenParser Token PState a -- | The 'parse' function parses a List of 'Token'. -- It returns a 'ParseError' or a 'Labled' 'Module'.@@ -52,11 +48,12 @@ parse :: SourceName -> [Token]- -> Either ParseError LModule+ -> Either ParseError ModuleFromParser parse filename tokenList = wrapParseError tokenList $ runParser (parseModule tokenList) initialPState filename $ filterIgnoredToken tokenList +-- | ParseError data type. This is an instance of Excpetion data ParseError = ParseError { parseErrorMsg :: String ,parseErrorToken :: Token@@ -69,7 +66,7 @@ = PState { lastTok :: Token ,gtCounter :: Int- ,gtMode :: GtMode+ ,gtLimit :: Maybe Int ,nodeIdSupply :: NodeId } deriving Show @@ -77,27 +74,23 @@ initialPState = PState { lastTok = Token.tokenSentinel ,gtCounter = 0- ,gtMode = GtNoLimit+ ,gtLimit = Nothing ,nodeIdSupply = mkNodeId 0 } -setGtMode :: GtMode-> PState -> PState-setGtMode mode env = env {gtMode = mode}--countGt :: PState -> PState-countGt env = env {gtCounter = gtCounter env +1 }--data GtMode=GtNoLimit | GtLimit Int deriving Show--instance NodeIdSupply (GenParser Token PState) where- getNewNodeId = do- i <- gets nodeIdSupply- modify $ \s -> s { nodeIdSupply = succ $ nodeIdSupply s}- return i +mkLabeledNode :: SrcLoc -> t -> PT (Labeled t)+mkLabeledNode loc node = do+ i <- getStates nodeIdSupply+ updateState $ \s -> s { nodeIdSupply = succ $ nodeIdSupply s}+ return $ Labeled {+ nodeId = i+ ,srcLoc = loc+ ,unLabel = node } -instance MonadState PState (GenParser Token PState) where- get = getState- put = setState+getStates :: (PState -> x) -> PT x+getStates sel = do+ st <- getState+ return $ sel st getNextPos :: PT Token getNextPos = do@@ -135,13 +128,18 @@ e <- getLastPos mkLabeledNode (mkSrcSpan s e) $ constr l -parseModule :: [Token.Token] -> PT (Labeled Module)-parseModule tokenList = withLoc $ do- decl<-topDeclList - eof <?> "end of module"- return $ Module {- moduleDecls = decl- ,moduleTokens = Just tokenList+parseModule :: [Token.Token] -> PT ModuleFromParser+parseModule tokenList = do+ s <- getNextPos+ skipMany newline+ decl<-topDeclList+ skipMany newline + eof <?> "end of module"+ e <- getLastPos+ return $ Module {+ moduleDecls = decl+ ,moduleTokens = Just tokenList+ ,moduleSrcLoc = mkSrcSpan s e } token :: TokenClasses.PrimToken -> PT ()@@ -160,6 +158,23 @@ T_elem, T_length, T_CHAOS ] -} +newline :: PT ()+newline = token L_Newline++refineOp :: PT LRefineOp+refineOp = withLoc $ do + tok <- tokenPrimExDefault (\t -> Just $ tokenClass t)+ case tok of+ T_trace -> return Trace+ T_failure -> return Failure+ T_failureDivergence -> return FailureDivergence+ T_refusalTesting -> return RefusalTesting+ T_refusalTestingDiv -> return RefusalTestingDiv+ T_revivalTesting -> return RevivalTesting+ T_revivalTestingDiv -> return RevivalTestingDiv+ T_tauPriorityOp -> return TauPriorityOp+ _ -> fail "Unexpected Token"+ anyBuiltIn :: PT Const anyBuiltIn = do tok <- tokenPrimExDefault (\t -> Just $ tokenClass t)@@ -184,13 +199,11 @@ T_CHAOS -> return F_CHAOS _ -> fail "not a built-in function" - blockBuiltIn :: PT a blockBuiltIn = do bi <- try anyBuiltIn fail $ "can not use built-in '"++ show bi ++ "' here" -- todo fix: better error -message - lIdent :: PT String lIdent = tokenPrimExDefault testToken@@ -215,6 +228,9 @@ sepBy1Comma :: PT x -> PT [x] sepBy1Comma a = sepBy1 a commaSeperator +sepByNewLine :: PT x -> PT [x]+sepByNewLine d = sepBy d newline+ parseComprehension :: PT [LCompGen] parseComprehension = token T_mid >> sepByComma (compGenerator <|> compGuard ) @@ -238,7 +254,7 @@ repGenerator :: PT LCompGen repGenerator = try $ withLoc $ do pat <- parsePattern- token T_colon+ (token T_colon) <|> (token T_leftarrow) exp <- parseExp_noPrefix return $ Generator pat exp @@ -279,7 +295,6 @@ token T_dotdot return $ RangeOpen s - closureExp :: PT LExp closureExp = withLoc $ do token T_openPBrace@@ -317,10 +332,10 @@ letExp :: PT LExp letExp = withLoc $ do token T_let- decl <- parseDeclList+ declList <- sepByNewLine (funBind <|> patBind) token T_within exp <- parseExp- return $ Let decl exp + return $ Let declList exp ifteExp :: PT LExp ifteExp = withLoc $ do@@ -385,6 +400,7 @@ <|> withLoc ( token T_Events >> return Events) <|> withLoc ( token T_Bool >> return BoolSet) <|> withLoc ( token T_Int >> return IntSet)+ <|> withLoc ( token T_Proc >> return ProcSet) <|> ifteExp <|> letExp <|> try litExp -- -10 is Integer(-10) @@ -469,6 +485,7 @@ ,[infixM (nfun2 T_box F_ExtChoice ) AssocLeft] ,[infixM (nfun2 T_rhd F_Timeout ) AssocLeft] ,[infixM (nfun2 T_sqcap F_IntChoice ) AssocLeft]+ ,[infixM procOpException AssocLeft] ,[infixM (nfun2 T_interleave F_Interleave ) AssocLeft] ] )@@ -500,12 +517,45 @@ posFromTo :: LExp -> LExp -> SrcLoc.SrcLoc posFromTo a b = SrcLoc.srcLocFromTo (srcLoc a) (srcLoc b) + procOpSharing :: PT (LProc -> LProc -> PT LProc)+ procOpSharing = try $ do+ spos <- getNextPos+ al <- between ( token T_openOxBrack) (token T_closeOxBrack) parseExp+ epos <- getLastPos+ return $ (\a b -> mkLabeledNode (mkSrcSpan spos epos) $ ProcSharing al a b)++ procOpException :: PT (LProc -> LProc -> PT LProc)+ procOpException = do+ spos <- getNextPos+ al <- between ( token T_openOxBrack) (token T_exp) parseExp+ epos <- getLastPos+ return $ (\a b -> mkLabeledNode (mkSrcSpan spos epos) $ ProcException al a b)++{-+We count the occurences of gt-symbols+and accept it only if it is followed by an expression.+If a gtLimit is set, we only accept a maximum number of gt symbols+-}+ gtSym :: PT ()+ gtSym = try $ do+ token T_gt+ updateState (\env -> env {gtCounter = gtCounter env +1 })+ next <- testFollows parseExp+ case next of+ Nothing -> fail "Gt token not followed by an expression"+ Just _ -> do+ mode <- getStates gtLimit+ case mode of+ Nothing -> return ()+ Just x -> do+ cnt <- getStates gtCounter+ if cnt < x then return ()+ else fail "(Gt token belongs to sequence expression)"++ parseExp :: PT LExp-parseExp =- (parseDotExpOf $- buildExpressionParser procTable parseProcReplicatedExp--- buildExpressionParser opTable parseProcReplicatedExp- )+parseExp+ = (parseDotExpOf $ buildExpressionParser procTable parseProcReplicatedExp) <?> "expression" @@ -544,23 +594,6 @@ pos <-getPos return $ (\fkt -> mkLabeledNode pos $ CallFunction fkt args ) ---- this is complicated and meight as well be buggy !-gtSym :: PT ()-gtSym = try $ do- token T_gt- updateState countGt --we count the occurences of gt-symbols- next <- testFollows parseExp -- and accept it only if it is followed by an expression- case next of- Nothing -> fail "Gt token not followed by an expression"- (Just _) -> do --- mode <- getStates gtMode- case mode of- GtNoLimit -> return ()- (GtLimit x) -> do- cnt <- getStates gtCounter- if cnt < x then return ()- else fail "(Gt token belongs to sequence expression)" {- parse an sequenceexpression <...> we have to be carefull not to parse the end of sequence ">"@@ -591,29 +624,31 @@ return s {- parse an expression which contains as most count Greater-symbols (">"-used to leave the last ">" as end of sequence+the last ">" is left as end of sequence attention: this can be nested !! -} parseWithGtLimit :: Int -> PT a -> PT a parseWithGtLimit maxGt parser = do- oldLimit <- getStates gtMode- updateState $ setGtMode $ GtLimit maxGt+ oldLimit <- getStates gtLimit+ setGtLimit $ Just maxGt res <- optionMaybe parser- updateState $ setGtMode oldLimit+ setGtLimit oldLimit case res of Just p -> return p Nothing -> fail "contents of sequence expression"+ where+ setGtLimit g = updateState $ \env -> env {gtLimit = g} proc_op_aparallel :: PT (LExp -> LExp -> PT LExp) proc_op_aparallel = try $ do s <- getNextPos token T_openBrack- a1<-parseExp_noPrefix+ a1 <- parseExp_noPrefix token T_parallel- a2<-parseExp_noPrefix+ a2 <- parseExp_noPrefix token T_closeBrack- e<-getLastPos+ e <- getLastPos return $ (\p1 p2 -> mkLabeledNode (mkSrcSpan s e ) $ ProcAParallel a1 a2 p1 p2 ) proc_op_lparallel :: PT (LExp -> LExp -> PT LExp)@@ -723,36 +758,14 @@ exp <-parseExp return $ PatBind pat exp --- parse all fundefs and merge consecutive case alternatives-funBind :: PT [LDecl]-funBind = do- flist <-many1 sfun- -- group functioncases by the name of the function- let flgr = groupBy- (\a b -> (unIdent $ unLabel $ fst $ a) == (unIdent $ unLabel $ fst b))- flist- mapM mkFun flgr- where - mkFun :: [(LIdent,(FunArgs,LExp))] -> PT LDecl- mkFun l = do- let- fname = fst $ head l- pos = srcLoc fname- cases = map ((uncurry FunCase) . snd ) l- mkLabeledNode pos $ FunBind fname cases- -- parse a single function-case-sfun :: PT (LIdent,(FunArgs,LExp))-sfun = do- (fname,patl) <- try sfunHead+funBind :: PT LDecl+funBind = try $ do+ fname <- ident+ patl <- parseFktCurryPat token_is <?> "rhs of function clause" exp <-parseExp- return (fname,(patl,exp))- where- sfunHead = do - fname <- ident- patl <- parseFktCurryPat- return (fname,patl)+ mkLabeledNode (srcLoc fname) $ FunBind fname [FunCase patl exp] {- in CSP f(x)(y), f(x,y) , f((x,y)) are all different@@ -768,63 +781,100 @@ parseFktCspPat :: PT [LPattern] parseFktCspPat = inParens $ sepByComma parsePattern -parseDeclList :: PT [LDecl]-parseDeclList = do- decl<- many1 parseDecl- return $ concat decl---singleList :: PT a -> PT [a]-singleList a = do- av <-a- return [av]--{--returns a list of decls-because funBind can't easily parse a single function-ToDo : PatBinds are actually different from varbind-example x={} with patbind will not be polymorphic--}-parseDecl :: PT [LDecl]-parseDecl =- funBind- <|> singleList patBind - <?> "declaration"- topDeclList :: PT [LDecl]-topDeclList = do- decl<- many1 topDecl- return $ concat decl- where-- topDecl :: PT [LDecl]- topDecl =+topDeclList = sepByNewLine topDecl + where+ topDecl :: PT LDecl+ topDecl = choice+ [ funBind- <|> singleList patBind- <|> singleList parseAssert- <|> singleList parseTransparent- <|> singleList parseDatatype- <|> singleList parseSubtype- <|> singleList parseNametype- <|> singleList parseChannel- <|> singleList parsePrint- <?> "top-level declaration" + , patBind+ , parseAssertDecl+ , parseTransparent+ , parseDatatype+ , parseSubtype+ , parseNametype+ , parseChannel+ , parsePrint+ ] <?> "top-level declaration"+ + assertPolarity = fmap (odd . length) $ many $ token T_not - assertRef = withLoc $ do+ assertListRef = withLoc $ do token T_assert- p1<-parseExp- op<- token T_Refine {- ToDo: fix this -}- p2<-parseExp- return $ AssertRef p1 "k" p2+ negated <- assertPolarity+ p1 <- parseExp+ op <- refineOp+ p2 <- parseExp+ return $ AssertRefine negated p1 op p2 assertBool = withLoc $ do token T_assert- b<-parseExp+ b <- parseExp return $ AssertBool b - parseAssert :: PT LDecl- parseAssert = (try assertRef) <|> assertBool+ assertTauPrio = withLoc $ do+ token T_assert+ negated <- assertPolarity+ p1 <- parseExp+ op <- tauRefineOp+ p2 <- parseExp+ token T_tau+ token T_priority+ token T_over+ set <- parseExp+ return $ AssertTauPrio negated p1 op p2 set+ where+ tauRefineOp :: PT LTauRefineOp+ tauRefineOp = withLoc $ do + tok <- tokenPrimExDefault (\t -> Just $ tokenClass t)+ case tok of+ T_trace -> return TauTrace+ T_Refine -> return TauRefine+ _ -> fail "Unexpected Token" + assertIntFDRChecks = withLoc $ do+ token T_assert+ negated <- assertPolarity+ p <- parseExp+ model <- fdrModel+ extmode <- many $ extsMode+ ext <- case extmode of+ [] -> return Nothing+ [x] -> return $ Just x+ _ -> fail "More than one model extension."+ return $ AssertModelCheck negated p model ext+ where+ fdrModel :: PT LFDRModels+ fdrModel = withLoc $ do+ tok <- tokenPrimExDefault (\t -> Just $ tokenClass t)+ case tok of + T_deadlock -> token T_free >> return DeadlockFree+ T_deterministic -> return Deterministic+ T_livelock -> token T_free >> return LivelockFree+ _ -> fail "Modus is not supported by this parser."+ + extsMode :: PT LFdrExt+ extsMode = withLoc $ tokenPrimExDefault test+ where + test tok = case tokenClass tok of+ T_F -> Just F+ T_FD -> Just FD+ T_T -> Just T+ _ -> Nothing++ parseAssert :: PT LAssertDecl+ parseAssert = try assertTauPrio+ <|> try assertIntFDRChecks+ <|> try assertListRef+ <|> assertBool+ <?> "assert Declaration"++ parseAssertDecl :: PT LDecl+ parseAssertDecl = withLoc $ do+ e <- parseAssert+ return $ Assert e+ parseTransparent :: PT LDecl parseTransparent = withLoc $ do token T_transparent@@ -860,7 +910,7 @@ token T_nametype i <- ident token_is- t<-typeExp+ t <- typeExp return $ NameType i t parseChannel :: PT LDecl@@ -876,8 +926,7 @@ typeTuple = inSpan TypeTuple $ inParens $ sepBy1Comma parseExp - typeDot = inSpan TypeDot $- sepBy1 parseExpBase $ token T_dot+ typeDot = inSpan TypeDot $ sepBy1 parseExpBase $ token T_dot parsePrint :: PT LDecl parsePrint = withLoc $ do@@ -885,27 +934,21 @@ e <- parseExp return $ Print e -procOpSharing :: PT (LProc -> LProc -> PT LProc)-procOpSharing = do- spos <- getNextPos- al <- between ( token T_openOxBrack) (token T_closeOxBrack) parseExp- epos <- getLastPos- return $ (\a b -> mkLabeledNode (mkSrcSpan spos epos) $ ProcSharing al a b)- {- Replicated Expressions in Prefix form -} parseProcReplicatedExp :: PT LProc-parseProcReplicatedExp = do+parseProcReplicatedExp+ = choice+ [ procRep T_semicolon ProcRepSequence- <|> procRep T_sqcap ProcRepInternalChoice- <|> procRep T_box ProcRepExternalChoice- <|> procRep T_interleave ProcRepInterleave- <|> procRepAParallel- <|> procRepLinkParallel- <|> procRepSharing- <|> parsePrefixExp -- two calls make exponential blowup !--- <|> parseExpBase -- - <?> "parseProcReplicatedExp"+ , procRep T_sqcap ProcRepInternalChoice+ , procRep T_box ProcRepExternalChoice+ , procRep T_interleave ProcRepInterleave+ , procRepAParallel+ , procRepLinkParallel+ , procRepSharing+ , parsePrefixExp+ ] <?> "parseProcReplicatedExp" where -- todo : refactor all these to using inSpan procRep :: TokenClasses.PrimToken -> (LCompGenList -> LProc -> Exp) -> PT LProc@@ -1001,12 +1044,6 @@ _ <- setParserState oldState return res -getStates :: (PState -> x) -> PT x-getStates sel = do- st <- getState- return $ sel st-- primExUpdatePos :: SourcePos -> Token -> t -> SourcePos primExUpdatePos pos t@(Token {}) _ = newPos (sourceName pos) (-1) (Token.unTokenId $ Token.tokenId t)@@ -1022,15 +1059,16 @@ anyToken :: PT Token anyToken = tokenPrimEx Token.showToken primExUpdatePos (Just primExUpdateState) Just +notFollowedBy :: GenParser tok st Token -> GenParser tok st () notFollowedBy p = try (do{ c <- p; unexpected $ Token.showToken c } <|> return () ) +notFollowedBy' :: GenParser tok st a -> GenParser tok st () notFollowedBy' p- = try (do{ p; pzero }- <|> return ()- )+ = try $ ( p >> pzero ) <|> return ()+ eof :: PT () eof = notFollowedBy anyToken <?> "end of input" @@ -1040,8 +1078,10 @@ "expecting" "unexpected" "end of input" (ParsecError.errorMessages err) --wrapParseError :: [Token] -> Either ParsecError.ParseError LModule -> Either ParseError LModule+wrapParseError ::+ [Token]+ -> Either ParsecError.ParseError ModuleFromParser+ -> Either ParseError ModuleFromParser wrapParseError _ (Right ast) = Right ast wrapParseError tl (Left err) = Left $ ParseError { parseErrorMsg = pprintParsecError err@@ -1051,7 +1091,6 @@ where tokId = Token.mkTokenId $ sourceColumn $ ParsecError.errorPos err errorTok = maybe Token.tokenSentinel id $ find (\t -> tokenId t == tokId) tl- token_is :: PT () token_is = token T_is
− src/Language/CSPM/PatternCompiler.hs
@@ -1,160 +0,0 @@--------------------------------------------------------------------------------- |--- Module : Language.CSPM.PatternCompiler--- Copyright : (c) Fontaine 2008--- License : BSD--- --- Maintainer : fontaine@cs.uni-duesseldorf.de--- Stability : experimental--- Portability : GHC-only------ replace nested patterns with a set of linear Selectors--- todo : benchmark if it pays off to introduce --- helperbindings and only atomic bindings (unlikely)--- todo : add testcases-{-# LANGUAGE ViewPatterns #-}--module Language.CSPM.PatternCompiler- (- compilePattern- )-where--import Language.CSPM.AST as AST--import Control.Monad-import Data.Generics.Schemes (everywhere')-import Data.Generics.Aliases (mkT)-import Data.Array.IArray---- | replace all pattern in the module with list of linear Selectors-compilePattern :: LModule -> LModule-compilePattern ast - = Data.Generics.Schemes.everywhere' (Data.Generics.Aliases.mkT compPat) ast- where--- pattern that consist only of a variable match remain unchanged- compPat :: LPattern -> LPattern- compPat x@(unLabel -> VarPat {}) = x- compPat pat = case cp id pat of- [(i,s)] -> setNode pat $ Selector s i- x -> setNode pat $ Selectors {--- origPat = pat- selectors = listToArr $ map snd x- ,idents = listToArr $ map fst x- }-- listToArr :: [a] -> Array Int a- listToArr l = array (0,length l -1) $ zip [0..] l-- cp :: (Selector -> Selector ) -> LPattern -> [(Maybe LIdent,Selector)]- cp path pat = case unLabel pat of- IntPat i -> return (Nothing, path $ IntSel i)- TruePat -> return (Nothing, path TrueSel )- FalsePat -> return (Nothing, path FalseSel )- WildCard -> return (Nothing, path SelectThis )- VarPat x -> return (Just x , path SelectThis ) - ConstrPat x -> return (Nothing, path $ ConstrSel $ unUIdent $ unLabel x)- Also l -> concatMap (cp path) l- Append l -> do- let (prefix,suffix,variable) = analyzeAppendPattern l- msum [ concatMap (mkListPrefixPat path) prefix- , mkListVariablePat path variable- , concatMap (mkListSuffixPat path) suffix ]- DotPat l -> msum $ map- (\(x,i) -> cp (path . DotSel i) x)- (zip l [0..])- SingleSetPat p -> cp (path . SingleSetSel) p- EmptySetPat -> return (Nothing, path EmptySetSel)- ListEnumPat [] -> return (Nothing, path $ ListLengthSel 0 $ SelectThis )- ListEnumPat l -> do- let len = length l - msum $ map - (\(x,i) -> cp (path . ListLengthSel len . ListIthSel i) x)- (zip l [0..])- TuplePat [] -> return (Nothing, path $ TupleLengthSel 0 $ SelectThis )- TuplePat l -> do- let len = length l- msum $ map- (\(x,i) -> cp (path . TupleLengthSel len . TupleIthSel i) x)- (zip l [0..])- Selector {} -> error "PatternCompiler.hs : didn't expect Selector"- Selectors {} -> error "PatternCompiler.hs : didn't expect Selectors"-- mkListPrefixPat - :: (Selector -> Selector ) - -> (Offset,Len,LPattern)- -> [(Maybe LIdent,Selector)]- mkListPrefixPat path l = case l of- (0,1,pat) -> let (unLabel -> ListEnumPat [r]) = pat- in cp (path . HeadSel) r- (0,n,pat) -> cp (path . HeadNSel n) pat- (o,s,pat) -> cp (path . PrefixSel o s) pat-- mkListSuffixPat - :: (Selector -> Selector ) - -> (Offset,Len,LPattern)- -> [(Maybe LIdent,Selector)]- mkListSuffixPat path (o,l,pat)- = cp (path . SuffixSel o l) pat-- mkListVariablePat- :: (Selector -> Selector ) - -> Maybe (Offset,Offset,LPattern)- -> [(Maybe LIdent,Selector)]- mkListVariablePat _path Nothing = []- mkListVariablePat path (Just (l,r,pat)) = cp (path . SliceSel l r) pat--type Offset = Int-type Len = Int-analyzeAppendPattern :: - [LPattern] ->- ([(Offset,Len,LPattern)] -- prefixpattern- ,[(Offset,Len,LPattern)] -- suffixpattern- ,Maybe (Offset,Offset,LPattern)- )-analyzeAppendPattern pl- = let- taggedPatList = zip pl $ map lengthOfListPattern pl- prefixPat = computePrefixPattern taggedPatList- suffixPat = computeSuffixPattern taggedPatList- lenPrefix = sum $ map (\(_,l,_)-> l) prefixPat- lenSuffix = sum $ map (\(_,l,_)-> l) suffixPat- varPat = case filter (\(_,len) -> len == Nothing) taggedPatList of- [] -> Nothing- [(pat,_)] -> Just (lenPrefix,lenSuffix,pat)- l -> error $ "PatternCompiler.hs : alsopattern contains multiple "- ++ "variable length pattern "- ++ show l- in - (prefixPat,suffixPat,varPat)- where-{- compute the length of a list pattern- Just Int -> fixed length pattern- Nothing -> variable length pattern -}-- lengthOfListPattern :: LPattern -> Maybe Len- lengthOfListPattern p = case unLabel p of- ListEnumPat l -> return $ length l- Append patl -> do- l <- mapM lengthOfListPattern patl- return $ sum l- VarPat _ -> Nothing- Also patl -> do- let l = map lengthOfListPattern patl- -- todo: check that all length are equal:- error "PatternCompiler.hs: lengthOfListPat : also pattern: todo"- _ -> error $ "PatternCompiler.hs: lengthOfListPat : no list pattern "- ++ show p-{--PrefixPattern are fixed-length pattern with a fixed offset from the front-return when the first variable length pattern occurs--}- computePrefixPattern :: [(LPattern,Maybe Len)] -> [(Offset,Len,LPattern)]- computePrefixPattern l = worker 0 l where- worker _ [] = []- worker _ ((_ ,Nothing ) : _) = [] - worker offset ((pat,Just len): rest) - = (offset,len,pat) : worker (offset+len) rest-- computeSuffixPattern :: [(LPattern,Maybe Len)] -> [(Offset,Len,LPattern)]- computeSuffixPattern = computePrefixPattern . reverse
src/Language/CSPM/PrettyPrinter.hs view
@@ -1,266 +1,375 @@--{-# LANGUAGE TypeSynonymInstances #-}--{-# OPTIONS_GHC- -XTypeSynonymInstances- -XScopedTypeVariables #-}---- ---------------------------------------------------------------------------- -- | -- Module : Language.CSPM.PrettyPrinter--- Copyright : (c) Dobrikov 2008+-- Copyright : (c) Ivaylo Dobrikov 2010 -- License : BSD -- --- Maintainer : me@dobrikov.biz+-- Maintainer : Ivaylo Dobrikov (me@dobrikov.biz) -- Stability : experimental -- Portability : GHC-only---+-- +-- This module defines functions for pretty-printing the +-- Abstract Syntax Tree to CSPM syntax.+-----------------------------------------------------------------------------+ module Language.CSPM.PrettyPrinter+(+ PP (..)+,prettyPrintFile+) where -import Text.PrettyPrint as PrettyPrint hiding (char)-import qualified Text.PrettyPrint as PrettyPrint-import Language.CSPM.AST-import Language.CSPM.Utils--import Data.Maybe-+import Text.PrettyPrint -class PP x where pp :: x-> Doc+import Language.CSPM.AST+import Language.CSPM.Utils(parseFile) -mapPP :: PP x => [x] -> [Doc]-mapPP = map pp+-- | run the pretty printer on a file and write the output to+-- | filename.ast and filename.pretty+prettyPrintFile :: FilePath -> IO ()+prettyPrintFile f = do+ ast <- parseFile f+ writeFile (f ++ ".ast") (show ast)+ writeFile (f ++ ".pretty") $ render $ pp ast -instance (PP x) => PP (Labeled x) where - pp = pp . unLabel+-- | The pretty print class used for AST types+class PP x where+ pp :: x -> Doc -instance PP Ident where pp = text . unIdent+instance (PP x) => PP (Labeled x) where+ pp = pp . unLabel -instance PP Exp where pp = prettyExp+instance PP (Module a) where+ pp m = vcat $ map pp (moduleDecls m) -prettyExp :: Exp -> Doc-prettyExp x = case x of- Var x -> pp x- IntExp x -> integer x- SetExp a Nothing -> braces $ pp x- SetExp a (Just comp) -> braces ( pp a <+> text "|" <+> hcatCommaSpace comp)- ListExp a Nothing -> text "<" <+> pp a <+> text ">"- ListExp a (Just comp)- -> text "<" <+> pp a <+> text "|" <+> hcatCommaSpace comp <+> text ">"- ClosureComprehension (x,l) -> text "{|" <+> (hcat $ punctuate comma $ map pp x) <+> text "|" <+> (hcat $ punctuate comma $ map pp l) <+> text "|}"- Parens x -> parens (pp x)- BoolSet -> text "Bool"- IntSet -> text "Int"- Events -> text "Events"- Stop -> text "STOP"- Skip -> text "SKIP"- CTrue -> text "true"- CFalse -> text "false"- TupleExp xlist -> parens (hcat $ punctuate comma (map pp xlist))- DotTuple x -> hcat $ punctuate (text ".") $ map pp x- Closure x -> text "{|" <+> (hcat $ punctuate (comma <+> empty) $ map pp x) <+> text "|}"- CallBuiltIn x [list] -> pp x <> parens (hcat $ punctuate comma $ map pp list)- Ifte x y z -> text "if" <+> pp x <+> text "then" $$ pp y $$ text "else" <+> pp z- AndExp x y -> pp x <+> text "and" <+> pp y- OrExp x y -> pp x <+> text "or" <+> pp y- NotExp x -> text "not" <+> pp x- Fun1 x y -> pp x <> pp y- Fun2 fun x y -> pp x <+> pp fun <+> pp y- Lambda patt x -> text "\\" <+> (hcat $ punctuate (comma <+> empty) $ map pp patt) <+> text "@" <+> pp x- PrefixExp x l_comm_field y -> pp x <> (hcat $ map pp l_comm_field) <+> text "->" <+> pp y - ProcSharing x_middle x_left x_right -> pp x_left <+> text "[|" <+> pp x_middle <+> text "|]" <> pp x_right- Let decl x -> text "let" $$ (vcat $ map pp decl) $$ text "within" <+> pp x--- TODO CallFunction: produce not the correct output in file: protocol.fix.csp- CallFunction x [list] -> pp x <> parens (hcat $ punctuate (comma <+> empty) $ map pp list)- ProcLinkParallel list x y -> pp x <+> pp list <+> pp y- ProcAParallel x1 x2 x3 x4 -> pp x3 <+> brackets (pp x1 <+> text "||" <+> pp x2) <+> pp x4--- ProcRepInterleave (Labeled _ list _ :: (Labeled [LCompGen])) proc -> text "|||" <+> (hcat $ punctuate (space <> colon <> space) $ map pp list) <+> text "@" <+> pp proc--- ProcRepChoice (Labeled _ list _ :: (Labeled [LCompGen])) proc -> text "[]" <+> (hcat $ punctuate (space <> colon <> space) $ map pp list) <+> text "@" <+> pp proc--- pp (ProcRepSharing list x x_proc) = pp x <> text "[|" <> comp_gen_list list <> text "|]" <> pp x_proc -- nicht in die Beispiele vorhanden- ProcRenaming rlist Nothing proc -> pp proc <+> text "[[" <+> (hsep $ punctuate (space <> comma <> space) $ map pp rlist) <+> text "]]"- ProcRenaming rlist (Just lcomp) proc- -> pp proc <+> text "[[" <+> (hsep $ punctuate (space <> comma <> space) $ map pp rlist) <+> text "|" <+> (hsep $ punctuate (space <> comma <> space) $ map pp $ unLabel lcomp) <+> text "]]"--- ProcRepAParallel (Labeled _ list _ :: (Labeled [LCompGen])) alph body--- -> text "||" <+> (hsep $ punctuate (space <> comma <> space) $ map pp list) <+> text "@" <+> brackets (pp alph) <+> pp body --- pp (ProcRepSharing (Labeled s list v) x proc) = --- ProcRepInternalChoice (Labeled _ list _ :: (Labeled [LCompGen])) proc--- -> text "|~|" <+> (hsep $ punctuate (space <> comma <> space) $ map pp list) <+> text "@" <+> pp proc+-- help functions for the Instances of the Type-class PP+dot :: Doc+dot = text "." -hcatComma :: PP x => [x] -> Doc-hcatComma a = hcat $ punctuate comma $ mapPP a+ppListSet :: (PP r) => String -> String -> r -> Maybe [LCompGen] -> Doc+ppListSet str1 str2 range mgen = + case mgen of+ Nothing -> text str1 <+> pp range <+> text str2+ Just gen -> text str1 <+> pp range <+> text "|" <+> (hsep $ punctuate comma (map (ppCompGen False) gen)) <+> text str2 --- Ivo ? what is the difference between comma and (comma <+> empty) ?-hcatCommaSpace :: PP x => [x] -> Doc-hcatCommaSpace a = hcat $ punctuate (comma <+> empty) $ mapPP a- +hsepPunctuate :: (PP t) => Doc -> [t] -> Doc+hsepPunctuate s l = hsep $ punctuate s $ map pp l -instance PP Rename where- pp (Rename x y) = pp x <> text "<-" <> pp y+hcatPunctuate :: (PP t) => Doc -> [t] -> Doc+hcatPunctuate s l = hcat $ punctuate s $ map pp l -instance PP Range where- pp x = case x of- RangeEnum l -> hcatCommaSpace l- RangeOpen a -> pp a <+> text ".."- RangeClosed a b -> pp a <+> text ".." <+> pp b+printFunBind :: LIdent -> [FunCase] -> Doc+printFunBind ident lcase = vcat $ map (printIdent (unLabel ident) <>) (map printCase lcase) -instance PP CompGen where- pp (Generator patt x) = pp patt <> {-text "<-"-}colon <> pp x- pp (Guard x) = space <> pp x+printCase :: FunCase -> Doc+printCase c = case c of+ FunCaseI pat expr -> (parens $ hcatPunctuate comma pat) <+> equals <+> pp expr+ FunCase list expr -> (hcat $ map mkPat list) <+> equals <+> pp expr+ where+ mkPat l = parens $ hcatPunctuate comma l -comp_gen_list :: [LCompGen] -> Doc-comp_gen_list l = hcat $ punctuate empty (map pp l)+instance PP Decl where+ pp d = case d of+ PatBind pat expr -> pp pat <+> equals <+> (pp expr)+ FunBind ident lcase -> printFunBind ident lcase+ Assert a -> text "assert" <+> pp a+ Transparent ids+ -> text "transparent" <+> (hsep $ punctuate comma (map (printIdent . unLabel) ids))+ SubType ident constrs+ -> text "subtype" <+> printIdent (unLabel ident) <+> equals+ <+> (vcat $ punctuate (text "|") (map printConstr (map unLabel constrs)))+ DataType ident constrs+ -> text "datatype" <+> printIdent (unLabel ident) <+> equals + <+> (hsep $ punctuate (text "|") (map printConstr (map unLabel constrs)))+ NameType ident typ+ -> text "nametype" <+> printIdent (unLabel ident) <+> equals <+> typeDef typ+ Channel ids t+ -> text "channel" <+> (hsep $ punctuate comma $ map (printIdent . unLabel) ids) <+> typ+ where+ typ = case t of+ Nothing -> empty+ Just x -> text ":" <+> typeDef x+ Print expr -> text "print" <+> pp expr +printFunArgs :: [[LExp]] -> Doc+printFunArgs = hcat . map (parens . hsepPunctuate comma) -instance PP BuiltIn where- pp (BuiltIn const) = pp const +-- Contructors+printConstr :: Constructor -> Doc+printConstr (Constructor ident typ) = printIdent (unLabel ident) <>+ case typ of + Nothing -> empty+ Just t -> dot <> typeDef t ---type LCompGenList = Labeled [LCompGen]+-- Type Definitions+typeDef :: LTypeDef -> Doc+typeDef typ = case unLabel typ of+ TypeTuple e -> parens $ hcatPunctuate comma e+ TypeDot e -> hcatPunctuate dot e ---instance PP LCompGenList => (Labeled [LCompGen]) where--- pp list = list . unLabel+instance PP Exp where+ pp expression = case expression of+ Var ident -> printIdent $ unLabel ident+ IntExp i -> integer i+ SetExp range mgen -> ppListSet "{" "}" range mgen+ ListExp range mgen -> ppListSet "<" ">" range mgen+ ClosureComprehension (lexp,lcomp)+ -> ppListSet "{|" "|}" (labeled $ RangeEnum lexp) (Just lcomp)+ Let ldecl expr -> vcat+ [+ nest 2 (text "let")+ ,vcat $ punctuate (text "" $$ nest 4 (text "")) (map pp ldecl)+ ,nest 2 (text "within" <+> pp expr)+ ]+ Ifte expr1 expr2 expr3 -> vcat+ [+ nest 2 $ text "if" <+> pp expr1+ ,nest 4 $ text "then" <+> pp expr2+ ,nest 4 $ text "else" <+> pp expr3+ ]+ CallFunction expr list -> pp expr <> printFunArgs list+ CallBuiltIn builtin [expr] -> pp builtin <> (parens $ hsepPunctuate comma expr)+ CallBuiltIn _ _ -> error "pp Exp: builtin must exactly have one argument"+ Lambda pat expr -> text "\\" <+> hsepPunctuate comma pat <+> text "@" <+> pp expr+ Stop -> text "STOP"+ Skip -> text "SKIP"+ CTrue -> text "true"+ CFalse -> text "false"+ Events -> text "Events"+ BoolSet -> text "Bool"+ IntSet -> text "Int"+ ProcSet -> text "Proc"+ TupleExp e -> parens $ hsepPunctuate comma e+ Parens e -> parens $ pp e+ AndExp a b -> pp a <+> text "and" <+> pp b+ OrExp a b -> pp a<+> text "or" <+> pp b+ NotExp e -> text "not" <+> pp e+ NegExp e -> text " " <> text "-" <> pp e+ Fun1 builtin e -> pp builtin <> pp e+ Fun2 builtin a b -> pp a <+> pp builtin <+> pp b+ DotTuple l -> hcatPunctuate dot l+ Closure e -> text "{|" <+> hsepPunctuate comma e <+> text "|}" -instance PP Decl where- pp (PatBind x y) = pp x <+> equals <+> pp y- pp (DataType ident list_constr) = text "datatype" <+> pp ident <+> equals <+> (hcat $ punctuate (space <> text "|" <> space) $ map pp list_constr)- pp (AssertRef x s y) = text "assert" <+> pp x <+> ptext s <+> pp y - pp (AssertBool x) = text "assert" <+> pp x <+> text ":[livelock free]"- pp (Channel list_x ty_ref) = text "channel" <+> (hcat $ punctuate (comma <> space) $ map pp list_x) <> if isEmpty (pp ty_ref) - then empty - else space <> colon <> space <> pp ty_ref- pp (FunBind ident list) = {-pp ident {-<> text "("-} <>-} (vcat $ punctuate empty $ map (pp ident <>) (map pp list)) --TODO- pp (SubType ident list_constr) = text "subtype" <+> pp ident <+> equals <+> (hcat $ punctuate (space <> text "|" <> space) $ map pp list_constr)- pp (NameType ident ty_ref) = text "nametype" <+> pp ident <+> equals <+> pp ty_ref- pp (Transparent list) = text "transparent" <+> (hcat $ punctuate (comma <> space) $ map pp list)- pp (Print x) = text "print" <+> pp x+-- process expressions+ ProcSharing e p1 p2 -> pp p1 <> text "[|" <+> pp e <+> text "|]" <> pp p2+ ProcAParallel expr1 expr2 p1 p2+ -> pp p1 <> (brackets $ pp expr1 <+> text "||" <+> pp expr2) <> pp p2+ ProcLinkParallel llist p1 p2 -> pp p1 <> pp llist <> pp p2+ ProcRenaming renames mgen proc+ -> pp proc <> text "[[" <+> hsepPunctuate comma renames <+> gens <+> text "]]"+ where+ gens = case mgen of+ Nothing -> empty+ Just lgen -> text "|" <+> (separateGen False (unLabel lgen))+ + ProcException e p1 p2 -> pp p1 <+> text "[|" <+> pp e <+> text "|>" <+> pp p2+ ProcRepSequence lgen proc -> replicatedProc (text ";") (unLabel lgen) proc+ ProcRepInternalChoice lgen proc -> replicatedProc (text "|~|") (unLabel lgen) proc+ ProcRepExternalChoice lgen proc -> replicatedProc (text "[]") (unLabel lgen) proc+ ProcRepInterleave lgen proc -> replicatedProc (text "|||") (unLabel lgen) proc+ PrefixExp expr fields proc+ -> pp expr <> (hcat $ map pp fields) <+> text "->" <+> pp proc+ ProcRepSharing lgen expr proc+ -> text "[|" <+> pp expr <+> text "|]" + <+> (separateGen True (unLabel lgen)) <+> text "@" <+> pp proc+ ProcRepAParallel lgen expr proc+ -> text "||" <+> (separateGen True (unLabel lgen)) <+> text "@" + <+> (brackets $ pp expr) <+> pp proc+ ProcRepLinkParallel lgen llist proc+ -> pp llist <+> (separateGen True (unLabel lgen)) <+> text "@" <+> pp proc -instance PP Module where - pp m= vcat $ map pp (moduleDecls m)+-- only used in later stages+-- this do not affect the CSPM notation: same outputs as above+ PrefixI _ expr fields proc -> pp expr <> (hcat $ map pp fields) <+> text "->" <+> pp proc+ LetI decls _ expr -> hcat+ [+ nest 2 $ text "let"+ ,nest 4 $ hcat $ map pp decls+ ,nest 2 $ text "within" <+> pp expr+ ]+ LambdaI _ pat expr+ -> text "\\" <+> hsepPunctuate comma pat <+> text "@" <+> pp expr+ ExprWithFreeNames _ expr -> pp expr -instance PP FunCase where- pp (FunCase [l_fun_args] x) = text "(" <> (hcat $ punctuate (comma <+> empty) $ map pp l_fun_args ) <> text ")" <+> equals <+> pp x +replicatedProc :: Doc -> [LCompGen] -> LProc -> Doc+replicatedProc op lgen proc = op <+> (separateGen True lgen) <+> text "@" <+> pp proc instance PP LinkList where- pp (LinkList list_link) = brackets (hcat $ punctuate (comma <+> empty) $ map pp list_link)+ pp (LinkList list) = brackets $ hsepPunctuate comma list+ pp (LinkListComprehension lgen list)+ = brackets (hsepPunctuate comma list <+> text "|" <+> separateGen False lgen) instance PP Link where- pp (Link x y) = pp x <> text "<->" <> pp y+ pp (Link expr1 expr2) = pp expr1 <+> text "<->" <+> pp expr2 -instance PP Constructor where- pp (Constructor ident ty_ref) = pp ident <> if isEmpty (pp ty_ref) - then empty - else {-text "." <>-} pp ty_ref+instance PP Rename where+ pp (Rename expr1 expr2) = pp expr1 <+> text "<-" <+> pp expr2 -instance (PP x) => PP (Maybe x) where- pp (Just x) = pp x- pp Nothing = empty+separateGen :: Bool -> [LCompGen] -> Doc+separateGen b lgen = hsep $ punctuate comma $ map (ppCompGen b) lgen ---instance PP Funcase where -- siehe emptySet--- pp (Funcase [[arg]] x) = text "(" <> <> text ")" <+> equals <+> pp x+-- the generators of the comprehension sets, lists (all after the |) and +-- inside replicated processes (like "x: {1..10}", in this case the bool variable must be true,+-- otherwise false)+ppCompGen :: Bool -> LCompGen -> Doc +ppCompGen b gen = case unLabel gen of + (Generator pat expr) -> (pp pat) <+> case b of+ False -> text "<-" <+> (pp expr) + True -> text ":" <+> (pp expr)+ (Guard expr) -> pp expr -instance PP TypeDef where - pp (TypeTuple x) = text "." <> parens (hcat $ punctuate comma $ map pp x)- pp (TypeDot x) = (hcat $ punctuate (text ".") $ map pp x)+-- the range of sets and lists+instance PP Range where+ pp r = case r of+ RangeEnum expr -> hsepPunctuate comma expr+ RangeClosed a b -> pp a <> text ".." <> pp b+ RangeOpen expr -> pp expr <> text ".." -instance PP Pattern where- pp (IntPat x) = integer x- pp (VarPat x) = pp x- pp EmptySetPat = braces empty- pp WildCard = text "_"- pp (SingleSetPat patt) = brackets (pp patt)- pp (ListEnumPat list) = text "<" <> (hcat $ (punctuate (comma) $ map pp list)) <> text ">"- pp (TuplePat list) = parens (hcat $ (punctuate (comma) $ map pp list))- pp (DotPat list) = hcat $ punctuate (text ".") $ map pp list+-- unwrapp the BuiltIn-oparator+instance PP BuiltIn where+ pp (BuiltIn c) = pp c +-- the communication fields instance PP CommField where- pp (InComm x) = space <> text "?" <+> pp x- pp (OutComm x) = empty <> text "."{-"!"-} <> pp x - pp (InCommGuarded pattern x {-LPattern LExp-}) = space <> text "?" <+> pp pattern <+> colon <+> pp x+ pp (InComm pat) = text "?" <> pp pat+ pp (InCommGuarded pat expr) = text "?" <> pp pat <> text ":" <> pp expr+ pp (OutComm expr) = text "!" <> pp expr -instance PP Const where- pp F_true = text "true"- pp F_false = text "false"- pp F_not = text "not"- pp F_and = text "and"- pp F_or = text "or"- pp F_STOP = text "STOP"- pp F_SKIP = text "SKIP"- pp F_Mult = text "*"- pp F_Div = colon- pp F_Add = text "+"- pp F_Sub = text "-"- pp F_Eq = text "=="- pp F_NEq = text "!=" - pp F_ExtChoice = text "[]"- pp F_Union = text "Union"- pp F_concat = text "concat"- pp F_Concat = text "^"- pp F_union = text "union"- pp F_inter = text "inter"- pp F_diff = text "diff"- pp F_Inter = text "Inter"- pp F_member = text "member"- pp F_card = text "card"- pp F_empty = text "empty"- pp F_set = text "set"- pp F_Set = text "Set"- pp F_null = text "null"- pp F_Seq = text "Seq"- pp F_head = text "head"- pp F_tail = text "tail"- pp F_elem = text "elem"- pp F_Events = text "Events"- pp F_Int = text "Int"- pp F_Bool = text "Bool"- pp F_GE = text ">="- pp F_LE = text "<="- pp F_LT = text "<"- pp F_GT = text ">"- pp F_Sequential = text "Sequential"- pp F_Guard = text "&"- pp F_Interrupt = text "/\\"- pp F_Len2 = text "#"- pp F_CHAOS = text "CHAOS"- pp F_Timeout = text "[>"- pp F_IntChoice = text "|~|"- pp F_Interleave = text "|||"- pp F_Hiding = text "\\"- pp F_length = text "length"- pp F_Mod = text "%"+-- pretty-printing for CSPM-Patterns+instance PP Pattern where+ pp pattern = case pattern of+ IntPat n -> integer n+ TruePat -> text "true"+ FalsePat -> text "false"+ WildCard -> text "_"+ ConstrPat ident -> printIdent $ unLabel ident+ Also pat -> ppAlso (Also pat)+ Append pat -> hcatPunctuate (text "^") pat+ DotPat [] -> error "pp Pattern: empty dot pattern"+ DotPat [pat] -> pp pat+ DotPat l -> hcat $ punctuate dot $ map nestedDotPat l+ SingleSetPat pat -> text "{" <+> (pp pat) <+> text "}"+ EmptySetPat -> text "{ }"+ ListEnumPat pat -> text "<" <+> hsepPunctuate comma pat <+> text ">"+ TuplePat pat -> text "(" <> hsepPunctuate comma pat <> text ")"+ VarPat ident -> printIdent $ unLabel ident+ Selectors _ _ -> error "pp Pattern Seclectors"+ Selector _ _ -> error "pp Pattern Seclector"+ where+ nestedDotPat p = case unLabel p of+ DotPat {} ->parens $ pp p+ x -> pp x -to_PString :: LModule -> String-to_PString my_mod = render (pp my_mod) +-- external function for Also-Patterns for a better look+ppAlso :: Pattern -> Doc+ppAlso (Also []) = text ""+ppAlso (Also (h:t)) = + case unLabel h of+ DotPat _ -> if length t > 0 then (pp h) <> text "@@" <> ppAlso (Also t)+ else pp h+ Append _ -> if length t > 0 then (pp h) <> text "@@" <> ppAlso (Also t)+ else pp h+ _ -> if length t > 0 then pp h <> text "@@" <> ppAlso (Also t)+ else pp h+ppAlso _ = text "" +-- disticts the cases for different syntax-records for the Ident datatype+printIdent :: Ident -> Doc+printIdent ident = + case ident of + Ident _ -> text $ unIdent ident+ UIdent _ -> text $ realName $ unUIdent ident -runPretty :: FilePath -> IO String -runPretty fname = - do - my_mod <- parseFile fname- return (to_PString my_mod) --(render (pp mod)) +instance PP AssertDecl where+ pp a = case a of+ AssertBool expr -> pp expr+ AssertRefine n expr1 op expr2+ -> negated n $ pp expr1 <+> pp op <+> pp expr2+ AssertTauPrio n expr1 op expr2 expr3+ -> negated n $ pp expr1 <+> pp op <+> pp expr2 <+> text ":[tau priority over]:" <+> pp expr3+ AssertModelCheck n expr m mb+ -> negated n $ pp expr <+> text ":[" <+> pp m <+> maybe empty pp mb <+> text "]"+ where+ negated ar doc = if ar then text "not" <+> doc else doc -compareTrees :: FilePath -> IO Bool-compareTrees file = - do - parsedFile <- parseFile file- let prettyFile = to_PString parsedFile- writeFile (file ++ ".pp") prettyFile- secondPFile <- parseFile file- if (parsedFile == secondPFile)- then - return True- else - return False +instance PP FdrExt where+ pp F = text "[F]"+ pp FD = text "[FD]"+ pp T = text "[T]" -simpleCompare :: FilePath -> FilePath -> IO Bool-simpleCompare file1 file2 = - do - tree1 <- readFile file1- tree2 <- readFile file2- if (tree1 == tree2)- then - return True- else - return False +instance PP FDRModels where+ pp DeadlockFree = text "deadlock free"+ pp Deterministic = text "deterministic"+ pp LivelockFree = text "livelock free" +instance PP RefineOp where + pp Trace = text "[T="+ pp Failure = text "[F="+ pp FailureDivergence = text "[FD="+ pp RefusalTesting = text "[R="+ pp RefusalTestingDiv = text "[RD="+ pp RevivalTesting = text "[V="+ pp RevivalTestingDiv = text "[VD="+ pp TauPriorityOp = text "[TP="++instance PP TauRefineOp where+ pp TauTrace = text "[T="+ pp TauRefine = text "[="++instance PP Const where+-- Booleans+ pp F_true = text "true"+ pp F_false = text "false"+ pp F_not = text "not"+ pp F_and = text "and"+ pp F_or = text "or"+-- Numbers+ pp F_Mult = text "*"+ pp F_Div = text "/"+ pp F_Mod = text "%"+ pp F_Add = text "+"+ pp F_Sub = text "" <+> text "-"+-- Equality+ pp F_GE = text ">="+ pp F_LE = text "<="+ pp F_LT = text "<"+ pp F_GT = text ">"+ pp F_Eq = text "=="+ pp F_NEq = text "!="+-- Sets+ pp F_union = text "union"+ pp F_inter = text "inter"+ pp F_diff = text "diff"+ pp F_Union = text "Union"+ pp F_Inter = text "Inter"+ pp F_member = text "member"+ pp F_card = text "card"+ pp F_empty = text "empty"+ pp F_set = text "set"+ pp F_Set = text "Set"+ pp F_Seq = text "Seq"+-- Types+ pp F_Int = text "Int"+ pp F_Bool = text "Bool"+--Sequences+ pp F_null = text "null"+ pp F_head = text "head"+ pp F_tail = text "tail"+ pp F_concat = text "concat" + pp F_elem = text "elem"+ pp F_length = text "length"+ pp F_Concat = text "^" + pp F_Len2 = text "#"+--process oprators+ pp F_STOP = text "STOP"+ pp F_SKIP = text "SKIP"+ pp F_Events = text "Events"+ pp F_CHAOS = text "CHAOS"+ pp F_Guard = text "&"+ pp F_Sequential = text ";"+ pp F_Interrupt = text "/\\"+ pp F_ExtChoice = text "[]"+ pp F_IntChoice = text "|~|"+ pp F_Hiding = text "\\"+ pp F_Timeout = text "[>"+ pp F_Interleave = text "|||"
src/Language/CSPM/Rename.hs view
@@ -1,9 +1,8 @@-{-# LANGUAGE DeriveDataTypeable #-} ----------------------------------------------------------------------------- -- | -- Module : Language.CSPM.Rename--- Copyright : (c) Fontaine 2008--- License : BSD+-- Copyright : (c) Fontaine 2008 - 2011+-- License : BSD3 -- -- Maintainer : Fontaine@cs.uni-duesseldorf.de -- Stability : experimental@@ -19,18 +18,26 @@ todo :: check idType in useIdent fix topleveldecls to toplevel ? -> allready done by parser -}++{-# LANGUAGE EmptyDataDecls, DeriveDataTypeable #-}+ module Language.CSPM.Rename (- getRenaming+ renameModule+ ,getRenaming ,applyRenaming- ,RenameError(..)+ ,RenameError (..)+ ,RenameInfo (..)+ ,ModuleFromRenaming+ ,FromRenaming ) where--import Language.CSPM.AST hiding (prologMode,bindType)+import Language.CSPM.AST hiding (prologMode, bindType) import qualified Language.CSPM.AST as AST import qualified Language.CSPM.SrcLoc as SrcLoc +import Data.Generics.Basics (Data(..))+import Data.Data (mkDataType) import Data.Generics.Schemes (everywhere) import Data.Generics.Aliases (mkT) import Data.Typeable (Typeable)@@ -39,30 +46,57 @@ import Control.Monad.Error import Control.Monad.State import Data.Set (Set)-import qualified Data.Set as Set import qualified Data.Map as Map+import qualified Data.Set as Set import qualified Data.IntMap as IntMap+import Data.List as List +instance Data FromRenaming+ where+ gunfold = error "instance Data FromRenaming gunfold"+ toConstr = error "instance Data FromRenaming toConstr"+ dataTypeOf _ = mkDataType "Language.CSPM.Rename.FromRenaming" []++-- | A module that has gone through renaming+type ModuleFromRenaming = Module FromRenaming+{-# DEPRECATED applyRenaming, getRenaming "use renameModule instead" #-}++-- | Tag that a module has gone through renameing.+data FromRenaming deriving Typeable++-- | 'renameModule' renames a 'Module'.+-- | (also calls mergeFunBinds)+renameModule ::+ ModuleFromParser+ -> Either RenameError (ModuleFromRenaming, RenameInfo)+renameModule m = do+ let m' = mergeFunBinds m+ st <- execStateT (rnModule m') initialRState+ return+ (+ applyRenamingNew m' (identDefinition st) (identUse st)+ ,st)+ -- | 'getRenaming' computes two 'AstAnnotation's. -- The first one contains all the defining occurences of identifier -- The second one contains all the using occurences of identitier. -- 'getRename' returns an 'RenameError' if the 'Module' contains unbound -- identifiers or illegal redefinitions. getRenaming ::- LModule - -> Either RenameError (Bindings,AstAnnotation UniqueIdent,AstAnnotation UniqueIdent)-getRenaming m- = case execStateT (rnModule m) initialRState of- Right state -> Right (visible state,identDefinition state, identUse state)- Left e -> Left e+ ModuleFromParser+ -> Either RenameError (Bindings, AstAnnotation UniqueIdent, AstAnnotation UniqueIdent)+getRenaming m = do+ st <- execStateT (rnModule m) initialRState+ return (visible st,identDefinition st, identUse st) -type RM x = StateT RState (Either RenameError) x+type RM x = StateT RenameInfo (Either RenameError) x type UniqueName = Int -data RState = RState+-- | Gather all information about an renaming. +data RenameInfo = RenameInfo {- nameSupply :: UniqueName+ nameSupply :: Int -- used to check that we do not bind a name twice inside a pattern ,localBindings :: Bindings ,visible :: Bindings -- everything that is visible@@ -73,8 +107,8 @@ ,bindType :: BindType } deriving Show -initialRState :: RState-initialRState = RState+initialRState :: RenameInfo+initialRState = RenameInfo { nameSupply = 0 ,localBindings = Map.empty@@ -225,8 +259,8 @@ nop :: RM () nop = return () -rnModule :: LModule -> RM ()-rnModule m = rnDeclList $ moduleDecls $ unLabel m+rnModule :: ModuleFromParser -> RM ()+rnModule = rnDeclList . moduleDecls rnExpList :: [LExp] -> RM () rnExpList = mapM_ rnExp@@ -253,6 +287,7 @@ Events -> nop BoolSet -> nop IntSet -> nop+ ProcSet -> nop TupleExp l -> rnExpList l Parens a -> rnExp a AndExp a b -> rnExp a >> rnExp b@@ -269,6 +304,7 @@ ProcRenaming rlist gen proc -> case gen of Nothing -> mapM_ reRename rlist >> rnExp proc Just comp -> inCompGenL comp (mapM_ reRename rlist) >> rnExp proc+ ProcException p1 e p2 -> rnExp p1 >> rnExp e >> rnExp p2 ProcRepSequence a p -> inCompGenL a (rnExp p) ProcRepInternalChoice a p -> inCompGenL a (rnExp p) ProcRepInterleave a p -> inCompGenL a (rnExp p)@@ -320,7 +356,7 @@ rnCommField :: LCommField -> RM () rnCommField f = case unLabel f of InComm pat -> rnPattern pat- InCommGuarded p g -> rnPattern p >> rnExp g+ InCommGuarded p g -> rnExp g >> rnPattern p OutComm e -> rnExp e inCompGenL :: LCompGenList -> RM () -> RM ()@@ -365,8 +401,7 @@ PatBind pat _ -> rnPattern pat --todo : proper type-checking/counting number of Funargs FunBind i _ -> bindNewUniqueIdent (FunID (-1)) i- AssertRef {} -> nop- AssertBool {} -> nop+ Assert {} -> nop Transparent tl -> mapM_ (bindNewTopIdent TransparentID) tl SubType i clist -> do bindNewTopIdent DataTypeID i -- fix this@@ -392,8 +427,11 @@ declRHS d = case unLabel d of PatBind _ e -> rnExp e FunBind _ cases -> mapM_ rnFunCase cases- AssertRef a _ b -> rnExp a >> rnExp b- AssertBool e -> rnExp e+ Assert a -> case unLabel a of+ AssertBool e -> rnExp e+ AssertRefine _ p1 _ p2 -> rnExp p1 >> rnExp p2+ AssertTauPrio _ p1 _ p2 e -> rnExp p1 >> rnExp p2 >> rnExp e+ AssertModelCheck _ p _ _ -> rnExp p Transparent _ -> nop SubType _ clist -> forM_ clist rnConstructorRHS DataType _ clist -> forM_ clist rnConstructorRHS@@ -423,10 +461,18 @@ -- the 'AstAnnotation's. applyRenaming :: (Bindings,AstAnnotation UniqueIdent,AstAnnotation UniqueIdent)- -> LModule - -> LModule+ -> ModuleFromParser+ -> ModuleFromRenaming applyRenaming (_,defIdent,usedIdent) ast- = everywhere (mkT patchVarPat . mkT patchIdent) ast+ = applyRenamingNew ast defIdent usedIdent++applyRenamingNew ::+ ModuleFromParser+ -> AstAnnotation UniqueIdent+ -> AstAnnotation UniqueIdent+ -> ModuleFromRenaming+applyRenamingNew ast defIdent usedIdent+ = castModule $ everywhere (mkT patchVarPat . mkT patchIdent) ast where patchIdent :: LIdent -> LIdent patchIdent l =@@ -442,3 +488,35 @@ VarID -> p _ -> ConstrPat x patchVarPat x = x++-- | If function is defined via pattern matching for serveral cases,+-- | the parser returns each case as a individual declaration.+-- | mergeFunBinds merges contiguous cases of the same function into one declaration.+mergeFunBinds :: ModuleFromParser -> ModuleFromParser+mergeFunBinds = everywhere (mkT patchModule . mkT patchLet)+ where+ patchModule :: ModuleFromParser -> ModuleFromParser+ patchModule m = m {moduleDecls = mergeDecls $ moduleDecls m}++ patchLet :: Exp -> Exp+ patchLet (Let decls expr) = Let (mergeDecls decls) expr+ patchLet x = x++ mergeDecls :: [LDecl] -> [LDecl]+ mergeDecls = map joinGroup . List.groupBy sameFunction++ sameFunction a b = case (unLabel a, unLabel b) of+ (FunBind n1 _, FunBind n2 _) -> unLabel n1 == unLabel n2+ _ -> False++ joinGroup :: [LDecl] -> LDecl+ joinGroup l@(firstCase : _) = case unLabel firstCase of+ FunBind fname _ -> setNode firstCase $ FunBind fname $ map getFunCase l+ _ -> firstCase+ joinGroup [] = error "unreachable : groupBy empty group ?"++ getFunCase :: LDecl -> FunCase+ getFunCase d = case unLabel d of+ FunBind _ [funCase] -> funCase+ FunBind _ _ -> error "mergeFunBinds: function already has several cases !"+ _ -> error "mergeFunBinds : internal error"
src/Language/CSPM/Token.hs view
@@ -8,7 +8,7 @@ -- Stability : provisional -- Portability : GHC-only ----- This module contains the datatype Tokens.+-- This module contains the data type Tokens and some helper functions {-# LANGUAGE DeriveDataTypeable, GeneralizedNewtypeDeriving #-} @@ -24,7 +24,7 @@ import Control.Exception (Exception) newtype TokenId = TokenId {unTokenId :: Int}- deriving (Show,Eq,Ord,Enum,Ix, Typeable, Data)+ deriving (Show, Eq, Ord, Enum, Ix, Typeable, Data) mkTokenId :: Int -> TokenId mkTokenId = TokenId@@ -59,7 +59,7 @@ , tokenLen :: Int , tokenClass :: PrimToken , tokenString :: String- } deriving (Show,Eq,Ord, Typeable, Data)+ } deriving (Show, Eq, Ord, Typeable, Data) tokenSentinel :: Token tokenSentinel = Token@@ -73,5 +73,4 @@ showPosn (AlexPn _ line col) = show line ++ ':': show col showToken :: Token -> String-showToken Token {tokenString=str} = "'"++str++"'"-+showToken Token {tokenString = str} = "'" ++ str ++ "'"
src/Language/CSPM/TokenClasses.hs view
@@ -1,14 +1,14 @@ ----------------------------------------------------------------------------- -- | -- Module : Language.CSPM.TokenClasses--- Copyright : (c) Fontaine 2008+-- Copyright : (c) Fontaine 2008 - 2011 -- License : BSD -- -- Maintainer : Fontaine@cs.uni-duesseldorf.de -- Stability : provisional -- Portability : GHC-only ----- This module contains the datatype Tokens.+-- This module contains the data type PrimToken. {-# LANGUAGE DeriveDataTypeable, GeneralizedNewtypeDeriving #-} @@ -19,16 +19,16 @@ import Data.Generics.Basics (Data) import Data.Generics.Instances () +-- | The token classes of the CSP-M lexer data PrimToken = L_Integer | L_String | L_Ident- | L_CSPFDR -- needed for special assertions | L_LComment | L_BComment | L_EOF | L_Include- | T_Refine+ | L_Newline -- keywords | T_channel | T_datatype@@ -71,6 +71,7 @@ | T_SKIP | T_Events | T_Int+ | T_Proc | T_Bool | T_CHAOS -- symbols@@ -93,6 +94,7 @@ | T_triangle -- "/\\" | T_box -- "[]" | T_rhd -- "[>"+ | T_exp -- "|>" | T_sqcap -- "|~|" | T_interleave -- "|||" | T_backslash -- "\\"@@ -114,6 +116,7 @@ | T_closeBrace -- "}" | T_openBrack -- "[" | T_closeBrack -- "]"+ | T_startAssert -- ":[" | T_openOxBrack -- "[|" | T_closeOxBrack -- "|]" | T_openBrackBrack -- "[["@@ -122,4 +125,24 @@ | T_closePBrace -- "|}" | T_underscore -- "_" | T_is -- "="+-- assert List refinement Operators+ | T_Refine -- "[="+ | T_trace -- "[T="+ | T_failure -- "[F="+ | T_failureDivergence -- "[FD="+ | T_refusalTesting -- "[R="+ | T_refusalTestingDiv -- "[RD="+ | T_revivalTesting -- "[V="+ | T_revivalTestingDiv -- "[VD="+ | T_tauPriorityOp -- "[TP="+ | T_tau+ | T_priority+ | T_over+ | T_deadlock+ | T_deterministic+ | T_livelock+ | T_free+ | T_F+ | T_T+ | T_FD deriving (Show,Eq,Ord,Typeable, Data)
src/Language/CSPM/Utils.hs view
@@ -15,15 +15,14 @@ ,handleLexError ,handleParseError ,handleRenameError- ,parseFile,testFrontend)+ ,parseFile, benchmarkFrontend, parseString) where -import Language.CSPM.Parser (ParseError(..),parse)-import Language.CSPM.Rename (RenameError(..),getRenaming,applyRenaming)-import Language.CSPM.Token (Token, LexError(..))-import Language.CSPM.AST (LModule)-import qualified Language.CSPM.LexHelper as Lexer- (lexInclude,lexPlain,filterIgnoredToken)+import Language.CSPM.Parser (ParseError(..), parse)+import Language.CSPM.Rename (RenameError(..), renameModule, ModuleFromRenaming)+import Language.CSPM.Token (LexError(..))+import Language.CSPM.AST (ModuleFromParser)+import qualified Language.CSPM.LexHelper as Lexer (lexInclude) import Control.Exception as Exception import System.CPUTime@@ -46,14 +45,24 @@ handleRenameError handler proc = Exception.catch proc handler -- | Lex and parse a file and return a "LModule", throw an exception in case of an error-parseFile :: FilePath -> IO LModule+parseFile :: FilePath -> IO ModuleFromParser parseFile fileName = do src <- readFile fileName- tokenList <- Lexer.lexInclude src >>= eitherToExc- eitherToExc $ parse fileName tokenList+ parseNamedString fileName src -testFrontend :: FilePath -> IO (LModule,LModule)-testFrontend fileName = do+-- | Small test function which just parses a String.+parseString :: String -> IO ModuleFromParser+parseString = parseNamedString "no-file-name"++parseNamedString :: FilePath -> String -> IO ModuleFromParser+parseNamedString name str = do+ tokenList <- Lexer.lexInclude str >>= eitherToExc+ eitherToExc $ parse name tokenList++-- | Lex and parse File.+-- | Return the module and print some timing infos+benchmarkFrontend :: FilePath -> IO (ModuleFromParser, ModuleFromRenaming)+benchmarkFrontend fileName = do src <- readFile fileName putStrLn $ "Reading File " ++ fileName@@ -64,8 +73,7 @@ ast <- eitherToExc $ parse fileName tokenList time_have_ast <- getCPUTime - renaming <- eitherToExc $ getRenaming ast- let astNew = applyRenaming renaming ast+ (astNew, _renaming) <- eitherToExc $ renameModule ast time_have_renaming <- getCPUTime putStrLn $ "Parsing OK"
− src/Language/CSPM/Version.hs
@@ -1,48 +0,0 @@--------------------------------------------------------------------------------- |--- Module : Language.CSPM.Version--- Copyright : (c) Fontaine 2008--- License : BSD--- --- Maintainer : Fontaine@cs.uni-duesseldorf.de--- Stability : experimental--- Portability : GHC-only------ Use Template Haskell to gather some info a compile-time.--- (Template-Haskell makes problems with haddock)-{-# LANGUAGE TemplateHaskell #-}-module Language.CSPM.Version-(- version-)-where--import qualified Paths_CSPM_Frontend as Paths-import Language.Haskell.TH-import System.Time-import System.Info-import Data.List---import Network.BSD --check if this is the reason why we have to link to network ?-import Data.Version---- | "version" returns a "String" with some info about the, on which the libray was built.-version :: IO String-version = return $( let - mkVersion :: IO String- mkVersion = do- timeDate <- getClockTime--- hn <- getHostName- let sysInfo = concat $ intersperse " " [- "CSPM-Fronted"- ,show Paths.version- ,"\nCompiled at",show timeDate--- ,"\non",hn- ,"\n(",os,arch,compilerName,showVersion compilerVersion ,")"- ]- putStrLn "\n\n"- putStrLn "version :"- putStrLn sysInfo- putStrLn "\n\n"- return sysInfo- in stringE =<< runIO mkVersion - )