package token import "core:fmt" Token :: union { Asterisk, Bang, Comma, EOF, Else, Equal_Sign, Equals, False, Forward_Slash, Function, Greater_Than, Identifier, If, Illegal, Integer, Left_Brace, Left_Parenthesis, Less_Than, Let, Minus, Not_Equals, Plus, Return, Right_Brace, Right_Parenthesis, Semicolon, True, } Asterisk :: struct {} Bang :: struct {} Comma :: struct {} EOF :: struct {} Else :: struct {} Equal_Sign :: struct {} Equals :: struct {} False :: struct {} Forward_Slash :: struct {} Function :: struct {} Greater_Than :: struct {} Identifier :: struct { literal: string, } If :: struct {} Illegal :: struct {} Integer :: struct { literal: int, } Left_Brace :: struct {} Left_Parenthesis :: struct {} Less_Than :: struct {} Let :: struct {} Minus :: struct {} Not_Equals :: struct {} Plus :: struct {} Return :: struct {} Right_Brace :: struct {} Right_Parenthesis :: struct {} Semicolon :: struct {} True :: struct {} lookup_identifier :: proc(ident: string) -> Token { switch ident { case "fn": return Function{} case "let": return Let{} case "if": return If{} case "else": return Else{} case "true": return True{} case "false": return False{} case "return": return Return{} case: return Identifier{ident} } } literal :: proc(token: Token) -> (literal: string) { switch t in token { case Asterisk: literal = "*" case Bang: literal = "!" case Comma: literal = "," case EOF: literal = "EOF" case Else: literal = "else" case Equal_Sign: literal = "=" case Equals: literal = "==" case False: literal = "false" case Forward_Slash: literal = "/" case Function: literal = "fn" case Greater_Than: literal = ">" case Identifier: literal = t.literal case If: literal = "if" case Illegal: literal = "ILLEGAL" case Integer: literal = fmt.tprint(t.literal) case Left_Brace: literal = "{" case Left_Parenthesis: literal = "(" case Less_Than: literal = "<" case Let: literal = "let" case Minus: literal = "-" case Not_Equals: literal = "!=" case Plus: literal = "+" case Return: literal = "return" case Right_Brace: literal = "}" case Right_Parenthesis: literal = ")" case Semicolon: literal = ";" case True: literal = "true" } return literal }