You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
1.5 KiB
Go
103 lines
1.5 KiB
Go
package token
|
|
|
|
// TokenType represents the type of a token.
|
|
type TokenType int
|
|
|
|
// Token types.
|
|
const (
|
|
// Single-character tokens.
|
|
LEFT_PAREN TokenType = iota
|
|
RIGHT_PAREN
|
|
LEFT_BRACE
|
|
RIGHT_BRACE
|
|
COMMA
|
|
DOT
|
|
MINUS
|
|
PLUS
|
|
SEMICOLON
|
|
SLASH
|
|
STAR
|
|
|
|
// One or two character tokens.
|
|
BANG
|
|
BANG_EQUAL
|
|
EQUAL
|
|
EQUAL_EQUAL
|
|
GREATER
|
|
GREATER_EQUAL
|
|
LESS
|
|
LESS_EQUAL
|
|
|
|
// Literals.
|
|
IDENTIFIER
|
|
STRING
|
|
NUMBER
|
|
|
|
// Keywords.
|
|
AND
|
|
CLASS
|
|
ELSE
|
|
FALSE
|
|
FUN
|
|
FOR
|
|
IF
|
|
NIL
|
|
OR
|
|
PRINT
|
|
RETURN
|
|
SUPER
|
|
THIS
|
|
TRUE
|
|
VAR
|
|
WHILE
|
|
|
|
EOF
|
|
)
|
|
|
|
// Token represents a token in the source code.
|
|
type Token struct {
|
|
Type TokenType
|
|
Lexeme string
|
|
Literal interface{}
|
|
Line int
|
|
}
|
|
|
|
// New creates a new Token.
|
|
func New(t TokenType, lexeme string, literal interface{}, line int) Token {
|
|
return Token{t, lexeme, literal, line}
|
|
}
|
|
|
|
// String returns the string representation of the token.
|
|
func (t Token) String() string {
|
|
return t.Lexeme
|
|
}
|
|
|
|
// keywords maps keywords to their respective TokenType.
|
|
var keywords = map[string]TokenType{
|
|
"and": AND,
|
|
"class": CLASS,
|
|
"else": ELSE,
|
|
"false": FALSE,
|
|
"for": FOR,
|
|
"fun": FUN,
|
|
"if": IF,
|
|
"nil": NIL,
|
|
"or": OR,
|
|
"print": PRINT,
|
|
"return": RETURN,
|
|
"super": SUPER,
|
|
"this": THIS,
|
|
"true": TRUE,
|
|
"var": VAR,
|
|
"while": WHILE,
|
|
}
|
|
|
|
// LookupKeyword returns the TokenType for the given identifier.
|
|
// If the identifier is not a keyword, it returns IDENTIFIER.
|
|
func LookupKeyword(identifier string) TokenType {
|
|
if t, ok := keywords[identifier]; ok {
|
|
return t
|
|
}
|
|
return IDENTIFIER
|
|
}
|