| 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) |
| } |
| } |