feat: better recursive descent
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user