接上篇 :【编译原理】01引论
词法分析是编译过程中将字符流转换成为符号流的一个工作阶段,是编译的第一步工作,其后续工作是语法分析。
词法分析的输入是源代码; 词法分析的输出是符号流; 词法分析需要识别词法错误,即非法的符号、单词等等,但不识别语法错误。
1 词法分析器的作用
源程序由单词组成,单词是最小的语义单位。
词法分析器的功能:扫描源程序字符流 ,按照源语言的词法规则识别出各类单词符号,产生用于语法分析的记号序列。
词法分析器的辅助功能:跳过源程序中的注释和空白,把错误信息和源程序联系起来(错误定位),宏预处理。
1.1词法分析器的工作方式
1.1.1、词法分析器与语法分析器的关系
1. 词法分析器作为语法分析器的子程序
2. 词法分析器作为独立的一遍
3. 词法分析器与语法分析器作为协同程序
1.1.2、分离词法分析器的好处
可以简化设计
可以改进编译器的效率
可以加强编译器的可移植性
2.1记号、模式与单词
记号:是指某一类单词符号的种别编码,如标识符的记号为id,数的记号为num等。(机内表示)
模式:是指某一类单词符号的构词规则,如标识符的模式是“由字母开头的字母数字串”。(构词规则)
单词:是指某一类单词符号的一个特例,如position是标识符。(外部表示)
2.1.1 词法分析器的输出:记号
记号的种类:
关键字:for, while, if等;
标识符:position,rate等;
常数:60
特殊符号: 算符:+-*/等; 分隔符:分号,空格,引号等等;
记号的属性:
词法分析器在识别出一个记号后,要把与之有关的信息作为它的属性保留下来,记号的属性是指记号的特征或特性。
记号影响语法分析的决策,属性影响记号的翻译
在词法分析阶段,对记号只能确定一种属性 (关键字:一字一种或全体一种; 标识符:一般统归一种,也可分为若干种 ;常数:一般统归一种,也可按类型分种; 运算符:一符一种或一类一种; 分界符:一般用一符一种)
2.1.2 输入的基本单位:单词
一个被编译的源代码,以字符串的形式输入到词法分析器中,词法分析器的处理单位是“单词”。
每一个单词对应于词法分析的最终输出 ;单词的不同的构成方式,将产生不同的记号及属性; 注意“单词”还包括程序中的各种特殊符号等。
2.1.3 识别单词的规则:模式
如何判定一个单词的类型,以及该单词所对应的记号的相关属性,需要通过规则进行区别,这个规则就是模式。
历史上存在过一些词法模式,对词法分析造成了很大的困难; 形式化描述的词法模式具有严谨、准确的特性; 当前,程序设计语言的词法模式通常使用正规表达式来进行描述;
2.2 模式的形式化描述
字母表(alphabet): 字母表是符号的非空有穷集合,用∑表示
字符串/符号串/串(String): 符号串是由字母表中的符号所组成的有穷序列
符号串的长度 :符号串中包含符号的个数,串 s 的长度记为 |s|
前缀(prefix)、后缀(suffix)、子串(substring)
语言(Language): 某个字母表上的符号串的集合
2.3 串和语言
2.3.1 语言的运算
语言是符号串的集合,集合的运算有并、交、差等
并运算 — 两个集合的并; 交运算 — 两个集合的交; 差运算 — 两个集合的差;
并运算例如:集合A={ab,cde}, B={0,1} 则 A∪B={ ab,cde,0,1 }
交例如:集合A={ab,cde} B={0,1} 则 AB={ ab1,ab0,cde0,cde1 }
* 闭包(Kleene closure):0个或多个的连接 L* = L0∪L1∪L2∪L3∪…
+闭包(Positive closure):1个或多个的连接 L+ = L1∪L2∪L3∪…
L* = L+ ∪{ε}
例:Σ={a,b}
Σ*={ε,a,b,aa,ab,ba,bb,aaa,aab,…}
Σ+={a,b,aa,ab,ba,bb,aaa,aab,…}
综合性的例子: L = {A,B,C,…,Z,a,b,c,…,z} D = {0,1,…,9}
求:1. L ∪ D 2. LD 3. L4 4. L* 5. L(L ∪ D)* 6. D+
2.4 文法和语言的定义
语言的有穷表示有两个途经: 生成方式 (文法):语言中的每个句子可以用严格定义的规则来构造。识别方式(自动机):用一个过程,当输入的一任意串属于语言时,该过程经有限次计算后就会停止并回答“是”,若不属于,要么能停止并回答“不是”,(要么永远继续下去。)
文法 G 定义为四元组(VT,VN,S,P):
VT :终结符(terminals)集,其中的元素一般用小写字母或数字表示(a,b,c…0,1..),代表语言中不可再分的基本符号,如汉语中的汉字、C语言中的标识符。
VN :非终结符(nonterminals)集,其中的元素一般用大写字母表示(A,B,C…),或者用尖括号括起,代表语法单位,如汉语中的语句、段落,C语言中的语句、表达式、函数等。
S 是一个特殊的非终结符号,称为开始符号(start symbol) S 至少要在一条产生式中作为左部出现。
P是一个产生式(production)的集合 产生式(重写规则、生成式):形如α→β的(α,β)有序对,且α∈V+,β∈V* ,其中 V = (VT∪VN) α称为产生式的左部,不能为空ε β称为产生式的右部,可以为空ε(如:A → ε )。
例1:文法 G = (VT,VN,S,P)
VN = { S }
VT ={ 0, 1 }
P = { S→0S1, S→01 }
左部相同的产生式可以写在一起,如: S →0S1 | 01
3 正规表达式
3.1单词符号的描述
正规表达式是一个表示字符串格式的模式(pattern)。
可以用来描述单词符号的结构。
正规式(r)匹配的串集称为正规集(Regular Set),这是一个正规语言,记为L(r)
正规式的运算( | 、连接、*、+) —— 字符串集合(语言)的运算
正规式运算的优先级关系(*和+、连接、| ),可以省略(和) 例如(a)|((b)*(c))—— a|b*c
正规式的等价:不同算术表达式可以表示同一个数,如3+5、5+3、2+6等均表示8。不同正规式也可以表示同一个正规集,即正规式与正规集之间是多对一的关系。若正规式P和Q表示了同一个正规集,则称P和Q是等价的,记为P=Q。
例1 设字母表∑={a,b,c},则∑上的部分正规式和正规集如下:
正规式 对应正规集
a,b,c {a},{b},{c}
a|b , b|a {a}∪{b}={a,b}
a(a|b)* {a,aa,ab,aba,abb...},a为首的ab字符串
∑* {ε,a,b,c,aa,abc,...}
例2 令 L(x)={a,b},L(y)={c,d},
则 L(x|y)={a,b,c,d} , L(y|x)={a,b,c,d}
正规式的代数性质:
正规式的命名: di→ri 其中di为正规式ri的名字
简化正规式描述:
(a) 正闭包 : r+ = rr* = r*r,r* = r+|ε
(b) 可缺省 : r?=r|ε
(c) 字符组 : 枚举: [abc],它等价于a|b|c 分段: [0-9a-z]
(d) 非字符组 : 若 ∑={a, b, c, d, e, f, g}, 则 L([^abc]) = { d, e, f, g
例1、以01结尾的二进制数串 :(0|1)*01
例2、能被5整除的十进制整数: digit → [1-9] digits → digit(digit|0) * digits(5|0)|0
例3、不包含子串011的由01组成的符号串: 1*(01|0)*
例4、每个a后面至少紧随两个b的ab串 : (abb|b)*
例5、C的形如/*…*/的注释,其中…不包含*/的字符串: /*([^*]|*[^/])**/
例6、合法的日期表示有如下三种形式,请给出描述日期的正规式。
年.月.日,如1992.08.12
日 月 年,如12 08 1992
月/日/年,如08/12/1992
上篇:【编译原理】01引论
下篇:【编译原理】02词法分析(2)