1.5 KiB
Grammar
bimr.bnf is a human-readable reference describing the BIMR language grammar in BNF notation. It is not consumed by the build — it documents the rules that the lexer and parser implement in code.
How the pipeline works
Lexer (lexer/src/lexer.rs) — powered by logos. The grammar is expressed directly as Rust attributes on the Token enum: regex patterns for identifiers, integers, and strings; literal patterns for punctuation (=, ,, (, )). logos generates the tokeniser at compile time — no external grammar file is involved.
Parser (parser/src/parser.rs) — powered by chumsky. Consumes the token stream produced by the lexer and builds an AST. The grammar rules map directly to parser combinators:
| BNF rule | Parser combinator |
|---|---|
program ::= statement* |
statement().repeated().collect() |
statement ::= identifier = expression |
identifier().then_ignore(just(Equal)).then(expression()) |
expression ::= function_call | identifier | integer | string |
choice((function_call, base_expr())) |
function_call ::= identifier ( arguments ) |
identifier().then(...).delimited_by(LeftParen, RightParen) |
arguments ::= expression (, expression)* |
base_expr().separated_by(just(Comma)) |
Summary
bimr.bnf serves as a concise spec to understand the language at a glance. The source of truth is the Rust code in lexer/ and parser/.