lexer implement literals

This commit is contained in:
Marvin Schlegel 2024-05-02 15:57:32 +02:00
parent e5baa701b2
commit ecd778cc70
2 changed files with 26 additions and 4 deletions

View File

@ -18,6 +18,14 @@ testIdentifierWithNumber = TestCase $ assertEqual "scan 'i2'" [IDENTIFIER "i2"]
testKeywordBreak = TestCase $ assertEqual "scan 'break'" [BREAK] $ alexScanTokens "break" testKeywordBreak = TestCase $ assertEqual "scan 'break'" [BREAK] $ alexScanTokens "break"
testKeywordInt = TestCase $ assertEqual "scan 'int'" [INT] $ alexScanTokens "int" testKeywordInt = TestCase $ assertEqual "scan 'int'" [INT] $ alexScanTokens "int"
testIntLiteral = TestCase $ assertEqual "scan '234'" [INTEGERLITERAL 234] $ alexScanTokens "234"
testIntLiteral2 = TestCase $ assertEqual "scan '54_2'" [INTEGERLITERAL 542] $ alexScanTokens "54_2"
testCharLiteral = TestCase $ assertEqual "scan ''f''" [CHARLITERAL 'f'] $ alexScanTokens "'f'"
testBoolLiteralTrue = TestCase $ assertEqual "scan 'true'" [BOOLLITERAL True] $ alexScanTokens "true"
testBoolLiteralFalse = TestCase $ assertEqual "scan 'false'" [BOOLLITERAL False] $ alexScanTokens "false"
tests = TestList [ tests = TestList [
TestLabel "TestCommentSomething" testCommentSomething, TestLabel "TestCommentSomething" testCommentSomething,
TestLabel "TestEmptyComment" testEmptyComment, TestLabel "TestEmptyComment" testEmptyComment,
@ -27,5 +35,10 @@ tests = TestList [
TestLabel "TestShortIdentifier" testShortIdentifier, TestLabel "TestShortIdentifier" testShortIdentifier,
TestLabel "TestIdentifierWithNumber" testIdentifierWithNumber, TestLabel "TestIdentifierWithNumber" testIdentifierWithNumber,
TestLabel "TestKeywordBreak" testKeywordBreak, TestLabel "TestKeywordBreak" testKeywordBreak,
TestLabel "TestKeywordInt" testKeywordInt TestLabel "TestKeywordInt" testKeywordInt,
TestLabel "TestIntLiteral" testIntLiteral,
TestLabel "TestIntLiteral2" testIntLiteral2,
TestLabel "TestCharLiteral" testCharLiteral,
TestLabel "TestBoolLiteralTrue" testBoolLiteralTrue,
TestLabel "TestBoolLiteralFalse" testBoolLiteralFalse
] ]

View File

@ -1,5 +1,6 @@
{ {
module Parser.Lexer(Token(..), alexScanTokens) where module Parser.Lexer(Token(..), alexScanTokens) where
import Data.Char
} }
%wrapper "basic" %wrapper "basic"
@ -29,7 +30,7 @@ tokens :-
"default" { \_ -> DEFAULT} "default" { \_ -> DEFAULT}
"do" { \_ -> DO} "do" { \_ -> DO}
"double" { \_ -> DOUBLE} "double" { \_ -> DOUBLE}
"else" { \_ -> ELSE} ("else"|"ifn't") { \_ -> ELSE}
"enum" { \_ -> ENUM} "enum" { \_ -> ENUM}
"extends" { \_ -> EXTENDS} "extends" { \_ -> EXTENDS}
"final" { \_ -> FINAL} "final" { \_ -> FINAL}
@ -67,7 +68,11 @@ tokens :-
-- end keywords -- end keywords
$JavaLetter$JavaLetterOrDigit* { \s -> IDENTIFIER s } $JavaLetter$JavaLetterOrDigit* { \s -> IDENTIFIER s }
-- Literals -- Literals
[1-9]([0-9\_]*[0-9])* { \s -> INTEGERLITERAL $ read $ filter ((/=) '_') s }
"'"."'" { \s -> CHARLITERAL $ read $ filter ((/=) '\'') s }
"true" { \_ -> BOOLLITERAL True }
"false" { \_ -> BOOLLITERAL False }
"null" { \_ -> NULLLITERAL }
{ {
data Token data Token
@ -122,6 +127,10 @@ data Token
| VOLATILE | VOLATILE
| WHILE | WHILE
| IDENTIFIER String | IDENTIFIER String
| INTEGERLITERAL Integer
| CHARLITERAL Char
| BOOLLITERAL Bool
| NULLLITERAL
deriving(Eq,Show) deriving(Eq,Show)