forked from solstice/solstice
97 lines
2.7 KiB
Plaintext
97 lines
2.7 KiB
Plaintext
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") |