lexer implement literals
This commit is contained in:
parent
e5baa701b2
commit
ecd778cc70
@ -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
|
||||||
]
|
]
|
@ -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)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user