55 lines
1.1 KiB
Go
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)
|
|
}
|