Create label def and ref parsers
This commit is contained in:
@@ -153,6 +153,8 @@ data AST = OperatorNode VM.Op
|
|||||||
| IdentifierNode String
|
| IdentifierNode String
|
||||||
| ColonNode
|
| ColonNode
|
||||||
| AmpersandNode
|
| AmpersandNode
|
||||||
|
| LabelDefNode String
|
||||||
|
| LabelRefNode String
|
||||||
deriving (Eq, Show)
|
deriving (Eq, Show)
|
||||||
|
|
||||||
type ConsumedTokens = Int
|
type ConsumedTokens = Int
|
||||||
@@ -160,26 +162,34 @@ data ParseResult = ParseResult AST ConsumedTokens deriving (Eq, Show)
|
|||||||
|
|
||||||
type Parser = [Token] -> Maybe ParseResult
|
type Parser = [Token] -> Maybe ParseResult
|
||||||
|
|
||||||
parseOperator :: [Token] -> Maybe ParseResult
|
parseOperator :: Parser
|
||||||
parseOperator ((Operator op):_) = Just $ ParseResult (OperatorNode op) 1
|
parseOperator ((Operator op):_) = Just $ ParseResult (OperatorNode op) 1
|
||||||
parseOperator _ = Nothing
|
parseOperator _ = Nothing
|
||||||
|
|
||||||
parseInt :: [Token] -> Maybe ParseResult
|
parseInt :: Parser
|
||||||
parseInt ((IntLiteral int):_) = Just $ ParseResult (IntegerNode int) 1
|
parseInt ((IntLiteral int):_) = Just $ ParseResult (IntegerNode int) 1
|
||||||
parseInt _ = Nothing
|
parseInt _ = Nothing
|
||||||
|
|
||||||
parseIdentifier :: [Token] -> Maybe ParseResult
|
parseIdentifier :: Parser
|
||||||
parseIdentifier ((Identifier id):_) = Just $ ParseResult (IdentifierNode id) 1
|
parseIdentifier ((Identifier id):_) = Just $ ParseResult (IdentifierNode id) 1
|
||||||
parseIdentifier _ = Nothing
|
parseIdentifier _ = Nothing
|
||||||
|
|
||||||
parseColon :: [Token] -> Maybe ParseResult
|
parseColon :: Parser
|
||||||
parseColon ((Colon):_) = Just $ ParseResult ColonNode 1
|
parseColon ((Colon):_) = Just $ ParseResult ColonNode 1
|
||||||
parseColon _ = Nothing
|
parseColon _ = Nothing
|
||||||
|
|
||||||
parseAmpersand :: [Token] -> Maybe ParseResult
|
parseAmpersand :: Parser
|
||||||
parseAmpersand ((Ampersand):_) = Just $ ParseResult AmpersandNode 1
|
parseAmpersand ((Ampersand):_) = Just $ ParseResult AmpersandNode 1
|
||||||
parseAmpersand _ = Nothing
|
parseAmpersand _ = Nothing
|
||||||
|
|
||||||
|
parseLabelDef :: Parser
|
||||||
|
parseLabelDef = parseSeq [parseIdentifier, parseColon] combine
|
||||||
|
where combine = (\[(IdentifierNode id), _] -> LabelDefNode id)
|
||||||
|
|
||||||
|
parseLabelRef :: Parser
|
||||||
|
parseLabelRef = parseSeq [parseAmpersand, parseIdentifier] combine
|
||||||
|
where combine = (\[_, (IdentifierNode id)] -> LabelRefNode id)
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
@@ -204,11 +214,10 @@ parse :: [Token] -> Either String [AST]
|
|||||||
parse [] = Right []
|
parse [] = Right []
|
||||||
parse tokens = case parsers tokens of
|
parse tokens = case parsers tokens of
|
||||||
(Just (ParseResult ast consumed)) -> parse (drop consumed tokens) >>= (\rest -> return $ ast : rest)
|
(Just (ParseResult ast consumed)) -> parse (drop consumed tokens) >>= (\rest -> return $ ast : rest)
|
||||||
Nothing -> Left "Unexpected token"
|
Nothing -> Left $ "Unexpected token: " ++ (show . head) tokens
|
||||||
|
|
||||||
parsers :: Parser
|
parsers :: Parser
|
||||||
parsers = parseAny
|
parsers = parseAny
|
||||||
[ parseOperator
|
[ parseLabelDef
|
||||||
, parseInt
|
, parseLabelRef
|
||||||
, parseIdentifier
|
|
||||||
]
|
]
|
||||||
Reference in New Issue
Block a user