X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=lex.icl;h=6cb2e922e4615fb487f080e6372721b789d5633f;hb=74b900cf6db033a51e177f7f85d835dae44217e5;hp=aa34987969b5afcdc71c83451f91fe448ee9902f;hpb=5d40ca411bed8014f9bf081436208d831ac5c972;p=cc1516.git diff --git a/lex.icl b/lex.icl index aa34987..6cb2e92 100644 --- a/lex.icl +++ b/lex.icl @@ -2,6 +2,7 @@ implementation module lex import Control.Monad, Control.Applicative import Data.Either, Data.Func, Data.Void +import Data.Map from StdFunc import o import StdBool import StdList @@ -19,6 +20,10 @@ import AST | LexEOF | LexItemError String +escapes :: Map Char Char +escapes = fromList [('a', toChar 7), ('b', '\b'), ('f', '\f'), ('n', '\n'), + ('r', '\r'), ('t', '\t'), ('v', '\v'), ('\'', '\''), ('"', '"')] + lexer :: [Char] -> LexerOutput lexer r = fst $ runParser (lexProgram 1 1) r @@ -43,6 +48,7 @@ lexToken = lexKw "True" TrueToken <|> lexKw "False" FalseToken <|> lexKw "Int" IntTypeToken <|> lexKw "Bool" BoolTypeToken <|> lexKw "Char" CharTypeToken <|> + lexKw "Let" LetToken <|> //Character tokens lexEscape <|> lexCharacter <|> //Two char ops tokens @@ -61,9 +67,9 @@ lexToken = lexWord "/" SlashToken <|> lexWord "%" PercentToken <|> lexWord "=" AssignmentToken <|> lexWord "<" LesserToken <|> lexWord ">" BiggerToken <|> lexWord "!" ExclamationToken <|> - lexWord "-" DashToken <|> + lexWord "-" DashToken <|> lexWord "\\" BackslashToken <|> //Number and identifier tokens - lexNumber <|> lexIdentifier <|> + lexString <|> lexNumber <|> lexIdentifier <|> (item '\n' >>| pure LexNL) <|> //Whitespace (satisfy isSpace >>| (pure $ LexSpace 0 1)) <|> @@ -106,13 +112,15 @@ lexToken = lexEscape :: Parser Char LexItem lexEscape = item '\'' *> item '\\' *> top <* item '\'' - >>= \char->pure case char of - 'a' = LexToken 4 (CharToken $ toChar 7) - 'b' = LexToken 4 (CharToken '\b') - 'b' = LexToken 4 (CharToken '\b') - 'f' = LexToken 4 (CharToken '\f') - 'n' = LexToken 4 (CharToken '\n') - 'r' = LexToken 4 (CharToken '\t') - 'v' = LexToken 4 (CharToken '\v') - '\'' =LexToken 4 (CharToken '\'') - c = (LexItemError $ "Unknown escape: " +++ toString c) + >>= \char->pure case get char escapes of + Just e = LexToken 4 (CharToken e) + Nothing = LexItemError $ "Unknown escape: " +++ toString char + + lexString :: Parser Char LexItem + lexString = item '"' *> ( + many ( + (satisfy (\c->c <> '"' && c <> '\\')) <|> + (item '\\' *> top >>= \char->case get char escapes of + Just e = pure e + Nothing = empty) + ))<* item '"' >>= \cs-> pure $ LexToken (length cs) (StringToken cs)