blob: 447adbecc19f333c0b9e2fc026d47117f4b2e7f4 [file] [log] [blame]
package evaluator
import (
"fmt"
"matheval/ast"
"matheval/token"
)
// Eval evaluates an AST node and returns the result.
// Returns an error on division by zero.
func Eval(node ast.Node) (float64, error) {
switch n := node.(type) {
case *ast.NumberLit:
return n.Value, nil
case *ast.BinaryExpr:
left, err := Eval(n.Left)
if err != nil {
return 0, err
}
right, err := Eval(n.Right)
if err != nil {
return 0, err
}
switch n.Op {
case token.Plus:
return left + right, nil
case token.Minus:
return left - right, nil
case token.Star:
return left * right, nil
case token.Slash:
if right == 0 {
return 0, fmt.Errorf("division by zero")
}
return left / right, nil
default:
return 0, fmt.Errorf("unknown operator: %v", n.Op)
}
default:
return 0, fmt.Errorf("unknown node type: %T", node)
}
}