feat: Implement Lexer

This commit is contained in:
Laborratte 5 2024-07-15 23:38:30 +02:00
parent fffa295d3c
commit 5c2dc50872
Signed by: Laborratte5
GPG key ID: 3A30072E35202C02

View file

@ -8,3 +8,25 @@ data Token = Plus
| LBrace | LBrace
| RBrace | RBrace
deriving Show deriving Show
lex :: String -> [Token]
lex source = reverse (lex' source [] (length source))
lex' :: String -> [Token] -> Int -> [Token]
lex' "" tokens _ = tokens
lex' (' ':xs) tokens orgLength = lex' xs tokens orgLength
lex' (x:xs) tokens orgLength = case x of
'+' -> lex' xs (Plus:tokens) orgLength
'-' -> lex' xs (Minus:tokens) orgLength
'*' -> lex' xs (Multiply:tokens) orgLength
'/' -> lex' xs (Divide:tokens) orgLength
'(' -> lex' xs (LBrace:tokens) orgLength
')' -> lex' xs (RBrace:tokens) orgLength
_ -> lexNumbers (x:xs) tokens orgLength
lexNumbers :: String -> [Token] -> Int -> [Token]
lexNumbers (x:xs) tokens orgLength
| isDigit x = lex' (dropWhile isDigit (x:xs)) ((Integer(read (takeWhile isDigit (x:xs))::Int)):tokens) orgLength
| otherwise = error $ "Syntax error: " ++ [x] ++ " (" ++ show (orgLength - (length (x:xs))) ++ ")"
isDigit x = x `elem` "0123456789"