never executed always true always false
1 module HelVM.HelMA.Automata.WhiteSpace.Parser (
2 parseForTest,
3 flipParseVisible,
4 flipParseWhite,
5 parseVisible,
6 parseWhite,
7 parse,
8 parseFromTL
9 ) where
10
11 import HelVM.HelMA.Automata.WhiteSpace.Lexer
12 import HelVM.HelMA.Automata.WhiteSpace.OperandParsers
13 import HelVM.HelMA.Automata.WhiteSpace.Token
14
15 import HelVM.HelMA.Automaton.API.IOTypes
16
17 import HelVM.HelMA.Automaton.Instruction
18 import HelVM.HelMA.Automaton.Instruction.Extras.Constructors
19
20 import HelVM.HelMA.Automaton.Types.FormatType
21 import HelVM.HelMA.Automaton.Types.TokenType
22
23 import HelVM.HelIO.Control.Safe
24 import HelVM.HelIO.Extra
25
26 parseForTest :: FormatType -> TokenType -> Source -> Safe InstructionList
27 parseForTest formatType tokenType s = parse tokenType s formatType
28
29 flipParseVisible :: FormatType -> Source -> Safe InstructionList
30 flipParseVisible = flip parseVisible
31
32 flipParseWhite :: FormatType -> Source -> Safe InstructionList
33 flipParseWhite = flip parseWhite
34
35 parseVisible :: Source -> FormatType -> Safe InstructionList
36 parseVisible = parse VisibleTokenType
37
38 parseWhite :: Source -> FormatType -> Safe InstructionList
39 parseWhite = parse WhiteTokenType
40
41 parse :: MonadSafe m => TokenType -> Source -> FormatType -> m InstructionList
42 parse tokenType = flip parseFromTL . tokenize tokenType
43
44 parseFromTL :: MonadSafe m => FormatType -> TokenList -> m InstructionList
45 parseFromTL ascii = repeatedlyM (parseInstruction ascii)
46
47 parseInstruction :: MonadSafe m => FormatType -> InstructionParser m
48 parseInstruction _ (S : tl) = parseInstructionStackManipulation tl
49 parseInstruction _ (T : S : tl) = parseInstructionArithmetic tl
50 parseInstruction _ (T : T : tl) = parseInstructionHeadAccess tl
51 parseInstruction ascii (N : tl) = parseInstructionFlowControl ascii tl
52 parseInstruction _ (T : N : tl) = parseInstructionIO tl
53 parseInstruction _ tl = unrecognisedTokensIn "parseInstruction" tl
54
55 parseInstructionStackManipulation :: MonadSafe m => InstructionParser m
56 parseInstructionStackManipulation (S : tl) = build <$> parseSymbol tl where build (symbol , tl') = (consI symbol , tl')
57 parseInstructionStackManipulation (T : S : tl) = build <$> parseIndex tl where build (index , tl') = (copyII index , tl')
58 parseInstructionStackManipulation (T : N : tl) = build <$> parseIndex tl where build (index , tl') = (slideII index , tl')
59 parseInstructionStackManipulation (N : S : tl) = pure (dupI , tl)
60 parseInstructionStackManipulation (N : T : tl) = pure (swapI , tl)
61 parseInstructionStackManipulation (N : N : tl) = pure (discardI , tl)
62 parseInstructionStackManipulation tl = unrecognisedTokensIn "parseInstructionStackManipulation" tl
63
64 parseInstructionArithmetic :: MonadSafe m => InstructionParser m
65 parseInstructionArithmetic (S : S : tl) = pure (addI , tl)
66 parseInstructionArithmetic (S : T : tl) = pure (subI , tl)
67 parseInstructionArithmetic (S : N : tl) = pure (mulI , tl)
68 parseInstructionArithmetic (T : S : tl) = pure (divI , tl)
69 parseInstructionArithmetic (T : T : tl) = pure (modI , tl)
70 parseInstructionArithmetic tl = unrecognisedTokensIn "parseInstructionArithmetic" tl
71
72 parseInstructionHeadAccess :: MonadSafe m => InstructionParser m
73 parseInstructionHeadAccess (S : tl) = pure (storeI , tl)
74 parseInstructionHeadAccess (T : tl) = pure (loadI , tl)
75 parseInstructionHeadAccess tl = unrecognisedTokensIn "parseInstructionHeadAccess" tl
76
77 parseInstructionFlowControl :: MonadSafe m => FormatType -> InstructionParser m
78 parseInstructionFlowControl ascii (S : S : tl) = build <$> parseLabel ascii tl where build (label , tl') = (markSI label , tl')
79 parseInstructionFlowControl ascii (S : T : tl) = build <$> parseLabel ascii tl where build (label , tl') = (callSI label , tl')
80 parseInstructionFlowControl ascii (S : N : tl) = build <$> parseLabel ascii tl where build (label , tl') = (jumpSI label , tl')
81 parseInstructionFlowControl ascii (T : S : tl) = build <$> parseLabel ascii tl where build (label , tl') = (bEzSI label , tl')
82 parseInstructionFlowControl ascii (T : T : tl) = build <$> parseLabel ascii tl where build (label , tl') = (bLtzSI label , tl')
83 parseInstructionFlowControl _ (T : N : tl) = pure (returnI , tl)
84 parseInstructionFlowControl _ (N : N : tl) = pure (End , tl)
85 parseInstructionFlowControl _ tl = unrecognisedTokensIn "parseInstructionFlowControl" tl
86
87 parseInstructionIO :: MonadSafe m => InstructionParser m
88 parseInstructionIO (S : S : tl) = pure (sOutputI , tl)
89 parseInstructionIO (S : T : tl) = pure (sOutputDecI , tl)
90 parseInstructionIO (T : S : tl) = pure (mInputI , tl)
91 parseInstructionIO (T : T : tl) = pure (mInputDecI , tl)
92 parseInstructionIO tl = unrecognisedTokensIn "parseInstructionIO" tl
93
94 unrecognisedTokensIn :: MonadSafe m => Text -> TokenList -> m a
95 unrecognisedTokensIn name tl = liftErrorTupleList [("Unrecognised tokens in" , name) , ("Rest tokens" , show tl)]
96
97 type InstructionParser m = ParserFromTokenList m Instruction