Fix instruction parser
This commit is contained in:
@@ -198,15 +198,25 @@ parseParam :: Parser
|
|||||||
parseParam = parseAlt [parseInt, parseLabelRef] ParamNode
|
parseParam = parseAlt [parseInt, parseLabelRef] ParamNode
|
||||||
|
|
||||||
parseInstr :: Parser
|
parseInstr :: Parser
|
||||||
parseInstr = parseSeq [parseOperator, parseMany parseParam ParamsNode] (\[op, ps] -> InstructionNode op ps)
|
parseInstr = parseAny [withParams, withoutParams]
|
||||||
|
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 mapper tokens = do
|
||||||
|
(ParseResult ast consumed) <- parser tokens
|
||||||
|
return $ ParseResult (mapper ast) consumed
|
||||||
|
|
||||||
parseMany :: Parser -> ([AST] -> AST) -> Parser
|
parseMany :: Parser -> ([AST] -> AST) -> Parser
|
||||||
parseMany parser combiner tokens = Just $ ParseResult ast consumed
|
parseMany parser combiner tokens = if null asts
|
||||||
|
then Nothing
|
||||||
|
else Just $ ParseResult ast consumed
|
||||||
where
|
where
|
||||||
results = parseGreedy parser tokens
|
results = parseGreedy parser tokens
|
||||||
consumed = sum $ map (\(ParseResult _ c) -> c) results
|
consumed = sum $ map (\(ParseResult _ c) -> c) results
|
||||||
asts = map (\(ParseResult a _) -> a) results
|
asts = map (\(ParseResult a _) -> a) results
|
||||||
ast = if null asts then EmptyNode else combiner asts
|
ast = combiner asts
|
||||||
|
|
||||||
parseGreedy :: Parser -> [Token] -> [ParseResult]
|
parseGreedy :: Parser -> [Token] -> [ParseResult]
|
||||||
parseGreedy parser tokens = case parser tokens of
|
parseGreedy parser tokens = case parser tokens of
|
||||||
@@ -246,7 +256,5 @@ parse tokens = case parsers tokens of
|
|||||||
|
|
||||||
parsers :: Parser
|
parsers :: Parser
|
||||||
parsers = parseAny
|
parsers = parseAny
|
||||||
[ parseLabelDef
|
[ parseInstr
|
||||||
, parseLabelRef
|
|
||||||
, parseInstr
|
|
||||||
]
|
]
|
||||||
Reference in New Issue
Block a user