feat: better recursive descent

This commit is contained in:
2025-12-27 01:18:06 -05:00
parent e3629acb45
commit a05a63627e
13 changed files with 316 additions and 221 deletions

View File

@@ -1,36 +1,31 @@
package saccharine
import "strings"
import (
"strings"
type stringifyVisitor struct {
builder strings.Builder
"git.maximhutz.com/max/lambda/pkg/saccharine/ast"
)
type stringifyVisitor struct{}
func (v stringifyVisitor) VisitAtom(n *ast.Atom) string {
return n.Name
}
func (v *stringifyVisitor) VisitVariable(a *Variable) {
v.builder.WriteString(a.Name)
func (v stringifyVisitor) VisitAbstraction(n *ast.Abstraction) string {
return "\\" + strings.Join(n.Parameters, " ") + "." + ast.Visit(v, n.Body)
}
func (v *stringifyVisitor) VisitAbstraction(f *Abstraction) {
v.builder.WriteRune('\\')
v.builder.WriteString(strings.Join(f.Parameters, " "))
v.builder.WriteRune('.')
f.Body.Accept(v)
}
func (v stringifyVisitor) VisitApplication(n *ast.Application) string {
arguments := []string{ast.Visit(v, n.Abstraction)}
func (v *stringifyVisitor) VisitApplication(c *Application) {
v.builder.WriteRune('(')
c.Abstraction.Accept(v)
for _, argument := range c.Arguments {
v.builder.WriteRune(' ')
argument.Accept(v)
for _, argument := range n.Arguments {
arguments = append(arguments, ast.Visit(v, argument))
}
v.builder.WriteRune(')')
return "(" + strings.Join(arguments, " ") + ")"
}
func Stringify(n Node) string {
b := &stringifyVisitor{}
n.Accept(b)
return b.builder.String()
func Stringify(n ast.Expression) string {
return ast.Visit(&stringifyVisitor{}, n)
}