diff --git a/CodeGenTest.hs b/CodeGenTest.hs new file mode 100644 index 0000000000000000000000000000000000000000..3eb9dade69ea25a633819f9c6c7b6637d2eaf786 --- /dev/null +++ b/CodeGenTest.hs @@ -0,0 +1,53 @@ + +import LysKom.Internal.CodeGen (f) +import Language.Haskell.TH (runQ, runIO, pprint) +import LysKom.ProtocolA (documentParser) +import Text.ParserCombinators.Parsec (parseFromFile) +import Data.Either (rights) +import Data.List +import LysKom.ProtocolA.Data (ProtocolAItem (..)) +import LysKom.ProtocolA.Types + ( LysType ( ENUMERATION_OF + , ENUMERATION + , SELECTION + )) + +proc :: ProtocolAItem -> Int +proc (Comment _) = 0 +proc (DerivedType _ _) = 1 +proc (Request _ _ _ _) = 3 +proc (Async _ _ _) = 5 +proc (ProtoEdition _) = 0 +proc (ProtoVer _) = 0 +proc (LysKomDVersion _) = 0 +proc (TypeAlias _ _) = 2 +proc (RequestAlias _ _) = 4 +proc (AsyncAlias _ _) = 6 +proc (Other _) = 9 + +selection2Enum :: LysType -> LysType +selection2Enum (SELECTION xs) = ENUMERATION [ (n ++ "E", i) | (i, n, _) <- xs ] + + +isSelect :: String -> ProtocolAItem -> Bool +isSelect m (DerivedType n d) = n == m +isSelect _ _ = False + +enumOf2Enum :: [ProtocolAItem] -> ProtocolAItem -> ProtocolAItem +enumOf2Enum lst (DerivedType n (ENUMERATION_OF t)) + = let (DerivedType m selection) = head $ filter (isSelect t) lst + in DerivedType n . selection2Enum $ selection +enumOf2Enum lst a = a + + +main :: IO () +main = do + d <- parseFromFile documentParser "/usr/share/doc/lyskom/protocol-a-full.txt" + let dat = sortOn proc $ head $ rights [d] + let dat' = map (enumOf2Enum dat) dat + + -- runQ (return $ concat $ map f dat) >>= putStrLn.pprint + -- {-# LANGUAGE DuplicateRecordFields #-} + ((mconcat <$>) $ mapM runQ $ map f dat') >>= putStrLn.pprint + + diff --git a/LysKom.hs b/LysKom.hs index 26b39b7e72cc8003dea774a89f15d6e9febf8900..f61a6fc1aa7d060d50b4e4bf5ab78565ce870b17 100644 --- a/LysKom.hs +++ b/LysKom.hs @@ -16,7 +16,7 @@ import Control.Concurrent.Async import Control.Monad.IO.Class import Control.Monad.State.Strict -import LineFormat +import LysKom.LineFormat import Data.Attoparsec.ByteString import Data.Attoparsec.ByteString.Char8 hiding (char8) diff --git a/Test2.hs b/LysKom/Internal/CodeGen.hs similarity index 98% rename from Test2.hs rename to LysKom/Internal/CodeGen.hs index 154dba2a843c3087d003aab5a495b9419bc9e093..d9c5877df6cef6d4d667f953c0c381fda782ac0e 100644 --- a/Test2.hs +++ b/LysKom/Internal/CodeGen.hs @@ -1,12 +1,12 @@ {-# LANGUAGE TemplateHaskell #-} -module Test2 where +module LysKom.Internal.CodeGen where import Language.Haskell.TH import Language.Haskell.TH.Syntax -import Text.Parsers.ProtocolA (documentParser) -import Text.Parsers.ProtocolA.Data (ProtocolAItem (..)) -import Text.Parsers.ProtocolA.Types +import LysKom.ProtocolA (documentParser) +import LysKom.ProtocolA.Data (ProtocolAItem (..)) +import LysKom.ProtocolA.Types import Text.ParserCombinators.Parsec (parseFromFile) import Data.Either (rights) @@ -15,7 +15,7 @@ import Data.Maybe (maybe) import Control.Concurrent.Async (Async) -import LineFormat +import LysKom.LineFormat import Data.Int -- typename "sparse-block" ⇒ "SparseBlock" diff --git a/LineFormat.lhs b/LysKom/LineFormat.lhs similarity index 98% rename from LineFormat.lhs rename to LysKom/LineFormat.lhs index de6fda67b5578793de8f197c20cce628dcd09181..9975e4ce7b437c0f30266a8b650e0e099402a9d5 100644 --- a/LineFormat.lhs +++ b/LysKom/LineFormat.lhs @@ -7,7 +7,7 @@ -- Direct string s for \emph{both} ByteString.Builder and Attoparsec {-# LANGUAGE OverloadedStrings #-} -module LineFormat where +module LysKom.LineFormat where import Data.ByteString.Builder import qualified Data.ByteString.Lazy as BS diff --git a/Text/Parsers/ProtocolA.lhs b/LysKom/ProtocolA.lhs similarity index 93% rename from Text/Parsers/ProtocolA.lhs rename to LysKom/ProtocolA.lhs index 2fb3cdc820e9edd7a2f4f10f0c7436d9e5dd5fec..203c72916e9220e2c1448135d3de448ea9163e9e 100644 --- a/Text/Parsers/ProtocolA.lhs +++ b/LysKom/ProtocolA.lhs @@ -1,15 +1,15 @@ \begin{code} -module Text.Parsers.ProtocolA where +module LysKom.ProtocolA where \end{code} \begin{comment} \begin{code} import Text.ParserCombinators.Parsec -import Text.Parsers.Helpers -import Text.Parsers.ProtocolA.Types -import Text.Parsers.ProtocolA.Data (ProtocolAItem(..)) -import Text.Parsers.ProtocolA.Requests +import LysKom.ProtocolA.Helpers +import LysKom.ProtocolA.Types +import LysKom.ProtocolA.Data (ProtocolAItem(..)) +import LysKom.ProtocolA.Requests \end{code} \end{comment} diff --git a/Text/Parsers/ProtocolA/Data.lhs b/LysKom/ProtocolA/Data.lhs similarity index 91% rename from Text/Parsers/ProtocolA/Data.lhs rename to LysKom/ProtocolA/Data.lhs index 7715eeb7d8226a0bd7a95edfc996e3f2360cf981..dfe8976074b840a4475b41ca94b1d603c9c66e3d 100644 --- a/Text/Parsers/ProtocolA/Data.lhs +++ b/LysKom/ProtocolA/Data.lhs @@ -1,10 +1,10 @@ \begin{code} -module Text.Parsers.ProtocolA.Data where +module LysKom.ProtocolA.Data where \end{code} \begin{comment} \begin{code} -import Text.Parsers.ProtocolA.Types (LysType(..)) +import LysKom.ProtocolA.Types (LysType(..)) \end{code} \end{comment} diff --git a/Text/Parsers/Helpers.lhs b/LysKom/ProtocolA/Helpers.lhs similarity index 97% rename from Text/Parsers/Helpers.lhs rename to LysKom/ProtocolA/Helpers.lhs index 3d32ce8fb811889c2f756083a9f76bc665fff9a8..820ff72522f1a57855425f97d01be017c5e092f2 100644 --- a/Text/Parsers/Helpers.lhs +++ b/LysKom/ProtocolA/Helpers.lhs @@ -1,6 +1,6 @@ \begin{comment} \begin{code} -module Text.Parsers.Helpers where +module LysKom.ProtocolA.Helpers where import Text.ParserCombinators.Parsec \end{code} diff --git a/Text/Parsers/ProtocolA/Requests.lhs b/LysKom/ProtocolA/Requests.lhs similarity index 89% rename from Text/Parsers/ProtocolA/Requests.lhs rename to LysKom/ProtocolA/Requests.lhs index 06a7fcebe29221e8a0cc65c9720a3051baa82b08..c11b37c7ee2257561f33434c369422267842f560 100644 --- a/Text/Parsers/ProtocolA/Requests.lhs +++ b/LysKom/ProtocolA/Requests.lhs @@ -2,15 +2,15 @@ \label{item:rpc} \begin{code} -module Text.Parsers.ProtocolA.Requests where +module LysKom.ProtocolA.Requests where \end{code} \begin{comment} \begin{code} import Text.ParserCombinators.Parsec -import Text.Parsers.Helpers -import Text.Parsers.ProtocolA.Types -import Text.Parsers.ProtocolA.Data (ProtocolAItem(Async,Request)) +import LysKom.ProtocolA.Helpers +import LysKom.ProtocolA.Types +import LysKom.ProtocolA.Data (ProtocolAItem(Async,Request)) \end{code} \end{comment} diff --git a/Text/Parsers/ProtocolA/Types.lhs b/LysKom/ProtocolA/Types.lhs similarity index 98% rename from Text/Parsers/ProtocolA/Types.lhs rename to LysKom/ProtocolA/Types.lhs index fb3872314004f91a16b21303f40b24121add4079..810226053f4fcadcdcbe6b9ec9867ac39cf252f7 100644 --- a/Text/Parsers/ProtocolA/Types.lhs +++ b/LysKom/ProtocolA/Types.lhs @@ -1,13 +1,13 @@ \section{Types} \begin{code} -module Text.Parsers.ProtocolA.Types where +module LysKom.ProtocolA.Types where \end{code} \begin{comment} \begin{code} import Text.ParserCombinators.Parsec -import Text.Parsers.Helpers +import LysKom.ProtocolA.Helpers import Data.Functor ((<&>), ($>)) \end{code} \end{comment} diff --git a/LysKom/Types.hs b/LysKom/Types.hs new file mode 100644 index 0000000000000000000000000000000000000000..f525a30d471af07ab6d30f8ca6abbe4ed47423b5 --- /dev/null +++ b/LysKom/Types.hs @@ -0,0 +1,31 @@ +{-# LANGUAGE DuplicateRecordFields #-} +{-# LANGUAGE TemplateHaskell #-} + +module Output where + +import LineFormat +import LysKom + +import GHC.Base +import GHC.Int (Int8, Int16, Int32) +import GHC.Show +import GHC.Types (Bool, Float) +import Data.List (intersperse) +import Data.ByteString.Builder (char7, intDec) +import Data.ByteString.Char8 (pack) +import Data.Functor ((<$>)) +import Data.Either + +import Data.Attoparsec.ByteString (choice) +import Data.Attoparsec.ByteString.Char8 (char, string) + +-------------------------------------------------- + +import Test2 (f) +import Language.Haskell.TH (runQ, runIO) +import Text.Parsers.ProtocolA (documentParser) +import Text.ParserCombinators.Parsec (parseFromFile) + +$(do d <- runIO $ parseFromFile documentParser "/usr/share/doc/lyskom/protocol-a-full.txt" + let dat = head $ rights [d] + (mconcat <$>) $ Prelude.mapM runQ $ map f dat) diff --git a/doc/main.tex b/doc/main.tex index 173bd887cb0db6cda4868d837eb297c35e3d1112..539150c6bb809283e4995e1d7896b74d79ae1b0e 100644 --- a/doc/main.tex +++ b/doc/main.tex @@ -61,10 +61,10 @@ variant of ASN.1 (Abstract Syntax Notation One) which was used is slightly non-s See appendix~\ref{app:ast} for sample output for all parsers defined in this chapter. -\input{lhs/Text/Parsers/ProtocolA/Data.lhs} -\input{lhs/Text/Parsers/ProtocolA.lhs} -\input{lhs/Text/Parsers/ProtocolA/Types.lhs} -\input{lhs/Text/Parsers/ProtocolA/Requests.lhs} +\input{lhs/LysKom/ProtocolA/Data.lhs} +\input{lhs/LysKom/ProtocolA.lhs} +\input{lhs/LysKom/ProtocolA/Types.lhs} +\input{lhs/LysKom/ProtocolA/Requests.lhs} \chapter {From AST to Haskell} \label{cha:asthaskell} @@ -95,7 +95,7 @@ Haskell code from it. Now we start actually looking towards actual data! We need some extra functions for making everything else go together. This includes extra parsers, a main method, and code for other things. -\input{lhs/Text/Parsers/Helpers.lhs} +\input{lhs/LysKom/ProtocolA/Helpers.lhs} \chapter {AST examples} \label{app:ast}