Create identifier tokenizer
This commit is contained in:
@@ -10,6 +10,7 @@ import qualified Util as U
|
|||||||
data Token = Operator VM.Op
|
data Token = Operator VM.Op
|
||||||
| IntLiteral Int
|
| IntLiteral Int
|
||||||
| StringLiteral String
|
| StringLiteral String
|
||||||
|
| Identifier String
|
||||||
| Colon
|
| Colon
|
||||||
| WhiteSpace
|
| WhiteSpace
|
||||||
| Comment String
|
| Comment String
|
||||||
@@ -38,6 +39,13 @@ operatorTokenizer op input = keywordTokenizer False (U.toLowerCase . show $ op)
|
|||||||
tokenizeOperators :: Tokenizer
|
tokenizeOperators :: Tokenizer
|
||||||
tokenizeOperators = anyTokenizer $ map operatorTokenizer [VM.Push ..]
|
tokenizeOperators = anyTokenizer $ map operatorTokenizer [VM.Push ..]
|
||||||
|
|
||||||
|
tokenizeIdentifier :: Tokenizer
|
||||||
|
tokenizeIdentifier input@(x:_) = if null identifier || (not . Char.isAlpha) x
|
||||||
|
then Nothing
|
||||||
|
else Just $ TokenizeResult (Identifier identifier) (length identifier)
|
||||||
|
where
|
||||||
|
identifier = takeWhile (or . sequenceA [Char.isAlphaNum, (=='_')]) input
|
||||||
|
|
||||||
tokenizeWhitespace :: Tokenizer
|
tokenizeWhitespace :: Tokenizer
|
||||||
tokenizeWhitespace [] = Nothing
|
tokenizeWhitespace [] = Nothing
|
||||||
tokenizeWhitespace (x:_)
|
tokenizeWhitespace (x:_)
|
||||||
@@ -122,6 +130,7 @@ tokenizers = anyTokenizer
|
|||||||
, sepTokenizer Char.isSpace tokenizeOperators
|
, sepTokenizer Char.isSpace tokenizeOperators
|
||||||
, sepTokenizer Char.isSpace tokenizeHex
|
, sepTokenizer Char.isSpace tokenizeHex
|
||||||
, sepTokenizer Char.isSpace tokenizeDecimal
|
, sepTokenizer Char.isSpace tokenizeDecimal
|
||||||
|
, tokenizeIdentifier
|
||||||
, keywordTokenizer False ":" Colon
|
, keywordTokenizer False ":" Colon
|
||||||
, tokenizeChar
|
, tokenizeChar
|
||||||
, tokenizeString
|
, tokenizeString
|
||||||
|
|||||||
Reference in New Issue
Block a user