Fork me on GitHub

PEGTL规则

PEG(Parsing Expression Grammar),翻译为解析表达文法。按照WIKI给出的描述,一个解析表达文法由以下部分组成:

  • 一个有限的非终结符的集合 N
  • 一个有限的终结符的集合 Σ,和 N 没有交集
  • 一个有限的解析规则的集合 P
  • 一个被称作开始表达式的解析表达式 eS

P 中的每一个解析规则以 A ← e 的形式出现,这里 A 是一个非终结符,e 是一个解析表达式。解析表达式是类似正则表达式的层次表达式:

  1. 原子解析表达式由以下组成:
    • 任何的终结符,
    • 任何的非终结符,
    • 空字符串 ε.
  2. 给定已经存在的解析表达式 ee1 和 e2, 一个新的解析表达式可以通过以下操作构成:
    • 序列: e1 e2
    • 有序选择: e1 / e2
    • 零个或更多: e*
    • 一个或更多: e+
    • 可选: e?
    • 肯定断言: &e
    • 否定断言: !e

在实际应用中,可以利用已有的库来实现我们自己的语法解析功能。pegjs是一个不错的在线实验平台,可以所见即所得的测试我们要定义的解析规则。

对于C++背景的开发者来说,比较好的选择是PEGTL。本文主要是记录PEGTL库的常用类及对应功能。

PEGTL的规则文档参考此处

 1. 基本规则:

  序列e1e2:seq< R... >

  有序选择e1 / e2sor< 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_max< Max, R... >

  rep_min< Min, R... >

  rep_min_max< Min, Max, R... >

  rep_opt< Num, R... >

  star_must< R, S... >

  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

posted @ 2020-12-06 00:22  webberg  阅读(789)  评论(0编辑  收藏  举报