package Ġcom . github . sh ak el ang . shake . lexer Ċ Ċ import Ġcom . github . sh ak el ang . shake . lexer . token . Token Ċ import Ġcom . github . sh ak el ang . shake . lexer . token . TokenType Ċ import Ġcom . github . sh ak el ang . shake . util . character input . character input stream . Character InputStream Ċ import Ġcom . github . sh ak el ang . shake . util . character input . character input stream . Source Character InputStream Ċ import Ġkotlin . test .* Ċ Ċ class ĠLex er Tests Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest String () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġstrings ĊĠĠĠĠĠĠĠ ĠassertEquals ("", Ġgenerate Token ("\" \"", ĠTokenType . STRING ). value ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" af v ne 9 2 1 4 Ġro ", Ġgenerate Token ("\" af v ne 9 2 1 4 Ġro \"", ĠTokenType . STRING ). value ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"\\ t \\ b \\ n \\ r \\ f \\ ' \\\" \\\\ a \\ u 0 0 0 0 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Token ("\" \\ t \\ b \\ n \\ r \\ f \\ ' \\\" \\\\ a \\ u 0 0 0 0 \"", ĠTokenType . STRING ). value ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Character () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġcharacters ĊĠĠĠĠĠĠĠ ĠassertEquals (" Ġ", Ġgenerate Token ("' Ġ' ", ĠTokenType . CHARACTER ). value ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" a ", Ġgenerate Token ("' a '", ĠTokenType . CHARACTER ). value ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("\\ r ", Ġgenerate Token ("' \\ r '", ĠTokenType . CHARACTER ). value ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("\\ n ", Ġgenerate Token ("' \\ n '", ĠTokenType . CHARACTER ). value ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("\\ b ", Ġgenerate Token ("' \\ b '", ĠTokenType . CHARACTER ). value ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("\\ t ", Ġgenerate Token ("' \\ t '", ĠTokenType . CHARACTER ). value ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("\\ f ", Ġgenerate Token ("' \\ f '", ĠTokenType . CHARACTER ). value ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("\\ '", Ġgenerate Token ("' \\ '' ", ĠTokenType . CHARACTER ). value ) ĊĠĠĠĠĠĠĠ ĠassertEquals ("\\ u 0 0 0 0 ", Ġgenerate Token ("' \\ u 0 0 0 0 '", ĠTokenType . CHARACTER ). value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest P unctuation () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġpunctuation ĊĠĠĠĠĠĠĠ Ġgenerate Token (" ;", ĠTokenType . SE MIC OL ON ) Ġ// Ġ';' ĊĠĠĠĠĠĠĠ Ġgenerate Token (",", ĠTokenType . COMMA ) Ġ// Ġ',' ĊĠĠĠĠĠĠĠ Ġgenerate Token (".", ĠTokenType . DOT ) Ġ// Ġ'.' ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Line Separator () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġline Ġseparator ĊĠĠĠĠĠĠĠ Ġgenerate Token ("\ n ", ĠTokenType . LINE _ SEPARATOR ) Ġ// Ġ'\ n ' ĊĠĠĠĠĠĠĠ Ġgenerate Token ("\ r \ n ", ĠTokenType . LINE _ SEPARATOR ) Ġ// Ġ'\ r \ n ' ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Assign () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġassign ĊĠĠĠĠĠĠĠ Ġgenerate Token (" =", ĠTokenType . ASSIGN ) Ġ// Ġ'=' ĊĊĠĠĠĠĠĠĠ Ġ// Ġmath Ġassign Ġoperators ĊĠĠĠĠĠĠĠ Ġgenerate Token ("+ =", ĠTokenType . ADD _ ASSIGN ) Ġ// Ġ'+ =' ĊĠĠĠĠĠĠĠ Ġgenerate Token ("- =", ĠTokenType . SUB _ ASSIGN ) Ġ// Ġ'- =' ĊĠĠĠĠĠĠĠ Ġgenerate Token ("* =", ĠTokenType . MUL _ ASSIGN ) Ġ// Ġ'* =' ĊĠĠĠĠĠĠĠ Ġgenerate Token ("/ =", ĠTokenType . DIV _ ASSIGN ) Ġ// Ġ'/ =' ĊĠĠĠĠĠĠĠ Ġgenerate Token ("% =", ĠTokenType . MOD _ ASSIGN ) Ġ// Ġ'% =' ĊĠĠĠĠĠĠĠ Ġgenerate Token (" ** =", ĠTokenType . PO W _ ASSIGN ) Ġ// Ġ"** =" ĊĠĠĠĠĠĠĠ Ġgenerate Token (" ++ ", ĠTokenType . IN CR ) Ġ// Ġ' ++ ' ĊĠĠĠĠĠĠĠ Ġgenerate Token ("-- ", ĠTokenType . DE CR ) Ġ// Ġ'-- ' ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Math Operators () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġmath Ġoperators ĊĠĠĠĠĠĠĠ Ġgenerate Token ("+ ", ĠTokenType . ADD ) Ġ// Ġ'+' ĊĠĠĠĠĠĠĠ Ġgenerate Token ("- ", ĠTokenType . SUB ) Ġ// Ġ'-' ĊĠĠĠĠĠĠĠ Ġgenerate Token ("* ", ĠTokenType . MUL ) Ġ// Ġ'*' ĊĠĠĠĠĠĠĠ Ġgenerate Token ("/", ĠTokenType . DIV ) Ġ// Ġ'/' ĊĠĠĠĠĠĠĠ Ġgenerate Token ("% ", ĠTokenType . MOD ) Ġ// Ġ'%' ĊĠĠĠĠĠĠĠ Ġgenerate Token (" ** ", ĠTokenType . PO W ) Ġ// Ġ"** " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Logical Comparison () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġlogical Ġcomparison ĊĠĠĠĠĠĠĠ Ġgenerate Token (" ==", ĠTokenType . EQ _ EQUAL S ) Ġ// Ġ" ==" ĊĠĠĠĠĠĠĠ Ġgenerate Token ("> =", ĠTokenType . BIG GER _ EQUAL S ) Ġ// Ġ"> =" ĊĠĠĠĠĠĠĠ Ġgenerate Token ("< =", ĠTokenType . SMALL ER _ EQUAL S ) Ġ// Ġ"< =" ĊĠĠĠĠĠĠĠ Ġgenerate Token ("> ", ĠTokenType . BIG GER ) Ġ// Ġ' >' ĊĠĠĠĠĠĠĠ Ġgenerate Token ("< ", ĠTokenType . SMALL ER ) Ġ// Ġ'< ' ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Logical Concatenation () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġlogical Ġconcat enation ĊĠĠĠĠĠĠĠ Ġgenerate Token (" || ", ĠTokenType . LOG ICAL _ OR ) Ġ// Ġ" || " ĊĠĠĠĠĠĠĠ Ġgenerate Token ("^ ", ĠTokenType . LOG ICAL _ XOR ) Ġ// Ġ"^ " ĊĠĠĠĠĠĠĠ Ġgenerate Token (" && ", ĠTokenType . LOG ICAL _ AND ) Ġ// Ġ" && " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Br ackets () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġbrackets ĊĠĠĠĠĠĠĠ Ġgenerate Token (" (", ĠTokenType . LP AREN ) Ġ// Ġ'(' ĊĠĠĠĠĠĠĠ Ġgenerate Token (" )", ĠTokenType . RP AREN ) Ġ// Ġ')' ĊĠĠĠĠĠĠĠ Ġgenerate Token ("{ ", ĠTokenType . LC URL ) Ġ// Ġ'{ ' ĊĠĠĠĠĠĠĠ Ġgenerate Token (" }", ĠTokenType . RC URL ) Ġ// Ġ' }' ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġtest Keyword ( test : ĠKeyword Test ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgenerate Token ( test . input , Ġtest . output ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġtest Dynamic () Ġ= Ġtest Keyword ( Keyword Test . DYNAMIC ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Byte () Ġ= Ġtest Keyword ( Keyword Test . BYTE ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Short () Ġ= Ġtest Keyword ( Keyword Test . SHORT ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Int () Ġ= Ġtest Keyword ( Keyword Test . INT ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Long () Ġ= Ġtest Keyword ( Keyword Test . LONG ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Float () Ġ= Ġtest Keyword ( Keyword Test . FLOAT ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Double () Ġ= Ġtest Keyword ( Keyword Test . DOUBLE ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Char () Ġ= Ġtest Keyword ( Keyword Test . CHAR ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Boolean () Ġ= Ġtest Keyword ( Keyword Test . BOOLEAN ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Var () Ġ= Ġtest Keyword ( Keyword Test . VAR ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Let () Ġ= Ġtest Keyword ( Keyword Test . LET ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Const () Ġ= Ġtest Keyword ( Keyword Test . CONST ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Function () Ġ= Ġtest Keyword ( Keyword Test . FUNCTION ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Return () Ġ= Ġtest Keyword ( Keyword Test . RETURN ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Do () Ġ= Ġtest Keyword ( Keyword Test . DO ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest While () Ġ= Ġtest Keyword ( Keyword Test . WH ILE ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest For () Ġ= Ġtest Keyword ( Keyword Test . FOR ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest If () Ġ= Ġtest Keyword ( Keyword Test . IF ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Else () Ġ= Ġtest Keyword ( Keyword Test . ELSE ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest True () Ġ= Ġtest Keyword ( Keyword Test . TRUE ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest False () Ġ= Ġtest Keyword ( Keyword Test . FALSE ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Class () Ġ= Ġtest Keyword ( Keyword Test . CLASS ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Ext ends () Ġ= Ġtest Keyword ( Keyword Test . EXT END S ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Implements () Ġ= Ġtest Keyword ( Keyword Test . IMPLEMENT S ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Static () Ġ= Ġtest Keyword ( Keyword Test . STATIC ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Final () Ġ= Ġtest Keyword ( Keyword Test . FINAL ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Public () Ġ= Ġtest Keyword ( Keyword Test . PUBLIC ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Protected () Ġ= Ġtest Keyword ( Keyword Test . PROTECT ED ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Private () Ġ= Ġtest Keyword ( Keyword Test . PRIVATE ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest New () Ġ= Ġtest Keyword ( Keyword Test . NEW ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Import () Ġ= Ġtest Keyword ( Keyword Test . IMPORT ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Void () Ġ= Ġtest Keyword ( Keyword Test . VOID ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest Constructor () Ġ= Ġtest Keyword ( Keyword Test . CON STRUCTOR ) ĊĠĠĠ Ġ@ Test Ġfun Ġtest As () Ġ= Ġtest Keyword ( Keyword Test . AS ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Numbers () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġnumbers ĊĠĠĠĠĠĠĠ ĠassertEquals (" 1 4 9 ", Ġgenerate Token (" 1 4 9 ", ĠTokenType . INTEGER ). value ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" 0 . 0 1 ", Ġgenerate Token (" 0 . 0 1 ", ĠTokenType . DOUBLE ). value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Identifiers () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġidentifiers ĊĠĠĠĠĠĠĠ ĠassertEquals (" hello ", Ġgenerate Token (" hello ", ĠTokenType . IDENTIFIER ). value ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" world 0 A _", Ġgenerate Token (" world 0 A _", ĠTokenType . IDENTIFIER ). value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Single Line Comments () Ġ{ ĊĠĠĠĠĠĠĠ Ġgenerate Token ("// Ġtest \ n ", ĠTokenType . LINE _ SEPARATOR ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Multi Line Comments () Ġ{ ĊĠĠĠĠĠĠĠ Ġgenerate Token (" /* Ġtest Ġ*/ \ n ", ĠTokenType . LINE _ SEPARATOR ) ĊĠĠĠĠĠĠĠ Ġgenerate Token (" /* \ nt est \ nt est 2 */ \ n ", ĠTokenType . LINE _ SEPARATOR ) ĊĠĠĠĠĠĠĠ Ġgenerate Token (" /* \ n Ġ* Ġtest \ n Ġ* Ġ Ġtest 2 \ n Ġ*/ \ n ", ĠTokenType . LINE _ SEPARATOR ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠ Ġenum Ġclass ĠKeyword Test ( val Ġinput : ĠString , Ġval Ġoutput : ĠByte ) Ġ{ ĊĠĠĠĠĠĠĠ ĠD Y NAMIC (" dynamic ", ĠTokenType . KEYWORD _ DYNAMIC ), ĊĠĠĠĠĠĠĠ ĠBYTE (" byte ", ĠTokenType . KEYWORD _ BYTE ), ĊĠĠĠĠĠĠĠ ĠSH ORT (" short ", ĠTokenType . KEYWORD _ SHORT ), ĊĠĠĠĠĠĠĠ ĠINT (" int ", ĠTokenType . KEYWORD _ INT ), ĊĠĠĠĠĠĠĠ ĠLONG (" long ", ĠTokenType . KEYWORD _ LONG ), ĊĠĠĠĠĠĠĠ ĠFLOAT (" float ", ĠTokenType . KEYWORD _ FLOAT ), ĊĠĠĠĠĠĠĠ ĠDOUBLE (" double ", ĠTokenType . KEYWORD _ DOUBLE ), ĊĠĠĠĠĠĠĠ ĠCHAR (" char ", ĠTokenType . KEYWORD _ CHAR ), ĊĠĠĠĠĠĠĠ ĠBOOLEAN (" boolean ", ĠTokenType . KEYWORD _ BOOLEAN ), ĊĠĠĠĠĠĠĠ ĠVAR (" var ", ĠTokenType . KEYWORD _ VAR ), ĊĠĠĠĠĠĠĠ ĠLET (" let ", ĠTokenType . KEYWORD _ VAR ), ĊĠĠĠĠĠĠĠ ĠCONST (" const ", ĠTokenType . KEYWORD _ CONST ), ĊĠĠĠĠĠĠĠ ĠFUNCTION (" function ", ĠTokenType . KEYWORD _ FUNCTION ), ĊĠĠĠĠĠĠĠ ĠRETURN (" return ", ĠTokenType . KEYWORD _ RETURN ), ĊĠĠĠĠĠĠĠ ĠDO (" do ", ĠTokenType . KEYWORD _ DO ), ĊĠĠĠĠĠĠĠ ĠWH ILE (" while ", ĠTokenType . KEYWORD _ WH ILE ), ĊĠĠĠĠĠĠĠ ĠFOR (" for ", ĠTokenType . KEYWORD _ FOR ), ĊĠĠĠĠĠĠĠ ĠIF (" if ", ĠTokenType . KEYWORD _ IF ), ĊĠĠĠĠĠĠĠ ĠELSE (" else ", ĠTokenType . KEYWORD _ ELSE ), ĊĠĠĠĠĠĠĠ ĠTRUE (" true ", ĠTokenType . KEYWORD _ TRUE ), ĊĠĠĠĠĠĠĠ ĠFALSE (" false ", ĠTokenType . KEYWORD _ FALSE ), ĊĠĠĠĠĠĠĠ ĠCLASS (" class ", ĠTokenType . KEYWORD _ CLASS ), ĊĠĠĠĠĠĠĠ ĠEXT END S (" extends ", ĠTokenType . KEYWORD _ EXT END S ), ĊĠĠĠĠĠĠĠ ĠIMP LEMENT S (" implements ", ĠTokenType . KEYWORD _ IMPLEMENT S ), ĊĠĠĠĠĠĠĠ ĠSTATIC (" static ", ĠTokenType . KEYWORD _ STATIC ), ĊĠĠĠĠĠĠĠ ĠFIN AL (" final ", ĠTokenType . KEYWORD _ FINAL ), ĊĠĠĠĠĠĠĠ ĠPUBLIC (" public ", ĠTokenType . KEYWORD _ PUBLIC ), ĊĠĠĠĠĠĠĠ ĠPRO TECT ED (" protected ", ĠTokenType . KEYWORD _ PROTECT ED ), ĊĠĠĠĠĠĠĠ ĠPRIVATE (" private ", ĠTokenType . KEYWORD _ PRIVATE ), ĊĠĠĠĠĠĠĠ ĠNEW (" new ", ĠTokenType . KEYWORD _ NEW ), ĊĠĠĠĠĠĠĠ ĠIMPORT (" import ", ĠTokenType . KEYWORD _ IMPORT ), ĊĠĠĠĠĠĠĠ ĠVOID (" void ", ĠTokenType . KEYWORD _ VOID ), ĊĠĠĠĠĠĠĠ ĠCON STRUCTOR (" constructor ", ĠTokenType . KEYWORD _ CON STRUCTOR ), ĊĠĠĠĠĠĠĠ ĠAS (" as ", ĠTokenType . KEYWORD _ AS ); ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Keyword Ġ'$ input '" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" deprecation ") ĊĠĠĠĠĠĠĠ Ġfun Ġgenerate Token ( input : ĠString , Ġtt : ĠByte ): ĠToken Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi : ĠCharacter InputStream Ġ= ĠSource Character InputStream ("< tests >", Ġinput ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlexer Ġ= ĠLex er ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġlexer . make Tokens (). next () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertSame ( tt , Ġt . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( i . hasNext ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġt ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }