blob: 447adbecc19f333c0b9e2fc026d47117f4b2e7f4 [file] [log] [blame]
Sketch🕴️586f28e2026-02-28 19:14:46 +04001package evaluator
2
3import (
4 "fmt"
5 "matheval/ast"
6 "matheval/token"
7)
8
9// Eval evaluates an AST node and returns the result.
10// Returns an error on division by zero.
11func Eval(node ast.Node) (float64, error) {
12 switch n := node.(type) {
13 case *ast.NumberLit:
14 return n.Value, nil
15
16 case *ast.BinaryExpr:
17 left, err := Eval(n.Left)
18 if err != nil {
19 return 0, err
20 }
21 right, err := Eval(n.Right)
22 if err != nil {
23 return 0, err
24 }
25
26 switch n.Op {
27 case token.Plus:
28 return left + right, nil
29 case token.Minus:
30 return left - right, nil
31 case token.Star:
32 return left * right, nil
33 case token.Slash:
34 if right == 0 {
35 return 0, fmt.Errorf("division by zero")
36 }
37 return left / right, nil
38 default:
39 return 0, fmt.Errorf("unknown operator: %v", n.Op)
40 }
41
42 default:
43 return 0, fmt.Errorf("unknown node type: %T", node)
44 }
45}