diff options
author | Camil Staps | 2018-07-05 13:27:14 +0200 |
---|---|---|
committer | Camil Staps | 2018-07-05 13:29:28 +0200 |
commit | fe72c41c75c3e4abd62b29b3e86b3d72590faf94 (patch) | |
tree | 7bcd66414df45b1ba31542153f4f7f7a25f42c3e /Assignment2/src/DTMC.icl | |
parent | Bootstrap report (diff) |
Add DTMC parser
Diffstat (limited to 'Assignment2/src/DTMC.icl')
-rw-r--r-- | Assignment2/src/DTMC.icl | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/Assignment2/src/DTMC.icl b/Assignment2/src/DTMC.icl new file mode 100644 index 0000000..7c712e0 --- /dev/null +++ b/Assignment2/src/DTMC.icl @@ -0,0 +1,51 @@ +implementation module DTMC + +import StdArray +import StdClass +import StdFile +import StdInt +import StdList +import StdString + +import Data.Error +from Data.Func import $ +import System.File +import System.FilePath +import Text + +parseDTMC :: !FilePath !*World -> *(!DTMC, !*World) +parseDTMC fp w +# (lines,w) = readFileLines fp w += (parseDTMCFromLines [s % (0,size s-2) \\ s <- fromOk lines], w) + +parseDTMCFromLines :: ![String] -> DTMC +parseDTMCFromLines lines +# [nr_states:_:lines] = tl $ dropWhile ((<>) "@nr_states") lines +# states = map parseState $ groupLines "\t" [] lines += + { nr_states = toInt nr_states + , states = {s \\ s <- states} + } +where + parseState :: ![String] -> State + parseState [head:actions] = + { actions = map parseAction $ groupLines "\t\t" [] actions + , init = endsWith "init" head + } + where + parseAction :: ![String] -> Action + parseAction [head:transitions] = + { action_id = toInt (head % (8, size head-1)) + , transitions = map parseTransition transitions + } + where + parseTransition :: !String -> Transition + parseTransition s = case split " : " (trim s) of + [id:prob:_] -> {to_state=toInt id, probability=prob} + + groupLines :: !String ![String] ![String] -> [[String]] + groupLines head current [] = [reverse current] + groupLines head current [line:lines] + | startsWith head line = groupLines head [line:current] lines + | isEmpty current = groupLines head [line] lines + | otherwise = [reverse current:groupLines head [line] lines] |