module mars.lexer; enum TType { identifier, eof, comma, dot, dollar, lparen, rparen, from, insert, into, returning, select, values, } struct Token { TType t; string v; } Token[] scan(string s){ import std.algorithm : canFind, startsWith, strip; Token[] tokens; while(s.length){ if(s.startsWith("select")){ tokens ~= Token(TType.select); s = s["select".length .. $]; } else if(s.startsWith("insert")){ tokens ~= Token(TType.insert); s = s["insert".length .. $]; } else if(s.startsWith("from")){ tokens ~= Token(TType.from); s = s["from".length .. $]; } else if(s.startsWith("into")){ tokens ~= Token(TType.into); s = s["into".length .. $]; } else if(s.startsWith("returning")){ tokens ~= Token(TType.returning); s = s["returning".length .. $]; } else if(s.startsWith("values")){ tokens ~= Token(TType.values); s = s["values".length .. $]; } else if(s.startsWith(",")){ tokens ~= Token(TType.comma); s = s[1 .. $]; } else if(s.startsWith(".")){ tokens ~= Token(TType.dot); s = s[1 .. $]; } else if(s.startsWith("(")){ tokens ~= Token(TType.lparen); s = s[1 .. $]; } else if(s.startsWith(")")){ tokens ~= Token(TType.rparen); s = s[1 .. $]; } else if(s.startsWith("$")){ tokens ~= Token(TType.dollar); s = s[1 .. $]; } else { auto t = Token(TType.identifier); while(s.length && ! ",.()$ ".canFind(s[0]) ){ t.v ~= s[0]; s = s[1 .. $]; } tokens ~= t; } s = s.strip(' '); //import std.stdio; writeln(s); } tokens ~= Token(TType.eof); return tokens; }