diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Grasp/Interpreter.hs | 45 | 
1 files changed, 25 insertions, 20 deletions
| diff --git a/src/Grasp/Interpreter.hs b/src/Grasp/Interpreter.hs index ca28578..82304c1 100644 --- a/src/Grasp/Interpreter.hs +++ b/src/Grasp/Interpreter.hs @@ -49,26 +49,31 @@ interpret = do      n <- GMonad.peekIP      if (Maybe.isNothing n) then return () else do -        case (IN.toString . GN.toInst . Maybe.fromJust $ n) of -            "set" -> setI -            "new" -> newI -            "del" -> delI -            "push" -> pushI -            "pop" -> popI -            "pick" -> pickI -            "call" -> callI -            "ret" -> retI -            "add" -> addI -            "mul" -> mulI -            "sub" -> subI -            "div" -> divI -            "mod" -> modI -            "getc" -> getcI -            "putc" -> putcI -            "gets" -> getsI -            "puts" -> putsI -            inst | Maybe.isJust . IN.toInt . IN.mk $ inst -> implicitPushI -            x -> error ("Unknown instruction " ++ x) +        condNodes <- GMonad.nodesOut (EL.mk "cond") (Maybe.fromJust n) +        let condValues = map (IN.toFloat . GN.toInst) condNodes + +        if (all (\x -> (Maybe.isJust x) && ((/=0) . Maybe.fromJust $ x)) condValues) +            then case (IN.toString . GN.toInst . Maybe.fromJust $ n) of +                    "set" -> setI +                    "new" -> newI +                    "del" -> delI +                    "push" -> pushI +                    "pop" -> popI +                    "pick" -> pickI +                    "call" -> callI +                    "ret" -> retI +                    "add" -> addI +                    "mul" -> mulI +                    "sub" -> subI +                    "div" -> divI +                    "mod" -> modI +                    "getc" -> getcI +                    "putc" -> putcI +                    "gets" -> getsI +                    "puts" -> putsI +                    inst | Maybe.isJust . IN.toInt . IN.mk $ inst -> implicitPushI +                    x -> error ("Unknown instruction " ++ x) +            else GMonad.updateIP          GMonad.nextIP          interpret | 
