# `Aether.Parser`
[🔗](https://github.com/joetjen/ichor/blob/v0.3.0/lib/aether/parser.ex#L1)

Parses `.aether` source into a fully resolved `Aether.Grammar`, in two
stages: `Aether.Reader` (pure syntax -- a token/rule reference split,
pragmas, the expression grammar -- into a concrete syntax tree with no
desugaring) followed by `Aether.Eval` (that CST into `Grammar.IR`,
handling everything that needs whole-grammar context: predefined-token
override/use tracking, case-insensitivity, character-class/regex
desugaring, inline-literal promotion, `@skip` splicing, and final
`@root`/`@skip` validation).

This module is the combined convenience entry point -- same relationship
`run/1,2` has to `parse/1` on a generated grammar module, or `Grammar.VM`'s
own `run/4` has to `parse/2`.

# `parse`

```elixir
@spec parse(String.t(), String.t() | nil) ::
  {:ok, Aether.Grammar.t()} | {:error, Ichor.Error.t()}
```

Parses `source` into a fully compiled `Aether.Grammar`.

---

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