编译原理初探(五)

正则表达式


welcome

定义

  • 对给定的字符集∑={c1 , c2 , … , cn}
  • 归纳定义:
    • 空串∑是正则表达式
    • 对于任意c∈∑,c是正则表达式
    • 如果M和N是正则表达式,则以下也是正则表达式
      • 选择 M|N = {M,N}
      • 连接 MN = {mn| m∈M , n∈N}
      • 闭包 M* = {∑,M,MM,MMM,…}

对于给定的字符集∑={a,b},可以写出哪些正则表达式?

  1. {a,b} (空串∑是正则表达式)
  2. {a},{b} (对于任意c∈∑,c是正则表达式)
  3. {a,a},{b,b},{a,∑},{b,∑},{∑,∑} (选择)
  4. {∑a},{∑,b},{∑∑},{ab},…,{a(∑|a)} (连接)
  5. ,…, a(∑|a) (闭包)

关键字表示

正则表达式可以用来表示语法中的关键字

如 if
其中 i∈∑ 又 f∈∑
根据连接 if∈∑

标识符表示

C语言中的标识符:以字母或下划线开头,后跟零个或多个字母、数字或下划线
可以用正则表达式表示:

  1. (a|b|c|…|z|A|B|C|…|Z|_ ) (以字母或下划线开头)
  2. (a|b|c|…|z|A|B|C|…|Z|_|0|1|2|…|9 )* (后跟零个或多个字母、数字或下划线)

语法糖

  • 可以引入语法糖来简化正则表达式
    • [c1-cn] == c1|c2|…|cn
    • e+ == 一个或多个e
    • e? == 零个或一个e
    • “a“ == a自身,不是a的Kleen闭包
    • e{i,j} == i到j个e的连接
    • · == 除’\n’外的任意字符

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 定义
  2. 2. 关键字表示
  3. 3. 标识符表示
  4. 4. 语法糖