Skip to content
Snippets Groups Projects
Commit d4d42971 authored by Hans-Peter Deifel's avatar Hans-Peter Deifel
Browse files

Initial import

parents
Branches
No related tags found
No related merge requests found
import Distribution.Simple
main = defaultMain
Function <Subtask Handler12> Subtask <Subtask Handler12>
-> ENTRY ABB40/kickoff
ABB37/TerminateTask [ABB38]
->! OSEKOS_TerminateTask_BB134
ABB38 []
ABB39 [ABB37/TerminateTask]
ABB40/kickoff [ABB39]
->! OSEKOS_kickoff_1
Function <Subtask Handler13> Subtask <Subtask Handler13>
-> ENTRY ABB47/kickoff
ABB44/TerminateTask [ABB45]
->! OSEKOS_TerminateTask_BB138
ABB45 []
ABB46 [ABB44/TerminateTask]
ABB47/kickoff [ABB46]
->! OSEKOS_kickoff_2
Function <Function _Z12foo_functionv> Subtask <Subtask Handler11>
-> ENTRY ABB85
ABB83/ActivateTask [ABB84]
->! OSEKOS_ActivateTask_BB111
ABB84 []
ABB85 [ABB83/ActivateTask]
Function <Subtask Handler11> Subtask <Subtask Handler11>
-> ENTRY ABB24/kickoff
ABB9/ActivateTask [ABB10]
->! OSEKOS_ActivateTask_BB118
ABB10 [ABB31, ABB32]
-> <Function _Z14print_os_statei>
ABB15/ActivateTask [ABB16]
->! OSEKOS_ActivateTask_BB124
ABB16 [ABB33]
ABB17 [ABB18]
-> <Function _Z12foo_functionv>
ABB18 [ABB33]
ABB21/TerminateTask [ABB22]
->! OSEKOS_TerminateTask_BB130
ABB22 []
ABB23 [ABB9/ActivateTask]
ABB24/kickoff [ABB23]
->! OSEKOS_kickoff_0
ABB31 [ABB15/ActivateTask]
ABB32 [ABB17]
ABB33 [ABB21/TerminateTask]
{-# LANGUAGE DuplicateRecordFields #-}
module CFG.Parser where
import Text.Megaparsec
import Text.Megaparsec.Text
import Text.Megaparsec.Char
import Data.Text (Text)
import qualified Data.Text as T
import Control.Monad
data Function = Function
{ header :: FunctionHeader
, entryNode :: Text
, blocks :: [Block]
}
deriving (Show)
data FunctionKind = KindFunction | KindSubtask
deriving (Show)
data Block = Block
{ name :: Text
, successors :: [Text]
, callInfo :: Maybe CallInfo
}
deriving (Show)
data CallInfo = FunctionCall Text | SystemCall Text
deriving (Show)
cfg :: Parser [Function]
cfg = many function
function :: Parser Function
function = Function <$> functionHeader <*> entry <*> many block
data FunctionHeader = FunctionHeader
{ kind :: FunctionKind
, name :: Text
, subtask :: Text
}
deriving (Show)
-- Looks like this: Function <Subtask Handler12> Subtask <Subtask Handler12>
functionHeader :: Parser FunctionHeader
functionHeader =
FunctionHeader <$> (string "Function <" *> functionKind)
<*> (char ' ' *> identifier)
<*> (string "> Subtask <Subtask " *> identifier <* char '>' <* eol)
functionKind :: Parser FunctionKind
functionKind = (string "Subtask" *> return KindSubtask)
<|> (string "Function" *> return KindFunction)
-- Parses the entry node
-- Looks like "-> ENTRY ABBsomething"
entry :: Parser Text
entry = string "-> ENTRY " *> identifier <* eol
block :: Parser Block
block = someSpace *> (Block <$> identifier
<*> (char ' ' *> identList)
<*> (eol *> optional (try pCallInfo)))
pCallInfo :: Parser CallInfo
pCallInfo = someSpace >> string "->" >>
( string "! " *> (SystemCall <$> identifier)
<|> string " " *> (FunctionCall <$> identifier))
<* eol
identifier :: Parser Text
identifier = T.pack <$> some (alphaNumChar <|> char '/' <|> char '_')
<?> "identifier"
identList :: Parser [Text]
identList = between (char '[') (char ']') $
identifier `sepBy` (char ',' >> char ' ')
someSpace :: Parser ()
someSpace = skipSome spaceChar
module Main where
import CFG.Parser
main :: IO ()
main = return ()
name: stub-generator
version: 0.1.0.0
-- synopsis:
-- description:
-- license:
-- license-file: LICENSE
-- author:
-- maintainer:
-- copyright:
-- category:
build-type: Simple
-- extra-source-files:
cabal-version: >=1.10
executable stub-generator
main-is: Main.hs
other-modules: CFG.Parser
-- other-extensions:
build-depends: base >=4.8 && <4.10
, megaparsec >= 5 && <5.1
, text >= 1.2 && <1.3
hs-source-dirs: src
default-language: Haskell2010
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment