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/12 19:08] – f2b216 | codesnippets:datastructuresfromsymboltrees [2025/10/08 00:48] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 23: | Line 23: | ||
| module Main where | module Main where | ||
| - | import Builder (Builder(..), | + | import qualified Data.Char as Ch |
| + | import Builder (Builder(..), | ||
| + | import qualified Builder as Sym (Symbol(..)) | ||
| main :: IO () | main :: IO () | ||
| Line 29: | Line 31: | ||
| do | do | ||
| print (buildValidM symTheTree :: (Construction String' | print (buildValidM symTheTree :: (Construction String' | ||
| + | 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 ConstDef = ConstDef { rsConstName :: String, rnConstValue :: Integer } | ||
| + | deriving Show | ||
| + | |||
| + | 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 | instance Builder Integer where | ||
| buildValidDflt = 0 | buildValidDflt = 0 | ||
| - | buildValidM | + | buildValidM (Node Sym.ConstExpression (trSym:[])) = cnstInt " |
| - | buildValidM (Node Add ltrSym) = cnstInt " | + | buildValidM (Node Sym.ConstExpression |
| - | buildValidM (Node Sub ltrSym) = cnstInt " | + | buildValidM |
| - | buildValidM (Node Mul ltrSym) = cnstInt " | + | buildValidM (Node Sym.Add ltrSym) = cnstInt " |
| - | buildValidM (Node Div ltrSym) = cnstInt " | + | buildValidM (Node Sym.Sub ltrSym) = cnstInt " |
| + | buildValidM (Node Sym.Mul ltrSym) = cnstInt " | ||
| + | buildValidM (Node Sym.Div ltrSym) = cnstInt " | ||
| buildValidM _ = Error (ErrSymTree " | buildValidM _ = Error (ErrSymTree " | ||
| cnstInt :: String -> (Construction Integer) -> (Construction Integer) | cnstInt :: String -> (Construction Integer) -> (Construction Integer) | ||
| - | cnstInt sCase g = constraint (<= 4294967295) sCase "smaller than 2^32-1" | + | cnstInt sCase g = constraint (\n -> (n >= 0) && (n <= 4294967295)) sCase "between 0 and 2^32-1" |
| instance Builder String where | instance Builder String where | ||
| buildValidDflt = "" | buildValidDflt = "" | ||
| - | buildValidM (Node Number | + | buildValidM (Node Sym.ConstName |
| buildValidM _ = Error (ErrSymTree " | buildValidM _ = Error (ErrSymTree " | ||
| + | |||
| + | cnstConstName :: (Construction String) -> (Construction String) | ||
| + | cnstConstName g = constraint (\s -> (length s) >= 0) " | ||
| instance Builder Char where | instance Builder Char where | ||
| buildValidDflt = ' ' | buildValidDflt = ' ' | ||
| - | buildValidM (Node (Terminal | + | buildValidM (Node Sym.DecDigit |
| + | buildValidM (Node Sym.DecDigit | ||
| buildValidM _ = Error (ErrSymTree " | buildValidM _ = Error (ErrSymTree " | ||
| </ | </ | ||
| Line 125: | Line 159: | ||
| Construction(..), | Construction(..), | ||
| ErrorKind(..), | ErrorKind(..), | ||
| + | SimpleContainer(..), | ||
| String', | String', | ||
| + | Char', | ||
| -- * Functions | -- * Functions | ||
| - | fOpFromSymTree, | ||
| - | fOpFlippedFromSymTree, | ||
| cmbnNCmt, | cmbnNCmt, | ||
| - | cmbnFast | + | cmbnFast, |
| + | buildValidMChar' | ||
| ) where | ) where | ||
| Line 139: | Line 174: | ||
| -- Basic types | -- Basic types | ||
| - | data Symbol = Add | Sub | Mul | Div | Number | Terminal Char | + | data Symbol = ConstDef | ConstName | ConstExpression | Add | Sub | Mul | Div | Number |
| deriving Show | deriving Show | ||
| Line 186: | Line 221: | ||
| -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
| - | -- ' | + | -- ' |
| - | type String' | + | newtype SimpleContainer a = Simply |
| - | + | ||
| - | newtype SimpleContainer a = Simply a | + | |
| deriving Show | deriving Show | ||
| + | |||
| + | fromSimple :: (Construction (SimpleContainer a)) -> (Construction a) | ||
| + | fromSimple (Contains (Simply x)) = Contains x | ||
| + | fromSimple (Error x) = Error x | ||
| + | |||
| + | type String' | ||
| instance Builder (SimpleContainer String) where | instance Builder (SimpleContainer String) where | ||
| buildValidDflt = (Simply "" | buildValidDflt = (Simply "" | ||
| buildValidM (Node (Terminal ch) _) = Contains (Simply [ch]) | buildValidM (Node (Terminal ch) _) = Contains (Simply [ch]) | ||
| - | buildValidM (Node _ ltrSym) = (cmbnFast | + | buildValidM (Node _ ltrSym) = (cmbnNCmt |
| liftSimply :: (a -> a -> a) -> (SimpleContainer a) -> (SimpleContainer a) -> (SimpleContainer a) | liftSimply :: (a -> a -> a) -> (SimpleContainer a) -> (SimpleContainer a) -> (SimpleContainer a) | ||
| liftSimply f (Simply xA) (Simply xB) = Simply (f xA xB) | liftSimply f (Simply xA) (Simply xB) = Simply (f xA xB) | ||
| + | |||
| + | type Char' = SimpleContainer Char | ||
| + | |||
| + | instance Builder (SimpleContainer Char) where | ||
| + | buildValidDflt = (Simply ' ') | ||
| + | buildValidM (Node (Terminal ch) _) = Contains (Simply ch) | ||
| + | buildValidM _ = Error (ErrSymTree " | ||
| + | |||
| + | buildValidMChar' | ||
| + | buildValidMChar' | ||
| -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
| -- Helper functions for type class ' | -- Helper functions for type class ' | ||
| - | fOpFromSymTree | + | fLOpFromSymTree |
| - | fOpFromSymTree | + | fLOpFromSymTree |
| do | do | ||
| - | | + | |
| - | return (fOp nA nB); | + | return (fOp nA chB) |
| - | fOpFlippedFromSymTree | + | fROpFromSymTree |
| - | fOpFlippedFromSymTree | + | fROpFromSymTree |
| do | do | ||
| - | | + | |
| - | return (fOp nB nA); | + | return (fOp chA nB) |
| - | cmbnNCmt :: (Builder g) => (g -> g -> g) -> g -> [SymbolTree] -> Construction g | + | cmbnNCmt :: (Builder g, Builder a) => (a -> g -> g) -> g -> [SymbolTree] -> Construction g |
| - | cmbnNCmt fOp identity ltrSym = Fld.foldrM (fOpFromSymTree | + | cmbnNCmt fOp identity ltrSym = Fld.foldrM (fROpFromSymTree |
| - | cmbnFast :: (Builder g) => (g -> g -> g) -> g -> [SymbolTree] -> Construction g | + | cmbnFast :: (Builder g, Builder a) => (g -> a -> g) -> g -> [SymbolTree] -> Construction g |
| - | cmbnFast fOp identity ltrSym = Fld.foldlM (fOpFlippedFromSymTree | + | cmbnFast fOp identity ltrSym = Fld.foldlM (fLOpFromSymTree |
| </ | </ | ||
| + | * 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.1618247315.txt.gz · Last modified: (external edit)
