package token import "fmt" // All tokens in the pseudo-lambda language. type Type int const ( OpenParen Type = iota // Denotes the '(' token. CloseParen // Denotes the ')' token. OpenBrace // Denotes the '{' token. CloseBrace // Denotes the '}' token. HardBreak // Denotes the ';' token. Assign // Denotes the ':=' token. Atom // Denotes an alpha-numeric variable. Slash // Denotes the '/' token. Dot // Denotes the '.' token. SoftBreak // Denotes a new-line. ) // A representation of a token in source code. type Token struct { Column int // Where the token begins in the source text. Type Type // What type the token is. Value string // The value of the token. } func NewOpenParen(column int) *Token { return &Token{Type: OpenParen, Column: column, Value: "("} } func NewCloseParen(column int) *Token { return &Token{Type: CloseParen, Column: column, Value: ")"} } func NewOpenBrace(column int) *Token { return &Token{Type: OpenBrace, Column: column, Value: "{"} } func NewCloseBrace(column int) *Token { return &Token{Type: CloseBrace, Column: column, Value: "}"} } func NewDot(column int) *Token { return &Token{Type: Dot, Column: column, Value: "."} } func NewHardBreak(column int) *Token { return &Token{Type: HardBreak, Column: column, Value: ";"} } func NewAssign(column int) *Token { return &Token{Type: Assign, Column: column, Value: ":="} } func NewSlash(column int) *Token { return &Token{Type: Slash, Column: column, Value: "\\"} } func NewAtom(name string, column int) *Token { return &Token{Type: Atom, Column: column, Value: name} } func NewSoftBreak(column int) *Token { return &Token{Type: SoftBreak, Column: column, Value: "\\n"} } func Name(typ Type) string { switch typ { case OpenParen: return "(" case CloseParen: return ")" case Slash: return "\\" case Dot: return "." case Atom: return "ATOM" case SoftBreak: return "\\n" case HardBreak: return ";" default: panic(fmt.Errorf("unknown token type %v", typ)) } } func (t Token) Name() string { return Name(t.Type) }