| # matheval |
| |
| A math expression evaluator with an interactive REPL, written in Go. |
| |
| ## Features |
| |
| - Arithmetic operators: `+`, `-`, `*`, `/` |
| - Parentheses for grouping |
| - Floating point numbers (including `.5` syntax) |
| - Correct operator precedence (`*` and `/` bind tighter than `+` and `-`) |
| - Left-to-right associativity |
| - Clear error messages with position reporting |
| |
| ## Build |
| |
| ```sh |
| go build -o matheval ./cmd/matheval |
| ``` |
| |
| ## Usage |
| |
| Run the REPL: |
| |
| ```sh |
| ./matheval |
| ``` |
| |
| Then type expressions: |
| |
| ``` |
| >> 2 + 3 * 4 |
| 14 |
| >> (2 + 3) * 4 |
| 20 |
| >> 7 / 2 |
| 3.5 |
| >> 1 / 0 |
| error: division by zero |
| ``` |
| |
| Press `Ctrl+D` (EOF) to exit. |
| |
| You can also pipe input: |
| |
| ```sh |
| echo "2 + 3" | ./matheval |
| ``` |
| |
| ## Architecture |
| |
| ``` |
| Input string → Lexer → Parser → AST → Evaluator → Result |
| ``` |
| |
| | Package | Responsibility | |
| |-------------|---------------------------------------| |
| | `token` | Token types and data structures | |
| | `lexer` | Tokenizes input string | |
| | `ast` | AST node types (`NumberLit`, `BinaryExpr`) | |
| | `parser` | Recursive-descent parser | |
| | `evaluator` | Walks AST and computes result | |
| | `repl` | Read-eval-print loop | |
| |
| ## Grammar |
| |
| ``` |
| expr → term (('+' | '-') term)* |
| term → factor (('*' | '/') factor)* |
| factor → NUMBER | '(' expr ')' |
| ``` |
| |
| ## Tests |
| |
| ```sh |
| go test ./... |
| ``` |
| |
| This runs unit tests for each package plus integration tests covering the full pipeline. |