# `Aether.Reader.Grammar`
[🔗](https://github.com/joetjen/ichor/blob/v0.3.0/lib/aether/reader.ex#L33)

The CST `Aether.Reader.read/2` produces: grammar-wide pragmas plus
every token/rule definition in file order, each body an
`Aether.Reader.cst()` tree. `Aether.Eval.build/1` is the only
consumer.

# `def_t`

```elixir
@type def_t() ::
  {:token, atom(), Aether.Reader.cst(), Aether.Reader.pos()}
  | {:rule, atom(), Aether.Reader.cst(), Aether.Reader.pos()}
  | {:keywords, atom(), %{required(String.t()) =&gt; atom()}, Aether.Reader.pos()}
  | {:refine, atom(), String.t(), String.t(), [atom()], Aether.Reader.pos()}
```

# `t`

```elixir
@type t() :: %Aether.Reader.Grammar{
  case_insensitive: boolean(),
  defs: [def_t()],
  engine: :peg | :lr | :glr,
  file: String.t() | nil,
  name: String.t(),
  root: atom(),
  root_pos: Aether.Reader.pos(),
  skip_mode: :none | :default | {:custom, atom()},
  skip_pos: Aether.Reader.pos() | nil,
  source: String.t()
}
```

---

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