diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Grasp/Interpreter.hs | 40 | 
1 files changed, 36 insertions, 4 deletions
diff --git a/src/Grasp/Interpreter.hs b/src/Grasp/Interpreter.hs index 67632bc..7223416 100644 --- a/src/Grasp/Interpreter.hs +++ b/src/Grasp/Interpreter.hs @@ -213,7 +213,7 @@ pushI g node = do      let label = if (inL == []) then "" else inL !! rnd      if (length stackN /= 1) -    then error ("Instruction " ++ (show node) ++ " should only have one stack argument") +    then error ("Instruction " ++ (show node) ++ " should have one stack argument")      else doPushI g (head stackN) label @@ -226,7 +226,7 @@ implicitPushI g node =          label = fromJust $ Graph.lab g node      in if (length stackN /= 1) -        then error ("Instruction " ++ (show node) ++ " should only have one stack argument") +        then error ("Instruction " ++ (show node) ++ " should have one stack argument")          else doPushI g (head stackN) label @@ -249,10 +249,42 @@ doPushI g s l =  popI :: GraspProgram -> Node -> IO GraspProgram -popI g node = return g +popI g node = +    let edges = Graph.out g node + +        stackN = targetNodes (getByLabel "stack" edges) +        outL = targetLabels g (getByLabel "out" edges) +        emptyL = targetLabels g (getByLabel "empty" edges) + +    in return g + +  pickI :: GraspProgram -> Node -> IO GraspProgram -pickI g node = return g +pickI g node = +    let edges = Graph.out g node + +        stackN = targetNodes (getByLabel "stack" edges) +        depthL = targetLabels g (getByLabel "depth" edges) +        outL = targetLabels g (getByLabel "out" edges) +        emptyL = targetLabels g (getByLabel "empty" edges) + +    in case (stackN, depthL) of +        (x,_) | length x /= 1 -> error ("Instruction " ++ (show node) ++ +                                        " should have one stack argument") + +        (_,y) | length y /= 1 -> error ("Instruction " ++ (show node) ++ +                                        " should have one depth argument") + +        (_,y) | not (isFloat (head y)) -> error ("Instruction " ++ (show node) ++ +                                                " should have numeric depth argument") + +        (x,y) -> doPickI g (head x) (head y) outL emptyL + + + +doPickI :: GraspProgram -> Node -> String -> [String] -> [String] -> IO GraspProgram +doPickI g s d out empty = return g  | 
