use collections use string // // Token type enum. // // Each token can be one of these types. // enum SolsToken { Identifier, Literal, Type, Dot, OpenCurly, CloseCurly, OpenParen, CloseParen, Comma, OpAdd, OpSub, OpMul, OpDiv, OpAddTo, OpSubTo, OpMulTo, OpDivTo, OpIncrement, OpDecrement, OpSet, OpGreater, OpLesser, OpEqual, OpInequal, OpEqGreater, OpEqLesser, KwDef, KwLambda, KwReturn, KwUse, KwStruct, KwEnum, KwConstructor, KwDestructor, KwDuplicator, KwPrivate, KwProtected, KwPuts, KwIf, KwWhile, KwNew, KwGround, LineEnd, } // // Token type map. // // If a token matches one of the strings in this hashmap, // its type gets set to the token type for that string. // KEYWORDS = Hashmap() KEYWORDS.set("puts", SolsToken.KwPuts) KEYWORDS.set("if", SolsToken.KwIf) KEYWORDS.set("while", SolsToken.KwWhile) KEYWORDS.set("def", SolsToken.KwDef) KEYWORDS.set("lambda", SolsToken.KwLambda) KEYWORDS.set("return", SolsToken.KwReturn) KEYWORDS.set("use", SolsToken.KwUse) KEYWORDS.set("struct", SolsToken.KwStruct) KEYWORDS.set("enum", SolsToken.KwEnum) KEYWORDS.set("constructor", SolsToken.KwConstructor) KEYWORDS.set("destructor", SolsToken.KwDestructor) KEYWORDS.set("duplicator", SolsToken.KwDuplicator) KEYWORDS.set("private", SolsToken.KwPrivate) KEYWORDS.set("protected", SolsToken.KwProtected) KEYWORDS.set("ground", SolsToken.KwGround) KEYWORDS.set("new", SolsToken.KwNew) KEYWORDS.set("{", SolsToken.OpenCurly) KEYWORDS.set("}", SolsToken.CloseCurly) KEYWORDS.set("(", SolsToken.OpenParen) KEYWORDS.set(")", SolsToken.CloseParen) KEYWORDS.set("+", SolsToken.OpAdd) KEYWORDS.set("-", SolsToken.OpSub) KEYWORDS.set("*", SolsToken.OpMul) KEYWORDS.set("/", SolsToken.OpDiv) KEYWORDS.set("=", SolsToken.OpSet) KEYWORDS.set("+=", SolsToken.OpAddTo) KEYWORDS.set("-=", SolsToken.OpSubTo) KEYWORDS.set("*=", SolsToken.OpMulTo) KEYWORDS.set("/=", SolsToken.OpDivTo) KEYWORDS.set("++", SolsToken.OpIncrement) KEYWORDS.set("--", SolsToken.OpDecrement) KEYWORDS.set("==", SolsToken.OpEqual) KEYWORDS.set("!=", SolsToken.OpInequal) KEYWORDS.set(">", SolsToken.OpGreater) KEYWORDS.set("<", SolsToken.OpLesser) KEYWORDS.set(">=", SolsToken.OpEqGreater) KEYWORDS.set("<=", SolsToken.OpEqLesser) KEYWORDS.set("\n", SolsToken.LineEnd) KEYWORDS.set(";", SolsToken.LineEnd) KEYWORDS.set(",", SolsToken.Comma) struct SolsLexer { sourceCode = "x = 123" current = 0 private def getTokenType(string input) SolsToken { return KEYWORDS.get(input) } def lex() { inString = false lineNum = 1 lineStart = 0 currentLine = "" while lineStart < string_Length() { } } } lexer = new SolsLexer puts lexer.getTokenType("if")