forked from solstice/solstice
started writing lexer after making string lib
This commit is contained in:
@@ -1,16 +1,97 @@
|
||||
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 {
|
||||
input = ""
|
||||
sourceCode = "x = 123"
|
||||
current = 0
|
||||
|
||||
constructor(string input) {
|
||||
self.input = input
|
||||
private def getTokenType(string input) SolsToken {
|
||||
return KEYWORDS.get(input)
|
||||
}
|
||||
|
||||
def lex() List {
|
||||
output = List(1)
|
||||
def lex() {
|
||||
inString = false
|
||||
|
||||
return output
|
||||
lineNum = 1
|
||||
lineStart = 0
|
||||
currentLine = ""
|
||||
|
||||
while lineStart < string_Length() {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
lexer = new SolsLexer
|
||||
puts lexer.getTokenType("if")
|
||||
Reference in New Issue
Block a user