Fix instruction parser 2
This commit is contained in:
@@ -198,16 +198,21 @@ parseParam :: Parser
|
|||||||
parseParam = parseAlt [parseInt, parseLabelRef] ParamNode
|
parseParam = parseAlt [parseInt, parseLabelRef] ParamNode
|
||||||
|
|
||||||
parseInstr :: Parser
|
parseInstr :: Parser
|
||||||
parseInstr = parseAny [withParams, withoutParams]
|
parseInstr = parseSeq [parseOperator, parseMany0 parseParam ParamsNode] (\[op, ps] -> InstructionNode op ps)
|
||||||
where
|
|
||||||
withParams = parseSeq [parseOperator, parseMany parseParam ParamsNode] (\[op, ps] -> InstructionNode op ps)
|
|
||||||
withoutParams = mapAST parseOperator (\op -> InstructionNode op EmptyNode)
|
|
||||||
|
|
||||||
mapAST :: Parser -> (AST -> AST) -> Parser
|
mapAST :: Parser -> (AST -> AST) -> Parser
|
||||||
mapAST parser mapper tokens = do
|
mapAST parser mapper tokens = do
|
||||||
(ParseResult ast consumed) <- parser tokens
|
(ParseResult ast consumed) <- parser tokens
|
||||||
return $ ParseResult (mapper ast) consumed
|
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 -> ([AST] -> AST) -> Parser
|
||||||
parseMany parser combiner tokens = if null asts
|
parseMany parser combiner tokens = if null asts
|
||||||
then Nothing
|
then Nothing
|
||||||
@@ -241,12 +246,11 @@ parseSeq parsers combiner tokens = do
|
|||||||
else Nothing
|
else Nothing
|
||||||
|
|
||||||
parseAll :: [Parser] -> [Token] -> Maybe [ParseResult]
|
parseAll :: [Parser] -> [Token] -> Maybe [ParseResult]
|
||||||
parseAll _ [] = Just []
|
parseAll [] _ = Just []
|
||||||
parseAll (p:ps) tokens = do
|
parseAll (p:ps) tokens = do
|
||||||
(ParseResult ast consumed) <- p tokens
|
(ParseResult ast consumed) <- p tokens
|
||||||
rest <- parseAll ps (drop consumed tokens)
|
rest <- parseAll ps (drop consumed tokens)
|
||||||
return $ (ParseResult ast consumed) : rest
|
return $ (ParseResult ast consumed) : rest
|
||||||
parseAll _ _ = Nothing
|
|
||||||
|
|
||||||
parse :: [Token] -> Either String [AST]
|
parse :: [Token] -> Either String [AST]
|
||||||
parse [] = Right []
|
parse [] = Right []
|
||||||
|
|||||||
Reference in New Issue
Block a user