编译原理(清华大学版)第三章
第三章 词法分析
正规式、正规文法
设\(G=(V_N,V_T,P,S)\),如果P中每一个产生式的形式都是\(A\rightarrow aB\)或\(A\rightarrow a\),其中\(A,B\)都是非终结符,\(a\in V_T^*\),则是3型或正规文法。
- 正规文法所描述的是\(V_T\)上的正规集,即通过\(V_N,V_T,P,S\)来表示。
- 正规式也称正则表达式。通过符号的有序连接来表示。
正规式递归定义:
设字母表为\(\sum\),辅助字母表\(\sum ’=\{\varnothing,\epsilon ,|,.,*,(,) \}\)。
- \(\epsilon\)和\(\varnothing\)都是\(\sum\)上的正规式,它们表示的正规集分别为\(\{\epsilon\}\)和\(\varnothing\)。
- 任何\(a\in \sum,a\)都是\(\sum\)上的一个正规式,表示的正规集为\(\{a\}\)。
- 假定\(e_1\)和\(e_2\)都是\(\sum\)上的正规式,他们表示的正规集分别为\(L(e_1),L(e_2)\),那么\((e_1)、(e_1|e_2)、e_1*e_2、e_1^*\)也都是正规式,表示的正规集为\(L(e_1)、L(e_1)\cup L(e_2)、L(e_1)L(e_2)、(L(e_1))^*\)。
- 仅由有限次使用上述三个步骤而定义的表达式才是\(\sum\)上的正规式,仅由这些正规式所表示的符号串的集合才是\(\sum\)上的正规集。
正规式符合的代数规律
-
\[r|s = s|r \space\space 或的交换律 \]
-
\[r|(s|t)=(r|s)|t \space\space 或的可结合律 \]
-
\[(rs)t=r(st)\space\space 连接的可结合律 \]
-
\[r(s|t)=rs|rt,(s|t)r=sr|tr \space\space 分配律 \]
-
\[\epsilon r= r,r\epsilon=r\space\space \epsilon为恒等元素 \]
-
\[r|r=r \space\space 或的抽取律 \]
正规式和正规文法的等价性
-
将正规式转换为正规文法
重点是两个基本正规式产生式:
-
\[形如A\rightarrow x^*y的正规式产生式重写为 \\ A\rightarrow xB \\ A\rightarrow y\\ B\rightarrow xB\\ B\rightarrow y \]
-
\[形如A\rightarrow x|y正规式产生式,重写为\\ A\rightarrow x \\ A\rightarrow y \]
-
-
将正规文法转换为正规式
规则 | 文法产生式 | 正规式 |
---|---|---|
规则 1 | \(A\rightarrow xB\space\space B\rightarrow y\) | \(A=xy\) |
规则 2 | \(A\rightarrow xA|y\) | \(A\rightarrow x^*y\) |
规则 3 | \(A\rightarrow x \space\space A\rightarrow y\) | $A\rightarrow x|y $ |
有穷自动机
作用:识别正规集,识别正规文法定义的语言和正规式表示的集合。
分类:
- 确定的有穷自动机DFA
- 不确定的有穷自动机NFA
确定的有穷自动机
定义:是一个五元组
\[M=(K,\sum,f,S,Z)
\]
- \(K\)是一个有穷集,每一个元素称为一个状态。
- \(\sum\)是一个有穷字母表,每个元素称为一个输入符号,也称为输入符号表。
- \(f\)是转换函数,是\(K\times \sum \rightarrow K\)上的映像。
- \(S\in K\),是唯一的一个初态。
- \(Z\subseteq K\),是一个终态集,也称之为接收状态或结束状态。
可接受的定义
-
对于\(\sum ^*\)中的任意符号串\(t\),若存在一条从初态节点到某一终态节点的道路,且这条路上所有的弧的标记符连接成的符号串等于\(t\),则称\(t\)可为\(DFA\space M\)所接受,若\(M\)的初态节点同时又是终态节点,则空字可为\(M\)所识别(接受)。
-
若\(t\in \sum^*,f(S,t)=P\),其中\(S\)为\(DFA\space M\)的开始状态,\(P\in Z\),\(Z\)是终态集。则称\(t\)可为\(DFA\space M\)所接受。
拓展:
设\(Q\in K\),函数\(f(Q,\epsilon)=Q\)。(如果输入符号是空串,则停留在原来的状态上)
一个输入符号串\(t\)(将它改写为\(t_1t_x\)的形式,其中\(t_1\in \sum\),\(t_x\in \sum^*\)),在\(DFA\space\space M\)上运行的定义为:
\[f(Q,t_1t_x)=f(f(Q,t_1),t_x)
\]
考点:证明某某字符串是可接受的。
不确定的有穷自动机
定义:是一个五元组
\[M=(K,\sum,f,S,Z)
\]
- \(K\)是一个有穷集,每一个元素称为一个状态。
- \(\sum\)是一个有穷字母表,每个元素称为一个输入符号,也称为输入符号表。
- \(f\)是转换函数,是\(K\times \sum^*\) 到 \(K\)的全体子集的映像,即\(K\times \sum^*\rightarrow 2^K\),其中\(2^K\)表示\(K\)的幂集。
- \(S\in K\),是非空初态集。
- \(Z\subseteq K\),是一个终态集,也称之为接收状态或结束状态。