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" }