目录
词法分析
(1)对输入的字符串形式的源程序按顺序进行扫描,识别输出具有独立意义的单词序列;
(2)检查源程序中的词法错误。
词法分析输出由单词内容和单词类别组成的内部表示序列。
单词
单词:指具有独立含义的最小的语义单位。
如何实现词法分析器
1.明确要分析的问题
2.利用形式化方法描述各类单词的词法规则
(1)正则表达式
(2)自动机
3.设计词法分析器
字母表和符号串
字母表
字母表是元素的非空有穷集合,通常用
Σ
\Sigma
Σ 表示。字母表中的一个元素称为该字母表的一个字母,符号,或者字符。
计算机都有一套字符集——包括能出现的所有符号
例如:
Σ
\Sigma
Σ = {a,b,c,d,…,A,B,…,Z} ,
Σ
\Sigma
Σ = {0,1,2,…,9} ,
Σ
\Sigma
Σ = ASCII ,
Σ
\Sigma
Σ = unicode
符号串
- 符号串是由字母表中的符号组成的任意有穷序列,又称 “字符串” 、“句子” ,一般用 α \alpha α, β \beta β , x , y , z 表示 。(一般不会用 a , b, c 这些字母来表示符号串,其一般代表单个字母)
- 符号串中字符的个数称为符号串长度,用 | α \alpha α| 表示符号串 α \alpha α 的长度。
- ϵ \epsilon ϵ 表示空串,| ϵ \epsilon ϵ| = 0 (没有任何字符);
- 符号串连接 例如: α \alpha α = abc , β \beta β = de , 则 α \alpha α 和 β \beta β 的连接 α \alpha α β \beta β = abcde , | α \alpha α β \beta β| = | α \alpha α| + | β \beta β| ; ϵ \epsilon ϵ α \alpha α = α \alpha α ϵ \epsilon ϵ = α \alpha α.
- 在没有空串的条件下 α \alpha α β \beta β ≠ β \beta β α \alpha α
- 字符串的方幂:设 x 是字母表上的符号串,把 x 自身连接 n 次得到的符号串 z ,称作符号串 x 的 n 次幂 , 记作 z = x n \ x^n xn 其中 x 0 \ x^0 x0 = ϵ \epsilon ϵ .
- 符号串集合:若集合A中的所有元素都是某字母表
Σ
\Sigma
Σ 上的符号串,则称A为该字母表上的符号串集合。(特意用大写字母来区分符号串与符号串集合)
- 符号串集合的乘积:设 A、B 是两个符号串集合,AB 表示 A 与 B 的乘积:AB = { xy | (x ∈ A \in A ∈A) ^ (y ∈ B \in B ∈B) } ,例如 A = { a , bc } , B = { de , f } , 则 AB = { ade , af , bcde , bcf }
- 符号串集合的方幂:设 A 为符号串集合 ,则称 A i \ A^i Ai 为 A 的方幂,其中 A 0 \ A^0 A0 = { ϵ \epsilon ϵ } , A 1 \ A^1 A1 = A , A 2 \ A^2 A2 = AA …
- 符号串集合的正闭包:A + \ ^+ + = A 1 \ ^1 1 ⋃ \bigcup ⋃ A 2 \ ^2 2 ⋃ \bigcup ⋃ A 3 \ ^3 3 ⋃ \bigcup ⋃ A 4 \ ^4 4 ⋃ \bigcup ⋃ … (元素无限个)
- 符号串集合的星闭包:A ∗ \ ^* ∗ = A 0 \ ^0 0 ⋃ \bigcup ⋃ A 1 \ ^1 1 ⋃ \bigcup ⋃ A 2 \ ^2 2 ⋃ \bigcup ⋃ A 3 \ ^3 3 ⋃ \bigcup ⋃ A 4 \ ^4 4 ⋃ \bigcup ⋃ … (元素无限个) 星闭包就包含空串了
以上是一些词法分析的基础概念,下面是单词的描述规则,即 怎样通过一个表达式来表示一系列单词,这就类似于函数的关系式,来表示自变量和因变量的关系
这里有两种方法:正则表达式和自动机
正则表达式
用来描述正则集的一种代数表达式——用事先定义好的一些特定字符,以及对这些特定字符进行组合运算,形成的一个 “规则字符串”,它只代表一种规则,它用来定义一类字符串的一种过滤逻辑(过滤掉不符合规则的符号串,输出符合规则的符号串)
所有符合正则表达式 r 所定义的规则(模式)的符号串集合,称为正则集或正规集,表示为 L( r) 。L( r) 也称为由 r 定义的语言。
正则表达式和正则集的递归定义
设 Σ \Sigma Σ 为字母表
- ϵ \epsilon ϵ 和 ∅ \emptyset ∅ 是 Σ \Sigma Σ 上的正则表达式,它们所表示的正则集分别为 L( ϵ \epsilon ϵ) = { ϵ \epsilon ϵ } , L( ∅ \emptyset ∅) = {}(正则表达式可以包含的特殊符号)
- 对任何 a ∈ \in ∈ Σ \Sigma Σ , a 是 Σ \Sigma Σ 上的正则表达式,它所表示的正则集 L(a) = {a},即单个字母组成的正则表达式表示的正则集含有的元素是该字母本身
- 若 r 和 s 都是
Σ
\Sigma
Σ 上的正则表达式,它们所表示的正则集分别为 L( r) 和 L( s) (运算)
- ( r ) 也是 Σ \Sigma Σ 上的正则表达式,表示的正则集 L(( r)) = L( r)
- r | s 也是 Σ \Sigma Σ 上的正则表达式,表示的正则集 L( r | s ) = L( r) ⋃ \bigcup ⋃ L(s)
- r ⋅ \cdot ⋅ s 也是 Σ \Sigma Σ 上的正则表达式,表示的正则集 L( r ⋅ \cdot ⋅ s ) = L( r) L(s)
- r ∗ \ ^* ∗ 也是 Σ \Sigma Σ 上的正则表达式,表示的正则集 L( r ∗ \ ^* ∗ ) = ( L( r) ) ∗ \ ^* ∗
- r
+
\ ^+
+ 也是
Σ
\Sigma
Σ 上的正则表达式,表示的正则集 L( r
+
\ ^+
+ ) = ( L( r) )
+
\ ^+
+
优先级:括号()> * 运算 > ⋅ \cdot ⋅ 运算 > | 或运算
有限次使用上述三条规则构成的表达式称为 Σ \Sigma Σ 上的正则表达式,表示的字符串集合称为 Σ \Sigma Σ 上的正则集或正规集。
正则表达式的性质
1.交换律:A | B = B | A
2.结合律:A | B | C = ( A | B ) | C = A | ( B | C ) ;A B C = ( A B ) C = A ( B C )
3.分配律:A ( B | C ) = A B | A C ;( A | B )C = A C | B C
4.幂等律:A
∗
\ ^*
∗
∗
\ ^*
∗ = A
∗
\ ^*
∗
5.同一律:A
ϵ
\epsilon
ϵ =
ϵ
\epsilon
ϵ A = A
正则表达式示例:
设 D = 0 | 1 | 2 | … | 9,D表示一位数字 ;D
+
\ ^+
+ 表示允许0前导的整数
设D
1
\ _1
1 = 1 | 2 | … | 9,则 ( + D
1
\ _1
1D
∗
\ ^*
∗)|( - D
1
\ _1
1D
∗
\ ^*
∗)| 0 表示有符号整数
词法分析中的单词描述
- 保留字:while | if | for | …
- 标识符:L ( L | D ) ∗ \ ^* ∗,其中 L = A | B | … | Z | a | b | … | z | _ ; D = 0 | 1 | 2 | … | 9
- 常数
- 整数:( + | - | ϵ \epsilon ϵ ) ( D 1 \ _1 1D ∗ \ ^* ∗) | 0 ;
- 实数:( + | - | ϵ \epsilon ϵ ) ( D 1 \ _1 1D ∗ \ ^* ∗ | 0) . D + \ ^+ +
- 特殊符号
- 运算符:+ | - | * | …
- 分界符:{ | } | ; | …
- 控制符:\t | \n | …
正则表达式方便描述单词的构成,但不利于程序实现,下面介绍另一种描述单词的方式——自动机
有限自动机
有限自动机FA作为一种识别装置,它能准确识别正规集。引入FA这个理论,正是为词法分析程序的自动构造寻找一种特殊的方法和工具。
它有两类:DFA(确定有限自动机);NFA(非确定有限自动机)
确定有限自动机 DFA
确定有限自动机 M 为一个五元组:M = ( S ,
Σ
\Sigma
Σ , S
0
\ _0
0 , f , Z ) , 其中:
S 是一个有穷状态集,它的每个元素称为一个状态;
Σ
\Sigma
Σ 是一个有穷字母表,它的每个元素称为一个输入字符;
S
0
\ _0
0
∈
\in
∈S,是唯一的一个初始状态(开始状态);
f 是状态转换函数:S
×
\times
×
Σ
\Sigma
Σ
→
\rightarrow
→ S,且单值函数 f ( S
i
\ _i
i, a ) = S
k
\ _k
k 表示当前状态为 S
i
\ _i
i,遇到输入字符 a 时,自动机将唯一地转换到状态 S
k
\ _k
k,称 S
k
\ _k
k 为 S
i
\ _i
i 的一个后继状态;
Z
⊂
\subset
⊂ S,是终止状态集,其中的每个元素称为终止状态(可接受状态、结束状态).
DFA的两种表示方式
- 状态转换图:用有向图表示自动机,比较直观,易于理解;
- 状态转换矩阵:用二维数组描述自动机,易于程序的自动实现;
状态转换图:用有向图表示自动机
结点:表示状态
- 开始状态:如下图左边的圈A,用一个无源箭头指向的⚪表示;
- 终止状态:如下图右边的圈A,用一个同心圆表示;
- 非终止状态:一个圆
边:表示状态转换函数,如下所示,对于最左边的两条边 f( A ,0 ) = B(表示状态 A 遇到字符 0 会自动转换到状态 B),f ( A ,1) = C
状态转换矩阵
用二维数组描述DFA
与上图等价的状态转换矩阵如下:
0 | 1 | |
---|---|---|
A 0 \ _0 0 + \ ^+ + | B | C |
B | - | A |
C | A | - |
A ∗ \ ^* ∗ | B | C |
初始状态:一般约定,第一行表示开始状态,或在右上角标注 “+”
终止状态:右上角标有 “*” 或 “-”
陷阱状态:无论接收什么字符,经过多少次状态转换,都无法转换为结束状态的状态,也称为错误状态。
DFA的确定性
- 初始状态唯一;
- 状态转换函数 f :f 是一个单值函数,对任何状态 s ∈ \in ∈ S,和输入符号 a ∈ \in ∈ Σ \Sigma Σ,f ( s , a ) 值唯一,即唯一地确定了下一个后继状态;
- 没有输入为 ϵ \epsilon ϵ 空边,即不接受没有任何输入就进行状态转换的情况。
DFA接受的字符串
对于
Σ
\Sigma
Σ 中的任何字符串 a
1
\ _1
1a
2
\ _2
2…a
n
\ _n
n,若在DFA M中存在一条从初始结点到某一终止结点的路径,且这条路上所有弧上的标记符连接成的字符串等于 a
1
\ _1
1a
2
\ _2
2…a
n
\ _n
n,则称该字符串可为DFA M所接受(识别)。(也可以途中经过结束状态,最终回到结束状态)
注意:若初始状态也是终止状态,那么
ϵ
\epsilon
ϵ 也是该DFA可接受的字符串.
DFA M所能接受的字符串的全体,称为DFA M接受(识别)的语言,记为L(M).
DFA的特性:内部有几个确定的状态,可以接受外界信息并根据信息的输入来改变自己的动作和状态以适应外界的变化。
例题: 设计DFA以识别所有能被3整除的二进制数集合
DFA描述单词
- 标识符的描述:L表示所有字母与下划线——L=a|b|…|z|A|…|Z|_;D表示数字——D=0|1|…|9;