From fe72c41c75c3e4abd62b29b3e86b3d72590faf94 Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Thu, 5 Jul 2018 13:27:14 +0200 Subject: Add DTMC parser --- Assignment2/src/DTMC.icl | 51 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 Assignment2/src/DTMC.icl (limited to 'Assignment2/src/DTMC.icl') 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] -- cgit v1.2.3