Add unit tests for Assembler parsers

This commit is contained in:
2021-11-05 17:27:56 +01:00
parent ce3af87741
commit 919cddd814
4 changed files with 552 additions and 7 deletions

View File

@@ -1,7 +1,4 @@
module Assembler.Parser (
AST,
parse
) where
module Assembler.Parser where
import qualified Data.List as List
import qualified Data.Monoid as Monoid
@@ -77,6 +74,7 @@ parseLine :: Parser
parseLine = parseSeq [parseOptionally parseLabelDef, parseOptionally parseInstr] (\[label, instr] -> Line label instr)
mapAST :: Parser -> (AST -> AST) -> Parser
mapAST _ _ [] = Nothing
mapAST parser mapper tokens = do
(ParseResult ast consumed) <- parser tokens
return $ ParseResult (mapper ast) consumed
@@ -116,10 +114,12 @@ parseAlt parsers mapper tokens = do
-- a | b | c
parseAny :: [Parser] -> Parser
parseAny _ [] = Nothing
parseAny parsers tokens = Monoid.getFirst . Monoid.mconcat . map Monoid.First $ sequenceA parsers tokens
-- a b c
parseSeq :: [Parser] -> ([AST] -> AST) -> Parser
parseSeq _ _ [] = Nothing
parseSeq parsers combiner tokens = do
results <- parseAll parsers tokens
let consumed = sum $ map (\(ParseResult _ c) -> c) results
@@ -138,6 +138,7 @@ parseAll (p:ps) tokens = do
-- 'Nothing' if not consumed tokens exist
assertConsumed :: Parser -> Parser
assertConsumed _ [] = Nothing
assertConsumed parser tokens = do
r@(ParseResult _ consumed) <- parser tokens
if null (drop consumed tokens)