package lexer import "fmt" // что есть в запросе? // строковые литералы // двоеточия // знак равенства // знак неравенства // AND // NOT // открытые скобки // закрытые скобки // комментарии // пайп-символы // числа // строки type TokenType int const ( EOF TokenType = iota SYMBOL COLON EXCLAMATION EQUAL NOT_EQUAL AND NOT OR MORE LESS MORE_EQUAL LESS_EQUAL OPEN_BRACE CLOSED_BRACE MINUS PLUS COMMENT PIPE NUMBER FLOAT_NUMBER STRING_LITERAL SPACE ) type Token struct { tokenType TokenType value string } func TokenKindString(kind TokenType) string { switch kind { case EOF: return "eof" case SYMBOL: return "symbol" case NUMBER: return "number" case STRING_LITERAL: return "string" case FLOAT_NUMBER: return "float" case OPEN_BRACE: return "open_paren" case CLOSED_BRACE: return "close_paren" case EQUAL: return "equals" case NOT_EQUAL: return "not_equals" case NOT: return "not" case OR: return "or" case AND: return "and" case COLON: return "colon" case EXCLAMATION: return "exclamation" case MORE: return "more" case LESS: return "less" case MORE_EQUAL: return "more_equal" case LESS_EQUAL: return "less_equal" case COMMENT: return "comment" case PIPE: return "pipe" case MINUS: return "minus" case PLUS: return "plus" case SPACE: return "space" default: return fmt.Sprintf("unknown(%d)", kind) } } func (tk Token) IsOneOfMany(expectedTokens ...TokenType) bool { for _, expected := range expectedTokens { if expected == tk.tokenType { return true } } return false } func Debug(token Token) { if token.tokenType == SYMBOL || token.tokenType == NUMBER || token.tokenType == STRING_LITERAL { fmt.Printf("%s(%s)\n", TokenKindString(token.tokenType), token.value) } else { fmt.Printf("%s()\n", TokenKindString(token.tokenType)) } }