Create param parser

This commit is contained in:
2021-11-03 23:20:24 +01:00
parent bdc534df7c
commit 969f1cf517

View File

@@ -155,6 +155,7 @@ data AST = OperatorNode VM.Op
| AmpersandNode
| LabelDefNode String
| LabelRefNode String
| ParamNode AST
deriving (Eq, Show)
type ConsumedTokens = Int
@@ -190,6 +191,14 @@ parseLabelRef :: Parser
parseLabelRef = parseSeq [parseAmpersand, parseIdentifier] combine
where combine = (\[_, (IdentifierNode id)] -> LabelRefNode id)
parseParam :: Parser
parseParam = parseAlt [parseInt, parseLabelRef] ParamNode
parseAlt :: [Parser] -> (AST -> AST) -> Parser
parseAlt parsers mapper tokens = do
(ParseResult ast consumed) <- parseAny parsers tokens
return $ ParseResult (mapper ast) consumed
parseAny :: [Parser] -> Parser
parseAny parsers tokens = Monoid.getFirst . Monoid.mconcat . map Monoid.First $ sequenceA parsers tokens