深入浅出词法分析(正则表达式)

基本概念

  • 词法分析器的主要任务:读入源程序的输入字符,将他们组成词素,生成并输出一个词法单元序列,每一个词法单元对应于一个词素。

词法分析器还要过滤源程序中的注释和空白和注释
还要将编译器生成的错误消息与源程序的位置联系起来

  • 词法分析器将其转为token的序列,语法分析器每次从词法分析器获得一个token,对不同的token的处理也不同
  • token词法:带有附加信息的字符串
  • lexeme词素:单纯的字符串
  • 关键字/保留字:预先指定的单词(程序语言的关键字如if else等)
  • 标识符:非关键字的以字母开头的字母或数字序列

语言

语言上的运算
深入浅出词法分析(正则表达式)
Kleene闭包与正闭包区别:正闭包不包含 L0L^{0} (空串)

例子
L为A-Z的字母串
M为0-9的数字串
L\cupM:包含36个字母或数字的串
LM:包含26×\times 10个长度为2的串(每个串都是一个字母跟一个数字)
LL^{\ast}:所有有字母构成的串的集合,包括空串ε\varepsilon
L4L^{4}:所有由四个字母构成的串的集合
L(LM)L (L \cup M)^{\ast}:所有以字母开头,字母和数字组成的串的集合

正则语言(Regular Language)

描述词素——正则表达式

  • ε\varepsilon是一个正则表达式,L(ε)={ε}L\left(\varepsilon \right)=\left\{\varepsilon \right\} ,该语言只包含空串
  • 如果aa\sum 上的一个符号,那么a是一个正则表达式,并且L(a)={aa}

aa是一个符号 a是正则表达式

  • 正则表达式与语言运算的对应
    深入浅出词法分析(正则表达式)

  • 正则表达式的运算级: \ast 》 连接运算符 》 |

  • 正则集合(正则表达书等价,与代数定律中的交换律,结合律相似)
    深入浅出词法分析(正则表达式)

正则定义( Regular Definition )

深入浅出词法分析(正则表达式)

简单来说就是将一些正则表达式命名为d1d_{1} , d2d_{2} 符号等等,然后由这些符号就构成的集合
例子——c语言的标识符
深入浅出词法分析(正则表达式)

正则表达式的扩展

  • 字符类:表示字母或数位时可以用连词符-缩写
    [abc]=a|b|c
    [a-z]=a|b|…|z
    [0-9]=0|1|…|9
  • ^:可表示非的意思
    \vartriangleright [^abc]表示匹配出a b 或c外的任意字符
  • ^在[ ]外表示匹配开头
    \vartriangleright ^ab表示匹配以ab开头的
  • $或\b表示匹配结尾
    \vartriangleright ab$ ,ab\b表示ab结尾的
  • i 表示忽略大小写
//两条斜线之间的是正则文体,表示匹配abc或者ABC
/^abc/i
  • g:正则一般匹配到第一个就结束,加上全局修复符可以匹配到结束
  • m 让^和$匹配行首和结尾 (\n)
  • \s表示匹配空白字符,包括空格,制表符,换页符等
  • 单目后缀运算符*: 匹配0-n次
  • 单目后缀运算符+:表示一个正则表达式及其语言的正闭包(不包含空串 ε\varepsilon) (匹配1-n次)
    LL^{\ast}= L+L ^{+} | ε\varepsilon
    L+L ^{+}= LLLL^{\ast}=LLL^{\ast}L (开头或者结尾有一个L 即不为空串)
  • 单目后缀运算符?:表示零个或一个出现(匹配0次或1次)非贪婪模式
    L?=LεL?=L| \varepsilon
  • {n}匹配n次
    \vartriangleright a{2}表示匹配aa
  • {m,n}表示匹配m到n次
    \vartriangleright a{1,3}表示匹配 a|aa|aaa
  • {m,}表示匹配mm-\infty
    \vartriangleright a{3,}表示匹配aaa…
  • 转义符\,引用的语法:\数字表示引用前面的第几个捕获分组
    \vartriangleright <(div)><\/\1>可以匹配 <div></div>
  • 不以ab字符串为开头的字符串,可以这样写^(?!ab)[a-z]+$