122 lines
1.9 KiB
Go
122 lines
1.9 KiB
Go
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))
|
|
}
|
|
}
|