Create param parser
This commit is contained in:
@@ -155,6 +155,7 @@ data AST = OperatorNode VM.Op
|
|||||||
| AmpersandNode
|
| AmpersandNode
|
||||||
| LabelDefNode String
|
| LabelDefNode String
|
||||||
| LabelRefNode String
|
| LabelRefNode String
|
||||||
|
| ParamNode AST
|
||||||
deriving (Eq, Show)
|
deriving (Eq, Show)
|
||||||
|
|
||||||
type ConsumedTokens = Int
|
type ConsumedTokens = Int
|
||||||
@@ -190,6 +191,14 @@ parseLabelRef :: Parser
|
|||||||
parseLabelRef = parseSeq [parseAmpersand, parseIdentifier] combine
|
parseLabelRef = parseSeq [parseAmpersand, parseIdentifier] combine
|
||||||
where combine = (\[_, (IdentifierNode id)] -> LabelRefNode id)
|
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 :: [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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user