package ast import "monkey/token" type Node interface { TokenLiteral() string } type Statement interface { Node statementNode() } type Expression interface { Node expressionNode() } type Program struct { Statements []Statement } func (p *Program) TokenLiteral() string { if len(p.Statements) > 0 { return p.Statements[0].TokenLiteral() } else { return "" } } type Identifier struct { Token token.Token // the token.Ident token Value string } type LetStatement struct { Token token.Token // the token.Let token Name *Identifier Value Expression } type ReturnStatement struct { Token token.Token // the 'return token ReturnValue Expression } func (ls *LetStatement) statementNode() { } func (ls *LetStatement) TokenLiteral() string { return ls.Token.Literal } func (i *Identifier) expressionNode() { } func (i *Identifier) TokenLiteral() string { return i.Token.Literal } func (i *ReturnStatement) statementNode() { } func (i *ReturnStatement) TokenLiteral() string { return i.Token.Literal }