diff --git a/src/chalk/lexer.cr b/src/chalk/lexer.cr new file mode 100644 index 0000000..4e77075 --- /dev/null +++ b/src/chalk/lexer.cr @@ -0,0 +1,74 @@ +require "lex" + +module Chalk + enum TokenType + Any, + Str, + Id, + LitDec, + LitBin, + LitHex, + OpAdd + OpSub + OpMul + OpDiv + OpOr + OpAnd + OpXor + KwSprite + KwInline + KwFun + KwU0 + KwU8 + KwU12 + KwVar + KwIf + KwElse + KwWhile + KwReturn + end + + class Lexer + def initialize + @lexer = Lex::Lexer.new + @lexer.add_pattern(".", TokenType::Any.value) + @lexer.add_pattern("\"(\\\\\"|[^\"])*\"", + TokenType::Str.value) + @lexer.add_pattern("[a-zA-Z_][a-zA-Z_0-9]*", + TokenType::Id.value) + @lexer.add_pattern("[0-9]+", + TokenType::LitDec.value) + @lexer.add_pattern("0b[0-1]+", + TokenType::LitBin.value) + @lexer.add_pattern("0x[0-9a-fA-F]+", + TokenType::LitHex.value) + @lexer.add_pattern("\\+", TokenType::OpAdd.value) + @lexer.add_pattern("-", TokenType::OpSub.value) + @lexer.add_pattern("\\*", TokenType::OpMul.value) + @lexer.add_pattern("/", TokenType::OpDiv.value) + @lexer.add_pattern("&", TokenType::OpAdd.value) + @lexer.add_pattern("\\|", TokenType::OpOr.value) + @lexer.add_pattern("^", TokenType::OpXor.value) + @lexer.add_pattern("sprite", TokenType::KwSprite.value) + @lexer.add_pattern("inline", TokenType::KwInline.value) + @lexer.add_pattern("fun", TokenType::KwFun.value) + @lexer.add_pattern("u0", TokenType::KwU0.value) + @lexer.add_pattern("u8", TokenType::KwU8.value) + @lexer.add_pattern("u12", TokenType::KwU12.value) + @lexer.add_pattern("var", TokenType::KwVar.value) + @lexer.add_pattern("if", TokenType::KwIf.value) + @lexer.add_pattern("else", TokenType::KwElse.value) + @lexer.add_pattern("while", TokenType::KwWhile.value) + @lexer.add_pattern("return", TokenType::KwReturn.value) + end + + def lex(string) + return @lexer.lex(string) + .select { |t| t[0] != " " } + .map do |tuple| + string, id = tuple + { string, TokenType.new(id) } + end + end + end +end