Create sequence parser (pattern matcher)
This commit is contained in:
@@ -183,6 +183,23 @@ parseAmpersand _ = Nothing
|
|||||||
parseAny :: [Parser] -> Parser
|
parseAny :: [Parser] -> Parser
|
||||||
parseAny parsers tokens = Monoid.getFirst . Monoid.mconcat . map Monoid.First $ sequenceA parsers tokens
|
parseAny parsers tokens = Monoid.getFirst . Monoid.mconcat . map Monoid.First $ sequenceA parsers tokens
|
||||||
|
|
||||||
|
parseSeq :: [Parser] -> ([AST] -> AST) -> Parser
|
||||||
|
parseSeq parsers combiner tokens = do
|
||||||
|
results <- parseAll parsers tokens
|
||||||
|
let consumed = sum $ map (\(ParseResult _ c) -> c) results
|
||||||
|
let asts = map (\(ParseResult a _) -> a) results
|
||||||
|
if (length asts) == (length parsers)
|
||||||
|
then return $ ParseResult (combiner asts) consumed
|
||||||
|
else Nothing
|
||||||
|
|
||||||
|
parseAll :: [Parser] -> [Token] -> Maybe [ParseResult]
|
||||||
|
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 :: [Token] -> Either String [AST]
|
||||||
parse [] = Right []
|
parse [] = Right []
|
||||||
parse tokens = case parsers tokens of
|
parse tokens = case parsers tokens of
|
||||||
|
|||||||
Reference in New Issue
Block a user