package main

import (
	"fmt"
)

func rpn(expr Expr) string {
	switch e := expr.(type) {
	case Binary:
		return rpn(e.left) + " " + rpn(e.right) + " " + e.operator.Lexeme
	case Grouping:
		return rpn(e.expression) // + " group"    arguable if this is even wanted
	case Literal:
		if e.value == nil {
			return "nil"
		}
		return fmt.Sprintf("%v", e.value)
	case Unary:
		return rpn(e.right) + fmt.Sprintf(" %v", e.operator.Lexeme)
	}
	return "ERROR: reached impossible branch in print function"
}