From 5c2dc508720842b1811dd881f0249d5d2aa6f8e2 Mon Sep 17 00:00:00 2001 From: Laborratte5 Date: Mon, 15 Jul 2024 23:38:30 +0200 Subject: [PATCH] feat: Implement Lexer --- app/Lexer.hs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/app/Lexer.hs b/app/Lexer.hs index cdf1d19..f18b11d 100644 --- a/app/Lexer.hs +++ b/app/Lexer.hs @@ -8,3 +8,25 @@ data Token = Plus | LBrace | RBrace 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"