Fix instruction parser 2

This commit is contained in:
2021-11-04 09:46:10 +01:00
parent 346edda6b9
commit 29303e5b5f

View File

@@ -198,16 +198,21 @@ parseParam :: Parser
parseParam = parseAlt [parseInt, parseLabelRef] ParamNode
parseInstr :: Parser
parseInstr = parseAny [withParams, withoutParams]
where
withParams = parseSeq [parseOperator, parseMany parseParam ParamsNode] (\[op, ps] -> InstructionNode op ps)
withoutParams = mapAST parseOperator (\op -> InstructionNode op EmptyNode)
parseInstr = parseSeq [parseOperator, parseMany0 parseParam ParamsNode] (\[op, ps] -> InstructionNode op ps)
mapAST :: Parser -> (AST -> AST) -> Parser
mapAST parser mapper tokens = do
(ParseResult ast consumed) <- parser tokens
return $ ParseResult (mapper ast) consumed
parseOptionally :: Parser -> Parser
parseOptionally parser input = case parser input of
Nothing -> Just $ ParseResult EmptyNode 0
result -> result
parseMany0 :: Parser -> ([AST] -> AST) -> Parser
parseMany0 parser combiner = parseOptionally $ parseMany parser combiner
parseMany :: Parser -> ([AST] -> AST) -> Parser
parseMany parser combiner tokens = if null asts
then Nothing
@@ -241,12 +246,11 @@ parseSeq parsers combiner tokens = do
else Nothing
parseAll :: [Parser] -> [Token] -> Maybe [ParseResult]
parseAll _ [] = Just []
parseAll [] _ = Just []
parseAll (p:ps) tokens = do
(ParseResult ast consumed) <- p tokens
rest <- parseAll ps (drop consumed tokens)
return $ (ParseResult ast consumed) : rest
parseAll _ _ = Nothing
parse :: [Token] -> Either String [AST]
parse [] = Right []