扫描程序(scanner)
源程序的字符→记号(token)
-
C++源程序中以/开头的符号://、/=、/.../、/
-
字母开头的单词:关键字?标识符?
反应单词组成的表达式→正则表达式
正则表达式
用数学抽象的方法来表示单词串的组成
正则表达式r由它所匹配的串集来定义
L(r):串的集合
Σ:字母表,串的组成部分
正则表达式的定义
- 基本正则表达式
字母表中的单个字符且自身匹配
a是字母表Σ中的任一字符,则正则表达式a通过书写L(a)={a}来匹配a字符)
空串:epsilon,不包含任何字符的串
正则表达式运算:
-
选择,由元字符|表示;
-
连结,由并置表示,不用元字符;
-
重复或“闭包”,由元字符*表示
选择运算
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、...
优先级
*>连结>|