feat: tokenizer accepts braces, line terminator, and equal sign

This commit is contained in:
2025-12-27 19:52:18 -05:00
parent 0e185fbf41
commit c37e96770f
11 changed files with 107 additions and 61 deletions

View File

@@ -1,31 +1,39 @@
package saccharine
import (
"fmt"
"strings"
"git.maximhutz.com/max/lambda/pkg/saccharine/ast"
)
type stringifyVisitor struct{}
func (v stringifyVisitor) VisitAtom(n *ast.Atom) string {
func stringifyAtom(n *ast.Atom) string {
return n.Name
}
func (v stringifyVisitor) VisitAbstraction(n *ast.Abstraction) string {
return "\\" + strings.Join(n.Parameters, " ") + "." + ast.Visit(v, n.Body)
func stringifyAbstraction(n *ast.Abstraction) string {
return "\\" + strings.Join(n.Parameters, " ") + "." + Stringify(n.Body)
}
func (v stringifyVisitor) VisitApplication(n *ast.Application) string {
arguments := []string{ast.Visit(v, n.Abstraction)}
func stringifyApplication(n *ast.Application) string {
arguments := []string{Stringify(n.Abstraction)}
for _, argument := range n.Arguments {
arguments = append(arguments, ast.Visit(v, argument))
arguments = append(arguments, Stringify(argument))
}
return "(" + strings.Join(arguments, " ") + ")"
}
func Stringify(n ast.Expression) string {
return ast.Visit(&stringifyVisitor{}, n)
switch n := n.(type) {
case *ast.Atom:
return stringifyAtom(n)
case *ast.Abstraction:
return stringifyAbstraction(n)
case *ast.Application:
return stringifyApplication(n)
default:
panic(fmt.Errorf("unknown expression type: %v", n))
}
}