codesnippets:datastructuresfromsymboltrees
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| codesnippets:datastructuresfromsymboltrees [2021/04/09 14:56] – f2b216 | codesnippets:datastructuresfromsymboltrees [2025/10/08 00:48] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 7: | Line 7: | ||
| * container Construction as monadic class and instances | * container Construction as monadic class and instances | ||
| * error handling | * error handling | ||
| - | * newtypes | + | * types for standard Construction instances |
| - | * String' | + | * '' |
| * in order to have standard build of constructions | * in order to have standard build of constructions | ||
| * easy combination methods for childs of symbol trees | * easy combination methods for childs of symbol trees | ||
| - | | + | |
| - | * code:< | + | * for faster execution, |
| + | * '' | ||
| + | * for compatibility to non commutative operations like subtraction and devision, using '' | ||
| + | * using GHC Extension '' | ||
| + | * using GHC option '' | ||
| + | * code, module Main:<code Haskell> | ||
| {-# LANGUAGE FlexibleInstances #-} | {-# LANGUAGE FlexibleInstances #-} | ||
| + | {-# OPTIONS_GHC -fno-warn-orphans #-} | ||
| - | import qualified | + | module Main where |
| - | import qualified | + | |
| + | import qualified | ||
| + | import Builder | ||
| + | import qualified | ||
| main :: IO () | main :: IO () | ||
| main = | main = | ||
| do | do | ||
| - | print (buildValidM symTheTree :: (Construction | + | print (buildValidM symTheTree :: (Construction |
| + | print (buildValidM symTheTree :: (Construction ConstDef)) | ||
| symTheTree :: SymbolTree | symTheTree :: SymbolTree | ||
| symTheTree = | symTheTree = | ||
| - | Node Div [ -- shall create an Integer | + | Node Sym.ConstDef [ -- shall create a ConstDef |
| - | Node Mul [ -- shall create an Integer | + | Node Sym.ConstName [ -- shall create a String |
| - | Node Add [ -- shall create an Integer | + | Node (Sym.Terminal ' |
| - | Node Number [ -- shall create an Integer (and/or String) | + | Node (Sym.Terminal ' |
| - | Node (Terminal ' | + | Node (Sym.Terminal ' |
| - | Node (Terminal ' | + | Node (Sym.Terminal ' |
| - | Node (Terminal ' | + | Node (Sym.Terminal ' |
| - | Node (Terminal ' | + | Node (Sym.Terminal ' |
| - | Node Number [ -- shall create an Integer (and/or String) | + | Node (Sym.Terminal ' |
| - | Node (Terminal ' | + | Node (Sym.Terminal ' |
| - | Node (Terminal ' | + | ], |
| - | Node (Terminal ' | + | Node Sym.ConstExpression [ -- shall create an Integer |
| - | Node Sub [ -- shall create an Integer | + | Node Sym.Div [ -- shall create an Integer |
| - | Node Number [ -- shall create an Integer (and/or String) | + | Node Sym.Mul [ -- shall create an Integer |
| - | Node (Terminal ' | + | Node Sym.Add [ -- shall create an Integer |
| - | Node (Terminal ' | + | Node Sym.Number [ -- shall create an Integer (and/or String) |
| - | Node (Terminal ' | + | Node Sym.DecDigit [Node (Sym.Terminal ' |
| - | Node Number [ -- shall create an Integer (and/or String) | + | Node Sym.DecDigit [Node (Sym.Terminal ' |
| - | Node (Terminal ' | + | Node Sym.DecDigit [Node (Sym.Terminal ' |
| - | Node (Terminal ' | + | Node Sym.DecDigit [Node (Sym.Terminal ' |
| - | Node Number [ -- shall create an Integer (and/or String) | + | Node Sym.Number [ -- shall create an Integer (and/or String) |
| - | Node (Terminal ' | + | Node Sym.DecDigit [Node (Sym.Terminal ' |
| + | Node Sym.DecDigit [Node (Sym.Terminal ' | ||
| + | Node Sym.DecDigit [Node (Sym.Terminal ' | ||
| + | Node Sym.Sub [ -- shall create an Integer | ||
| + | Node Sym.Number [ -- shall create an Integer (and/or String) | ||
| + | Node Sym.DecDigit [Node (Sym.Terminal ' | ||
| + | Node Sym.DecDigit [Node (Sym.Terminal ' | ||
| + | Node Sym.DecDigit [Node (Sym.Terminal ' | ||
| + | Node Sym.Number [ -- shall create an Integer (and/or String) | ||
| + | Node Sym.DecDigit [Node (Sym.Terminal ' | ||
| + | Node Sym.DecDigit [Node (Sym.Terminal ' | ||
| + | Node Sym.Number [ -- shall create an Integer (and/or String) | ||
| + | Node Sym.DecDigit [Node (Sym.Terminal ' | ||
| - | data SymbolTree | + | data ConstDef |
| deriving Show | deriving Show | ||
| - | data Symbol = Add | Sub | Mul | Div | Number | Terminal Char | + | instance Builder ConstDef where |
| + | buildValidDflt = ConstDef "" | ||
| + | buildValidM (Node Sym.ConstDef (trSymConstName: | ||
| + | do | ||
| + | sConstName <- buildValidM trSymConstName | ||
| + | nConstValue <- buildValidM trSymConstExpression | ||
| + | return (ConstDef sConstName nConstValue) | ||
| + | buildValidM (Node Sym.ConstDef _) = Error (ErrSymTree " | ||
| + | buildValidM _ = Error (ErrSymTree " | ||
| + | |||
| + | instance Builder Integer where | ||
| + | buildValidDflt = 0 | ||
| + | buildValidM (Node Sym.ConstExpression (trSym:[])) = cnstInt " | ||
| + | buildValidM (Node Sym.ConstExpression _) = Error (ErrSymTree " | ||
| + | buildValidM (Node Sym.Number ltrSym) = cnstInt " | ||
| + | buildValidM (Node Sym.Add ltrSym) = cnstInt " | ||
| + | buildValidM (Node Sym.Sub ltrSym) = cnstInt " | ||
| + | buildValidM (Node Sym.Mul ltrSym) = cnstInt " | ||
| + | buildValidM (Node Sym.Div ltrSym) = cnstInt " | ||
| + | buildValidM _ = Error (ErrSymTree " | ||
| + | |||
| + | cnstInt :: String -> (Construction Integer) -> (Construction Integer) | ||
| + | cnstInt sCase g = constraint (\n -> (n >= 0) && (n <= 4294967295)) sCase " | ||
| + | |||
| + | instance Builder String where | ||
| + | buildValidDflt = "" | ||
| + | buildValidM (Node Sym.ConstName ltrSym) = cnstConstName $ cmbnNCmt (\(Simply chA) sB -> chA : sB) [] ltrSym | ||
| + | buildValidM _ = Error (ErrSymTree " | ||
| + | |||
| + | cnstConstName :: (Construction String) -> (Construction String) | ||
| + | cnstConstName g = constraint (\s -> (length s) >= 0) " | ||
| + | |||
| + | instance Builder Char where | ||
| + | buildValidDflt = ' ' | ||
| + | buildValidM (Node Sym.DecDigit (trSym:[])) = constraint (\ch -> (ch >= ' | ||
| + | buildValidM (Node Sym.DecDigit _) = Error (ErrSymTree " | ||
| + | buildValidM _ = Error (ErrSymTree " | ||
| + | </ | ||
| + | * code, module Builder:< | ||
| + | {-| | ||
| + | Description : to create data structures from symbol trees. | ||
| + | Copyright | ||
| + | License | ||
| + | Maintainer | ||
| + | Stability | ||
| + | Portability : POSIX | ||
| + | |||
| + | * supports creation of any data structures from symbol trees which type is defined in here: | ||
| + | |||
| + | * example | ||
| + | |||
| + | @ | ||
| + | instance Builder Integer where | ||
| + | buildValidDflt = 0 | ||
| + | buildValidM symTree@(Node Number _) = (Contains (read (buildValid symTree))) | ||
| + | buildValidM (Node Add ltrSym) = cnstInt " | ||
| + | buildValidM (Node Sub ltrSym) = cnstInt " | ||
| + | buildValidM (Node Mul ltrSym) = cnstInt " | ||
| + | buildValidM (Node Div ltrSym) = cnstInt " | ||
| + | buildValidM _ = Error (ErrSymTree " | ||
| + | |||
| + | cnstInt :: String -> (Construction Integer) -> (Construction Integer) | ||
| + | cnstInt sCase g = constraint (<= 4294967295) sCase " | ||
| + | |||
| + | instance Builder String where | ||
| + | buildValidDflt = "" | ||
| + | buildValidM (Node Number ltrSym) = Contains [ch | (Contains ch) <- (map buildValidM ltrSym) ] | ||
| + | buildValidM _ = Error (ErrSymTree " | ||
| + | |||
| + | instance Builder Char where | ||
| + | buildValidDflt = ' ' | ||
| + | buildValidM (Node (Terminal ch) _) = Contains ch | ||
| + | buildValidM _ = Error (ErrSymTree " | ||
| + | @ | ||
| + | -} | ||
| + | |||
| + | {-# LANGUAGE FlexibleInstances #-} | ||
| + | |||
| + | module Builder ( | ||
| + | -- * Classes | ||
| + | Builder(..), | ||
| + | -- * Types | ||
| + | SymbolTree(..), | ||
| + | Symbol(..), | ||
| + | Construction(..), | ||
| + | ErrorKind(..), | ||
| + | SimpleContainer(..), | ||
| + | String', | ||
| + | Char', | ||
| + | -- * Functions | ||
| + | cmbnNCmt, | ||
| + | cmbnFast, | ||
| + | buildValidMChar' | ||
| + | ) where | ||
| + | |||
| + | import qualified Control.Monad as M (liftM, ap) | ||
| + | import qualified Data.Foldable as Fld (foldlM, foldrM) | ||
| + | |||
| + | -------------------------------------------------------------------------------- | ||
| + | -- Basic types | ||
| + | |||
| + | data Symbol = ConstDef | ConstName | ConstExpression | Add | Sub | Mul | Div | Number | ||
| deriving Show | deriving Show | ||
| - | data Construction model = Contains model | Error ErrorKind | + | data SymbolTree |
| deriving Show | deriving Show | ||
| Line 62: | Line 185: | ||
| deriving Show | deriving Show | ||
| - | newtype String' | + | -------------------------------------------------------------------------------- |
| + | -- Monadic type | ||
| + | |||
| + | data Construction model = Contains model | Error ErrorKind | ||
| deriving Show | deriving Show | ||
| Line 77: | Line 203: | ||
| return | return | ||
| - | class Generator | + | -------------------------------------------------------------------------------- |
| + | -- Type class ' | ||
| + | |||
| + | class Builder | ||
| buildValidM :: SymbolTree -> (Construction g) | buildValidM :: SymbolTree -> (Construction g) | ||
| buildValidDflt :: g | buildValidDflt :: g | ||
| Line 91: | Line 220: | ||
| | otherwise = Error (Constraint sCase sConstraint) | | otherwise = Error (Constraint sCase sConstraint) | ||
| - | fOpFromSymTree :: (Generator g) => (g -> g -> g) -> (SymbolTree | + | -------------------------------------------------------------------------------- |
| - | fOpFromSymTree fOp trSymA nB = | + | -- ' |
| - | do | + | |
| - | nA <- buildValidM trSymA | + | |
| - | | + | |
| - | fOpFlippedFromSymTree | + | newtype SimpleContainer a = Simply { rSimply |
| - | fOpFlippedFromSymTree fOp nA trSymB = | + | |
| - | | + | |
| - | nB <- buildValidM trSymB | + | |
| - | return (fOp nA nB); | + | |
| - | cmbnNCmt | + | fromSimple |
| - | cmbnNCmt fOp identity ltrSym | + | fromSimple (Contains (Simply x)) = Contains x |
| + | fromSimple | ||
| - | cmbnFast :: (Generator g) => (g -> g -> g) -> g -> [SymbolTree] -> Construction g | + | type String' |
| - | cmbnFast fOp identity ltrSym = Fld.foldlM (fOpFlippedFromSymTree fOp) identity ltrSym | + | |
| - | instance | + | instance |
| - | buildValidDflt = (String' | + | buildValidDflt = (Simply |
| - | buildValidM (Node (Terminal ch) _) = Contains (String' | + | buildValidM (Node (Terminal ch) _) = Contains (Simply |
| - | buildValidM (Node _ ltrSym) = (cmbnFast | + | buildValidM (Node _ ltrSym) = (cmbnNCmt |
| - | s' | + | liftSimply |
| - | s' | + | liftSimply f (Simply xA) (Simply xB) = Simply |
| - | instance Generator Integer where | + | type Char' |
| - | buildValidDflt | + | |
| - | buildValidM symTree@(Node Number _) = (Contains (read (buildValid symTree))) | + | |
| - | buildValidM (Node Add ltrSym) = cnstInt " | + | |
| - | buildValidM (Node Sub ltrSym) = cnstInt " | + | |
| - | buildValidM (Node Mul ltrSym) = cnstInt " | + | |
| - | buildValidM (Node Div ltrSym) = cnstInt " | + | |
| - | buildValidM _ = Error (ErrSymTree " | + | |
| - | cnstInt :: String -> (Construction Integer) -> (Construction Integer) | + | instance Builder |
| - | cnstInt sCase g = constraint | + | buildValidDflt = (Simply ' ') |
| + | | ||
| + | buildValidM _ = Error (ErrSymTree | ||
| - | instance Generator String where | + | buildValidMChar' |
| - | buildValidDflt = "" | + | buildValidMChar' |
| - | buildValidM (Node Number ltrSym) = Contains [ch | (Contains ch) <- (map buildValidM ltrSym) ] | + | |
| - | | + | |
| - | buildValidM _ = Error (ErrSymTree " | + | |
| - | instance Generator Char where | + | -------------------------------------------------------------------------------- |
| - | | + | -- Helper functions for type class 'Builder' |
| - | buildValidM (Node (Terminal ch) _) = Contains ch | + | |
| - | buildValidM | + | fLOpFromSymTree :: (Builder g, Builder a) => (g -> a -> g) -> g -> SymbolTree -> Construction g |
| + | fLOpFromSymTree fOp nA trSymB = | ||
| + | | ||
| + | chB <- buildValidM | ||
| + | return | ||
| + | |||
| + | fROpFromSymTree :: (Builder g, Builder a) => (a -> g -> g) -> SymbolTree -> g -> Construction g | ||
| + | fROpFromSymTree fOp trSymA nB = | ||
| + | | ||
| + | chA <- buildValidM | ||
| + | return (fOp chA nB) | ||
| + | |||
| + | cmbnNCmt :: (Builder g, Builder a) => (a -> g -> g) -> g -> [SymbolTree] -> Construction g | ||
| + | cmbnNCmt fOp identity ltrSym = Fld.foldrM (fROpFromSymTree fOp) identity ltrSym | ||
| + | |||
| + | cmbnFast :: (Builder g, Builder a) => (g -> a -> g) -> g -> [SymbolTree] -> Construction g | ||
| + | cmbnFast fOp identity ltrSym = Fld.foldlM (fLOpFromSymTree fOp) identity ltrSym | ||
| </ | </ | ||
| + | * compiles, error and warning free, with compiler: GHC 8.10.4, using -Wall | ||
| + | * executes, with output:< | ||
| + | Contains (Simply {rSimply = " | ||
| + | Contains (ConstDef {rsConstName = " | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== ✎ ===== | ||
| + | ~~DISCUSSION~~ | ||
codesnippets/datastructuresfromsymboltrees.1617972966.txt.gz · Last modified: (external edit)
