| package ast |
| |
| import "matheval/token" |
| |
| // Node is the interface all AST nodes implement. |
| // The unexported marker method seals the interface — only types |
| // in this package can implement it. |
| type Node interface { |
| node() // sealed marker |
| } |
| |
| // NumberLit represents a numeric literal (e.g. 3.14). |
| type NumberLit struct { |
| Value float64 |
| } |
| |
| func (*NumberLit) node() {} |
| |
| // BinaryExpr represents a binary operation (e.g. 1 + 2). |
| type BinaryExpr struct { |
| Op token.Type // Plus, Minus, Star, Slash |
| Left Node |
| Right Node |
| } |
| |
| func (*BinaryExpr) node() {} |
| |
| // Ident represents a variable reference (e.g. x, y). |
| type Ident struct { |
| Name string |
| } |
| |
| func (*Ident) node() {} |
| |
| // FuncCall represents a function call (e.g. f(1, 2+3)). |
| type FuncCall struct { |
| Name string |
| Args []Node |
| } |
| |
| func (*FuncCall) node() {} |
| |
| // Statement is the interface for top-level REPL input. |
| // A line is either an expression to evaluate or a function definition. |
| // The unexported marker method seals the interface. |
| type Statement interface { |
| stmt() // sealed marker |
| } |
| |
| // ExprStmt wraps an expression as a top-level statement. |
| type ExprStmt struct { |
| Expr Node |
| } |
| |
| func (*ExprStmt) stmt() {} |
| |
| // FuncDef represents a function definition (e.g. f(x, y) = x + y). |
| type FuncDef struct { |
| Name string |
| Params []string |
| Body Node |
| } |
| |
| func (*FuncDef) stmt() {} |