hussar-lang/hussar

View on GitHub
token/token.go

Summary

Maintainability
A
0 mins
Test Coverage
package token

// Improvement: Use byte for better performance (pg12)
type TokenType string

// Improvement: include filename, line and character place to ease debugging
type Token struct {
    Type    TokenType
    Literal string
}

const (
    ILLEGAL = "ILLEGAL"
    EOF     = "EOF"
    EXIT    = "EXIT"

    // Identifiers + literals
    IDENT  = "IDENT"
    INT    = "INT"
    STRING = "STRING"

    // Operators
    ASSIGN   = "="
    PLUS     = "+"
    MINUS    = "-"
    BANG     = "!"
    ASTERISK = "*"
    SLASH    = "/"

    LT = "<"
    GT = ">"

    EQ     = "=="
    NOT_EQ = "!="

    // Delimitors
    COMMA     = ","
    SEMICOLON = ";"

    LPAREN   = "("
    RPAREN   = ")"
    LBRACE   = "{"
    RBRACE   = "}"
    LBRACKET = "["
    RBRACKET = "]"

    // Keywords
    FUNCTION = "FUNCTION"
    LET      = "LET"
    TRUE     = "TRUE"
    FALSE    = "FALSE"
    IF       = "IF"
    ELSE     = "ELSE"
    WHILE    = "WHILE"
    RETURN   = "RETURN"
)

var keywords = map[string]TokenType{
    "fn":     FUNCTION,
    "let":    LET,
    "true":   TRUE,
    "false":  FALSE,
    "if":     IF,
    "else":   ELSE,
    "while":  WHILE,
    "return": RETURN,
    "exit":   EXIT,
}

func LookupIdent(ident string) TokenType {
    if tok, ok := keywords[ident]; ok {
        return tok
    }
    return IDENT
}