• 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:匹配并消耗一个行结束符

  • 相关阅读:
    洛谷P4547 [THUWC2017]随机二分图
    洛谷P4590 [TJOI2018]游园会
    洛谷P4099 [HEOI2013]SAO
    #4719. 内凸包
    #1612. 天平(scales)
    #3164. 「CEOI2019」立方填词
    #4728. 问题求解
    #2754. Count(count)
    sa模板
    bzoj 2553: [BeiJing2011]禁忌
  • 原文地址:https://www.cnblogs.com/webbery/p/14089771.html
Copyright © 2020-2023  润新知