# `Ichor.BNF.Actions`
[🔗](https://github.com/joetjen/ichor/blob/v0.3.0/lib/ichor/bnf/actions.ex#L1)

Turns a parsed classical BNF `grammar_file` into a real
`%{nonterminal_name_atom => Grammar.IR.expr()}` map -- one
`Grammar.IR` tree per rule, the same target category `Ichor.ABNF.Actions`
and `Regex.Actions` both use.

Classical BNF has no single citable standard; this follows the ALGOL
60 Report's own convention for everything except terminal symbols --
the strictest reading of the Report leaves those unquoted, distinguished
from nonterminals only by the reader already knowing the target
language's keyword set. This grammar quotes terminals instead
(`'lit'`/`"lit"`), matching how BNF is actually written in nearly
every modern presentation of it -- a deliberate deviation from the
Report's strictest reading, not an oversight.

Unlike ABNF (RFC 5234's rule names are explicitly case-insensitive),
classical BNF has no such spec-level rule -- nonterminal names are
kept exactly as written, not downcased.

Rules are separated by an explicit newline (`@skip`'s own token only
covers space/tab within one rule) -- `sequence := element+`'s own
greedy repetition can't otherwise tell "one more element of this
rule" apart from "the next rule's own opening nonterminal, on the
next line," since both parse identically as an `element`.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
