lox-go/ast/ast.go
2025-06-08 15:02:35 -04:00

55 lines
1.1 KiB
Go

package ast
import "git.red-panda.pet/pandaware/lox-go/lexer"
// todo: find something better than any here
// we can't use generics on either the visitor itself or
// each individual method because the adding it to the
// visitor itself infects every expr you use with it
// and methods cannot have generic parameters
type ExprVisitor interface {
VisitBinaryExpr(b *BinaryExpr) any
VisitGroupingExpr(g *GroupingExpr) any
VisitLiteralExpr(g *LiteralExpr) any
VisitUnaryExpr(g *UnaryExpr) any
}
type Expr interface {
accept(v ExprVisitor) any
}
type BinaryExpr struct {
Left Expr
Operator *lexer.Token
Right Expr
}
func (b *BinaryExpr) accept(v ExprVisitor) any {
return v.VisitBinaryExpr(b)
}
type GroupingExpr struct {
Expr Expr
}
func (g *GroupingExpr) accept(v ExprVisitor) any {
return v.VisitGroupingExpr(g)
}
type LiteralExpr struct {
Value any
}
func (l *LiteralExpr) accept(v ExprVisitor) any {
return v.VisitLiteralExpr(l)
}
type UnaryExpr struct {
Operator *lexer.Token
Right Expr
}
func (u *UnaryExpr) accept(v ExprVisitor) any {
return v.VisitUnaryExpr(u)
}