From 24392dba022f0c102b3661632a86ee7e5ef59b37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= <hugo@lysator.liu.se> Date: Mon, 22 Feb 2021 23:31:13 +0100 Subject: [PATCH] Restructure directory layout. --- CodeGenTest.hs | 53 +++++++++++++++++++ LysKom.hs | 2 +- Test2.hs => LysKom/Internal/CodeGen.hs | 10 ++-- LineFormat.lhs => LysKom/LineFormat.lhs | 2 +- {Text/Parsers => LysKom}/ProtocolA.lhs | 10 ++-- {Text/Parsers => LysKom}/ProtocolA/Data.lhs | 4 +- .../Parsers => LysKom/ProtocolA}/Helpers.lhs | 2 +- .../Parsers => LysKom}/ProtocolA/Requests.lhs | 8 +-- {Text/Parsers => LysKom}/ProtocolA/Types.lhs | 4 +- LysKom/Types.hs | 31 +++++++++++ doc/main.tex | 10 ++-- 11 files changed, 110 insertions(+), 26 deletions(-) create mode 100644 CodeGenTest.hs rename Test2.hs => LysKom/Internal/CodeGen.hs (98%) rename LineFormat.lhs => LysKom/LineFormat.lhs (98%) rename {Text/Parsers => LysKom}/ProtocolA.lhs (93%) rename {Text/Parsers => LysKom}/ProtocolA/Data.lhs (91%) rename {Text/Parsers => LysKom/ProtocolA}/Helpers.lhs (97%) rename {Text/Parsers => LysKom}/ProtocolA/Requests.lhs (89%) rename {Text/Parsers => LysKom}/ProtocolA/Types.lhs (98%) create mode 100644 LysKom/Types.hs diff --git a/CodeGenTest.hs b/CodeGenTest.hs new file mode 100644 index 0000000..3eb9dad --- /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 26b39b7..f61a6fc 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 154dba2..d9c5877 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 de6fda6..9975e4c 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 2fb3cdc..203c729 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 7715eeb..dfe8976 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 3d32ce8..820ff72 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 06a7fce..c11b37c 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 fb38723..8102260 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 0000000..f525a30 --- /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 173bd88..539150c 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} -- GitLab