Harbor

branch main
showing the latest snapshot on main
token.odin 4.2 KB · Plain text
shader/token.odin 0644 Raw
package shader

Token :: struct {
	kind: Token_Kind,
	text: string,
	span: Source_Span,
}

Token_Kind :: enum {
	// Special
	EOF,
	Invalid,

	// Literals
	Integer,
	Float,
	String,
	Identifier,

	// Keywords
	KW_Function,
	KW_End,
	KW_Let,
	KW_Var,
	KW_Return,
	KW_If,
	KW_Then,
	KW_Elseif,
	KW_Else,
	KW_For,
	KW_While,
	KW_Do,
	KW_In,
	KW_And,
	KW_Or,
	KW_Not,
	KW_True,
	KW_False,
	KW_Struct,
	KW_Uniform,
	KW_Buffer,
	KW_Const,
	KW_Storage,
	KW_Shared,
	KW_Discard,
	KW_Break,
	KW_Continue,

	// Symbols
	Lparen,       // (
	Rparen,       // )
	Lbracket,     // [
	Rbracket,     // ]
	Lbrace,       // {
	Rbrace,       // }
	Dot,          // .
	Comma,        // ,
	Colon,        // :
	Arrow,        // ->
	Eq,           // =
	Eq_Eq,        // ==
	Not_Eq,       // !=
	Lt,           // <
	Gt,           // >
	Lt_Eq,        // <=
	Gt_Eq,        // >=
	Plus,         // +
	Minus,        // -
	Star,         // *
	Slash,        // /
	Percent,      // %
	At,           // @
	Hash,         // #
}

keyword_kind :: proc(text: string) -> (Token_Kind, bool) {
	switch text {
	case "function": return .KW_Function, true
	case "end":      return .KW_End, true
	case "let":      return .KW_Let, true
	case "var":      return .KW_Var, true
	case "return":   return .KW_Return, true
	case "if":       return .KW_If, true
	case "then":     return .KW_Then, true
	case "elseif":   return .KW_Elseif, true
	case "else":     return .KW_Else, true
	case "for":      return .KW_For, true
	case "while":    return .KW_While, true
	case "do":       return .KW_Do, true
	case "in":       return .KW_In, true
	case "and":      return .KW_And, true
	case "or":       return .KW_Or, true
	case "not":      return .KW_Not, true
	case "true":     return .KW_True, true
	case "false":    return .KW_False, true
	case "struct":   return .KW_Struct, true
	case "uniform":  return .KW_Uniform, true
	case "buffer":   return .KW_Buffer, true
	case "const":    return .KW_Const, true
	case "storage":  return .KW_Storage, true
	case "shared":   return .KW_Shared, true
	case "discard":  return .KW_Discard, true
	case "break":    return .KW_Break, true
	case "continue": return .KW_Continue, true
	}
	return .Invalid, false
}

token_kind_to_string :: proc(kind: Token_Kind) -> string {
	#partial switch kind {
	case .EOF:         return "end of file"
	case .Invalid:     return "invalid token"
	case .Integer:     return "integer"
	case .Float:       return "float"
	case .String:      return "string"
	case .Identifier:  return "identifier"
	case .KW_Function: return "'function'"
	case .KW_End:      return "'end'"
	case .KW_Let:      return "'let'"
	case .KW_Var:      return "'var'"
	case .KW_Return:   return "'return'"
	case .KW_If:       return "'if'"
	case .KW_Then:     return "'then'"
	case .KW_Elseif:   return "'elseif'"
	case .KW_Else:     return "'else'"
	case .KW_For:      return "'for'"
	case .KW_While:    return "'while'"
	case .KW_Do:       return "'do'"
	case .KW_In:       return "'in'"
	case .KW_And:      return "'and'"
	case .KW_Or:       return "'or'"
	case .KW_Not:      return "'not'"
	case .KW_True:     return "'true'"
	case .KW_False:    return "'false'"
	case .KW_Struct:   return "'struct'"
	case .KW_Uniform:  return "'uniform'"
	case .KW_Buffer:   return "'buffer'"
	case .KW_Const:    return "'const'"
	case .KW_Storage:  return "'storage'"
	case .KW_Shared:   return "'shared'"
	case .KW_Discard:  return "'discard'"
	case .KW_Break:    return "'break'"
	case .KW_Continue: return "'continue'"
	case .Lparen:      return "'('"
	case .Rparen:      return "')'"
	case .Lbracket:    return "'['"
	case .Rbracket:    return "']'"
	case .Lbrace:      return "'{'"
	case .Rbrace:      return "'}'"
	case .Dot:         return "'.'"
	case .Comma:       return "','"
	case .Colon:       return "':'"
	case .Arrow:       return "'->'"
	case .Eq:          return "'='"
	case .Eq_Eq:       return "'=='"
	case .Not_Eq:      return "'!='"
	case .Lt:          return "'<'"
	case .Gt:          return "'>'"
	case .Lt_Eq:       return "'<='"
	case .Gt_Eq:       return "'>='"
	case .Plus:        return "'+'"
	case .Minus:       return "'-'"
	case .Star:        return "'*'"
	case .Slash:       return "'/'"
	case .Percent:     return "'%'"
	case .At:          return "'@'"
	case .Hash:        return "'#'"
	}
	return "unknown"
}