编译原理CHAP02

125 阅读1分钟

扫描程序(scanner)

源程序的字符→记号(token)

  1. C++源程序中以/开头的符号://、/=、/.../、/

  2. 字母开头的单词:关键字?标识符?

反应单词组成的表达式→正则表达式

正则表达式

用数学抽象的方法来表示单词串的组成

正则表达式r由它所匹配的串集来定义

L(r):串的集合

Σ:字母表,串的组成部分

正则表达式的定义
  1. 基本正则表达式

字母表中的单个字符且自身匹配

a是字母表Σ中的任一字符,则正则表达式a通过书写L(a)={a}来匹配a字符)

空串ϵ\epsilon:epsilon,不包含任何字符的串

正则表达式运算:

  1. 选择,由元字符|表示;

  2. 连结,由并置表示,不用元字符;

  3. 重复或“闭包”,由元字符*表示

选择运算

r|s,即可匹配被r或s匹配的任意串

L(a|ε)={a,ε}

L(a|b|c|d)={a,b,c,d}

a|b|...|z,表示匹配a到z的任何小写字母

连结运算

正则表达式ab,匹配ab

正则表达式(a|b)c,匹配串ac和bc

S1={aa,b},S2={a,bb}→S1S2={aaa,aabb,ba,bbb}

L((a|b)c)=L(a|b)L(c)={a,b}{c}={ac,bc}

重复,Kleene闭包(Kleene closure)

r*,r是一个正则表达式

正则表达式r*,匹配串的任意有穷连结,每个连结均匹配r

a*:\epsilon、a、aa、aaa、...

(a|bb)*:\epsilon、a、bb、aa、abb、bba、bbbb、aaa、aabb、...

优先级

*>连结>|