Signed-off-by: erick-alcachofa <erick@artichoke.dev>
This commit addresses several critical issues in the recursive descent
parser, specifically regarding the handling of empty constructs,
statement termination, and AST representation of nested scopes. These
changes bring the implementation in line with the Artichoke EBNF
specification.
* **CodeBlock as Statement:** Added `CodeBlockStmtNode` to the
`StatementNode` variant. This allows a bare `{}` to be treated as a
valid statement, enabling manual scoping within functions.
* **Visitor Support:** Updated `toDot.cpp` (Graphviz) and `toString.cpp`
(Pretty-print) to support the new `CodeBlockStmtNode` during AST
traversal.
* **Empty Member Lists:** Implemented a pre-loop check for the closing
brace `}` in `parseStruct` and `parseEnum`. This prevents the parser
from attempting to parse members in empty declarations (e.g., `struct
Empty {}`).
* **Diagnostic Accuracy:** Enhanced the member-parsing loop to provide
better error context. If a member is not followed by a comma or a
closing brace, the parser now explicitly suggests `',' or '}'` as the
expected tokens.
* **Nested Scopes:** The parser now correctly identifies a `{` at the
start of a statement and dispatches to `parseCodeBlock`.
* **Empty Code Blocks:** Added a guard in the block-parsing loop to
check for `}` immediately after `{`, allowing functions or nested
scopes to be empty.
* **C-Style For-Loops:** Replaced `match` with `matchAndConsume` for the
initialization semicolon. This allows the parser to correctly handle
loops where the initialization is omitted (e.g., `for (; 1; 1)`).
* **Correctness:** Resolves parser hangs or errors when encountering
empty blocks.
* **Compliance:** Fully supports the EBNF definition of zero-or-more
members/statements.
* **Visuals:** AST diagrams now accurately reflect nested block
structures.
⚠️ WIP Highly Experimental Project
- The language, compiler, and tools are under active development and may be very unstable.
- There will likely be breaking changes and periods where no work is done on the project.
The artichoke Programming Language
artichoke is a modern, statically-typed programming language designed to
satisfy my personal preferences and requirements for programming, combining the
low-level control and powerful modern features like a robust type system,
generics, integrated error handling, and a clean, ergonomic syntax.
The goal of artichoke is to provide a language that is simple, safe, and
productive for programming, eliminating common pitfalls without sacrificing
performance or control.
For a detailed guide to the language, please see the project wiki.
Core Philosophy & Features
artichoke is built around a few core principles to create a safer, more
productive programming experience:
- Explicitness: Type conversions and error handling are explicit.
- Safety: Non-nullable pointers, a robust type system, and deterministic resource management are prioritized.
- Modern Ergonomics: Features like generics, defer, and a clean module system reduce boilerplate and improve readability.
The language includes a powerful generic type system, first-class error handling, a full suite of control flow statements (including match), a true module system, and compile-time reflection.
Project Status
artichoke is currently in the design and grammar-specification phase. The
grammar is stable, and the next step is the implementation of a compiler
(parser, semantic analyzer, and code generator).
Building from Source
# Get the source code
git clone https://git.artichoke.dev/me/artichoke-lang.git
# Configure cmake
# Optionally add -DENABLE_TESTING=ON for building tests
cmake -DCMAKE_BUILD_TYPE=Release -S . -B build
# Build the project
cmake --build build
# Run the binary
./build/frontend/artichoke-c
# Run the tests if enabled
ctest --test-dir build/tests --output-on-failure
# Install if wanted
cmake --install build --prefix=/usr/local
# Run the installed binary
arti-c
Contributing
The artichoke project is hosted on a personal, self-hosted Gitea instance. If
you are interested in contributing, you have two options:
- Request an Account: Please contact support@artichoke.dev to request an account on the Gitea instance.
- Submit Patches: Alternatively, you can send patches or diffs directly to the same email address.
In all cases, proper attribution will be given for your contributions in the source files and/or the project wiki.
License
This project is licensed under the GNU Affero General Public License v3.0. The full license text can be found in the LICENSE file in this repository.