# GBNF 子集

[← 返回 README](../README.md)

一条文法可以有多条规则，用 `::=` 分开。**第一条规则是入口，不是名字叫 `root` 的那条。** 规则之间可以互相引用，编译时展开进现有的字节 DFA。成环会报错，包括间接引用，所以不支持递归规则。

```text
root  ::= "SELECT " cols " FROM " table
cols  ::= "*" | col (", " col){0,2}
col   ::= "id" | "name" | "age"
table ::= "users" | "orders"
```

## 语法

支持双引号字面量（转义只有 `\\`、`\"`、`\n`、`\r`、`\t`）、选择 `|`、分组 `(...)`，以及量词 `*`、`+`、`?`、`{n}`、`{n,m}`、`{n,}`。`#` 到行尾是注释。

字符类只接受单字节：`[abc]`、`[a-z]`、`[^abc]`、`[^a-z]`。`[^...]` 是 0 到 255 里没被列进去的那些字节。类里面 `\]`、`\\`、`\-` 是字面量；`-` 放在类的开头或结尾、或者不能构成区间时，也是字面量。倒过来的区间会报错。类里还可以写 `\n`、`\r`、`\t`。

## 不支持

递归规则、名字后面紧跟 `(` 的带参数规则、以及 `\p{...}` / `\P{...}` 这类 Unicode 属性，都会报错，不会被忽略。词法优先级也不支持。

## 怎么测的

固定文法经 DFA 采样得到的字符串，必须被同一文法的简单解释器接受。解释器和 DFA 用的是同一棵已展开的语法树，采样只覆盖自动机能在长度上限内生成的串。
