37.1 PEX 定义

解析表达式可以使用以下语法定义:

(and e1 e2…)

必须全部匹配的一组 PEX 序列。and 形式是可选且隐式的。

(or e1 e2…)

带优先级的选择,与 Elisp 中类似,选择项会按顺序尝试, 并使用第一个成功的匹配。注意这与上下文无关文法不同, 后者在多个匹配间的选择是不确定的。

(any)

匹配任意单个字符,等同于正则表达式 “.”。

string

字面量字符串。

(char c)

单个字符 c,以 Elisp 字符字面量形式表示。

(* e)

表达式 e 的零次或多次出现,等同于正则表达式 ‘*’。 匹配始终为 “贪婪(greedy)” 模式。

(+ e)

表达式 e 的一次或多次出现,等同于正则表达式 ‘+’。 匹配始终为 “贪婪(greedy)” 模式。

(opt e)

表达式 e 的零次或一次出现,等同于正则表达式 ‘?’。

symbol

代表先前定义的 PEG 规则的符号。

(range ch1 ch2)

ch1ch2 的字符范围, 等同于正则表达式 ‘[ch1-ch2]’。

[ch1-ch2 "+*" ?x]

字符集,可以包含范围、字符字面量或字符字符串。

[ascii cntrl]

具名字符类列表。

(syntax-class name)

单个语法类。

(funcall e args…)

使用参数 args 调用 PEX e (先前通过 define-peg-rule 定义)。

(null)

空字符串。

以下表达式用作锚点或测试——它们不会移动点位置, 但会返回布尔值,可用于约束匹配,从而控制解析过程(see 编写 PEG 规则)。

(bob)

缓冲区开头。

(eob)

缓冲区结尾。

(bol)

行首。

(eol)

行尾。

(bow)

词首。

(eow)

词尾。

(bos)

符号首。

(eos)

符号尾

(if e)

如果从点位置解析 PEX e 成功则返回非 nil(点位置不移动)。

(not e)

如果从点位置解析 PEX e 失败则返回非 nil(点位置不移动)。

(guard exp)

将 Lisp 表达式 exp 的值视为布尔值。

字符类匹配可以引用 peg-char-classes 中命名的类, 等同于正则表达式中的字符类(see Character Classes)。