PEGTL规则
PEG(Parsing Expression Grammar),翻译为解析表达文法。按照WIKI给出的描述,一个解析表达文法由以下部分组成:
P 中的每一个解析规则以 A ← e 的形式出现,这里 A 是一个非终结符,e 是一个解析表达式。解析表达式是类似正则表达式的层次表达式:
- 原子解析表达式由以下组成:
- 任何的终结符,
- 任何的非终结符,
- 空字符串 ε.
- 给定已经存在的解析表达式 e, e1 和 e2, 一个新的解析表达式可以通过以下操作构成:
- 序列: e1 e2
- 有序选择: e1 / e2
- 零个或更多: e*
- 一个或更多: e+
- 可选: e?
- 肯定断言: &e
- 否定断言: !e
在实际应用中,可以利用已有的库来实现我们自己的语法解析功能。pegjs是一个不错的在线实验平台,可以所见即所得的测试我们要定义的解析规则。
对于C++背景的开发者来说,比较好的选择是PEGTL。本文主要是记录PEGTL库的常用类及对应功能。
PEGTL的规则文档参考此处
1. 基本规则:
序列e1e2:seq< R... >
有序选择e1 / e2:sor< R... >
零个或更多 e*:star< R... >
一个或更多 e+:plus< R... >
可选 e?:opt< R... >
肯定断言 &e:at< R... >
否定断言 !e:not_at< R... >
2. 其他内置常用规则:
action< A, R... >
: 等价seq,只是在匹配R时禁用A操作
control< C, R... >
:等价seq,只是使用C作为控制类
disable< R... >
:等价seq,只是禁用所有的action
discard
:
enable< R... >
:
require< Num >
:
state< S, R... >
:
if_must< R, S... >
:尝试匹配R,成功则must< S... >
if_must_else< R, S, T >
:
if_then_else< R, S, T >
:
list< R, S >
:
list< R, S, P >
:
list_must< R, S >
:
list_must< R, S, P >
:
list_tail< R, S >
:
list_tail< R, S, P >
:
minus< M, S >
:
must< R... >
:等价于seq,但是在失败时将R的局部错误转换为全局错误
opt_must< R, S... >
:
pad< R, S, T = S >
:
pad_opt< R, P >
:
rematch< R, S... >
:
rep< Num, R... >
:
rep_min< Min, R... >
:
rep_min_max< Min, Max, R... >
:
rep_opt< Num, R... >
:
try_catch< R... >
:
try_catch_type< E, R... >
:
until< R >
:消耗所有的输入,直到匹配R
until< R, S... >
:等价于seq< star< not_at< R >, S... >, R >
,(!R)* S, 一旦R不匹配,就匹配S序列
any
:
not_one< C... >
:
one< C... >
: C可以是一个unicode字符,当匹配成功时会消耗N个字节
string< C... >
:等价于seq< one< C >... >
eol
:匹配并消耗一个行结束符\r \n