7 Commits

Author SHA1 Message Date
a3d5c0ac68
feat(parser): implement full statement parsing and control flow logic
Signed-off-by: erick-alcachofa <erick@artichoke.dev>

Complete the transition from a declarations-only parser to a functional
imperative parser. This commit introduces the implementation for all
major statement types, loop constructs, and core control flow logic.

- **Match Case Update**: Updated `grammar.ebnf` to use pipe delimiters
  `|id|` for unwrapped variables in match cases, replacing the previous
  parenthetical syntax.
- **Labels**: Implemented loop labeling using the `ident := loop`
  syntax. Labels are validated to ensure they only prefix valid loop
  constructs.
- **Labels and Ranges**: Standardized the use of the `:=` operator for
  both loop labels (`label := loop`) and range-for declarations (`let i
  := range`).

- **Conditional Branches**:
    - Fully implemented `if` and `else` statements.
    - Added support for optional variable unwrapping (e.g., `if (expr)
      |val|`).
    - Supported `else if` chaining by recursively parsing if-statements
      within else-branches.
- **Loops**:
    - **C-Style For**: Implemented `for (init; cond; post)` with
      optional initializers and post-loop expressions.
    - **Range For**: Implemented `for (let i := range)` with mutability
      controls.
    - **While & Do-While**: Implemented standard condition-based loops.
    - **Infinite Loop**: Added the explicit `loop` keyword for infinite
      iteration.
    - **Loop Dispatch**: Added a lookahead mechanism in
      `parseForLoopStatement` to differentiate between C-style and
      Range-style loops based on token positioning.

- **Variables**: Implemented `let`/`def` parsing within local scopes,
  including type annotations and initializers.
- **Defer Logic**: Implemented `defer` and `errdefer` for scope-guarded
  execution.
- **Jumps**: Implemented `break`, `continue` (with optional label
  targets), and `return` (with optional expressions).
- **Match & Switch**: Fully implemented branch parsing, with possible
  default cases via the `_` (underscore) keyword.

- **Expression Integration**: Stubbed `parseExpression` in a new
  `Expressions.cpp` to serve as the integration point for value parsing.
- **OverloadSet**: Integrated `OverloadSet` utility in `Statements.cpp`
  to cleanly handle AST node variant visitation for label injection.
- **Error Handling**: Standardized error reporting across all new paths
  using `langException`, providing specific "expected" messages for
  delimiters and keywords.
2025-12-25 23:27:06 -06:00
923b8d7e2d
refactor(parser): move parser utility methods to source file
Signed-off-by: erick-alcachofa <erick@artichoke.dev>

Relocate core parsing utility methods from the header to the
implementation file to reduce header bloat and improve compilation
times.

- **Parser API**: Moved the definitions of `consume()`,
  `matchAndConsume()`, and `match()` from `Parser.hpp` to `Parser.cpp`.
- **Cleanup**: Removed an unused `<print>` include in `Types.cpp`
  discovered during the refactor.
- **Organization**: Methods are now declared in the header and defined
  in the source file, maintaining a cleaner separation between interface
  and implementation.
2025-12-25 13:35:50 -06:00
b99f3586dc
chore(license): Added NOTICE header to all source files
Signed-off-by: erick-alcachofa <erick@artichoke.dev>
2025-12-25 13:12:41 -06:00
8911702c0d
refactor(parser): overhaul parsing logic and enhance error reporting
Signed-off-by: erick-alcachofa <erick@artichoke.dev>

Major refactoring of the Parser and Tokenizer components to improve code
maintainability, strengthen error messaging, and streamline AST
generation.

This version intentionally focuses on top-level declarations, with
statement parsing stubbed for the next development phase.

- **Path Sanitization**: Added `sanitizePath` to extract filenames from
  input paths, ensuring consistent `unitName` identification regardless
  of directory depth.
- **Improved Output**: Wrapped AST string output in Markdown code blocks
  and added a commented-out entry for the new DOT graph visualization.

- **Unified Consumption**: Replaced manual token checks with a more
  robust `consume()` method that leverages `peekExpect()` for
  centralized error handling.
- **New Predicates**: Introduced `match()` and `matchAndConsume()`
  helpers to handle optional tokens and branching logic without
  redundant peek/consume calls.
- **Exception Handling**: Standardized the use of `langException` across
  all parsing functions, providing more descriptive "Expected X, found
  Y" messages.

- **Declarations**: Refactored `parseTopLevelDeclaration` and
  sub-parsers (Module, Struct, Enum, Fn) to use the new matching
  patterns.
- **Looping Logic**: Replaced recursive-style parsing loops with
  `while(keepParsing)` iterative blocks to prevent stack depth issues
  and clarify termination conditions (e.g., finding a closing brace or
  failing to find a comma).
- **Namespaced Identifiers**: Rewrote `parseNamespacedIdentifier` to
  correctly handle multi-part paths (`A::B::C`) and edge cases.
- **Generic Support**: Improved handling of generic parameter and
  argument lists, ensuring strict enforcement of delimiters like `<` and
  `>`.

- **Contextual Errors**: Updated `peekExpect` to accept a custom
  `message` string, allowing the parser to describe *what* it was
  looking for (e.g., "Expected ';'").
- **Token Lookahead**: Enhanced `peek` and `peekExpect` reliability with
  better bounds checking and buffer management.

- **Removed `lib/src/Parser/AST/AST.cpp`**: Deleted the monolithic AST
  stringification file in favor of the previously introduced modular
  implementations.
- **Build System**: Updated `.gitignore` to ignore
  `cpm-package-lock.cmake`.
2025-12-25 11:41:08 -06:00
66eca2f24a
feat(Parser): Expanding parser capabilities (might clean later)
Signed-off-by: erick-alcachofa <erick@artichoke.dev>
2025-10-16 23:22:19 -06:00
552cda58e7
feat(Parser): Introduce AST toString and basic parser structure
Signed-off-by: erick-alcachofa <erick@artichoke.dev>

This commit introduces the foundational structure for the parser and
Abstract Syntax Tree (AST). It includes a new `Parser.hpp` header that
outlines the primary parsing functions for top-level declarations like
`modules`, `structs`, `enums`, and `functions`. It also adds a
`toString` function for the AST to aid in debugging and visualization.

The commit also updates the `Expected.hpp` utility by adding new error
codes like `ecUnexpectedToken`, `ecExpectedSemicolon`,
`ecImportInsideModule`, and `ecUnimplemented` to provide more granular
and descriptive parsing errors. The `Tokenizer` has been updated to use
these new, more specific exceptions.
2025-10-15 16:12:19 -06:00
0f4474821d
chore: Added CMake project setup
Added CMake files to set up project build, also added the file tree
structure of the project and clangd related settings
2025-03-04 12:50:53 -06:00