title: 编译原理(1)
date: 2018-09-13 18:28:37
tags: 编译原理
categories: 编译原理
词法分析。
词法分析任务:
从左至右扫描文本格式的源程序,从基于字符理解的源程序中分离出符合源语言词法的单词,最终转换成基于单词理解的源程序。
词法分析与语法分析的接口方式:
- 串行式:词法分析工作是独立的一遍,把字符流的源程序转换成单词流的内部程序形式,输入到一个中间文件,这个文件作为语法分析的输入而继续编译过程。
- 并行式:词法分析工作设计成一个子程序,每当语法分析程序需要一个单词时,则调用该子程序。这种方案词法分析程序与语法分析程序放在同一遍中,省掉了中间文件或存储区。
单词的形式化描述工具:
正规文法:
正规文法也称为3型文法,G=(Vn,Vt,S,P),其P中的每一条规则都有:A->aB或者A->a,其中A,B属于Vn,a属于Vt*。
正规式(正则表达式):
正规式e的计算值称为正规集,记为L(e)。
-
定义: 设字母表为Σ,辅助字母表为Σ‘={∅,ε,|,.,*,(,)}。
-
ε是∑上的正规式,L(ε)= {ε}
-
Ф是∑上的正规式,L(Ф)=Ф
-
任何a∈∑,a是∑上的正规式,L(a)= {a}
-
如果e1和e2是∑上的正规式,则
- (e1)是∑上的正规式,L((e1))=L(e1)
- e1**︱e2 是∑上的正规式,L(e1︱**e2)=L(e1)∪L(e2)
- e1 · e2 是∑上的正规式,L(e1· e2)=L(e1)·L(e2)
- e1* 是∑上的正规式,L(e1*)=L(e1)*
-
仅由有限次使用上述步骤定义的表达式才是Σ上的正规式,仅由这些正规式所表达的符号串的集合才是Σ上的正规集。
-
-
正规式服从的代数规律:
- “或”的交换律:r**︱s = s︱**r
- 结合律:
- 或:(r**︱s)︱t = r︱(s︱**t)
- 连接:(r·s)·t = r·(s·t)
- 分配律:
- r·(s**︱t)= r·s︱**r·t
- (s**︱t)·r = s·r︱**t·r
- 零律:εr =r,rε=r
- “或”的抽取律:r|r=r
-
正规式与正规文法之间转换:如果正规式r和文法G,有L®=L(G)则称正规式r和文法G是等价的。
-
正规式r→文法G转换方法:
设∑上正规式r,则等价文法G=(VN,VT,P,S)。其中,VT=∑;从形如产生式 S→r 开始,按表规则进行转换, 直到全部形如产生式, 符合正规文法之规则形式为止,可得到P和VN
规则1 A→xy A→xB,B→y 规则2 A→x*y A→xB, A→y,B→xB, B→y 规则3 A→x**︱**y A→x,A→y 注:A,B∈VN ,B为新增非终结符 -
正规文法转换成正规式:
规则1 A→xB, B→y A→xy 规则2 A→xA**︱**y A→x*y 规则3 A→x,A→ y A→x|y
-
有穷自动机:
-
确定有穷自动机(DFA):
-
M是一个五元组:M=(K,Σ,f,S,Z)。 其中:
- K是非空有穷集,每个元素称为状态;
- Σ是有穷字母表;
- f是K×Σ→K映射,称为状态转换函数;
- S∈K,称为开始状态;
- Z ⊂ K,称为结束状态集,或接受状态集。
-
对于Σ*中的任何符号串t,若存在一条从初态节点到某一终态节点的道路,且这条路上所有弧的标记符连接成的符号串等于t,则称t可为DFA M所接受,若M的初态节点同时又是终态终点,则空字可为M所接受。
-
设DFA M=(K,Σ,f,S,Z),如果α∈Σ*,f′(S,α)∈Z,则称符号串α是DFA M所接受(或识别)的。
-
转换函数:
-
转换函数f可以扩充为f′: K×Σ→K映射,并以f替代f′使用。设a∈Σ,β∈Σ,q∈K,即
-
-
-
不确定的有穷自动机(NFA):
- 一个不确定的有穷自动机NFA M是一个五元组:M=(K,Σ,f,S,Z)。其中:
- K是非空有穷集,每个元素称为状态;
- Σ是有穷字母表;
- f是K×Σ*到K的全体子集的映射;即K×Σ*->2K,其中2K表示K的幂集。
- S⊂K,称为开始状态集;
- Z⊂K,称为结束状态集,或接受状态集。
- 一个不确定的有穷自动机NFA M是一个五元组:M=(K,Σ,f,S,Z)。其中:
NFA转换成等价的DFA:
-
前提运算:
-
闭包运算:
-
设NFA M=(K,Σ,f,S,Z),I⊂K,则ε_closure(I)定义如下:
⑴ I ⊂ε_closure(I)
⑵ M(ε-closure(I),ε)⊂ε-closure(I)
⑶ 重复⑵,直到ε-closure(I),不再扩大为止。
-
状态集合I的ε-闭包,表示为ε-closure(I),定义为一个状态集,是状态集I中的任何状态S经任意条ε弧而到达的状态的全体。
-
-
映射运算:
- 设NFA M=(K,Σ,f,S,Z),I⊂K,a∈Σ∪{ε},则M(I,a)定义如下: M(I,a)= ∪ f(q,a),q ∈ I
- 状态集合I的a弧转换,表示为move(I,a),定义为状态集合J,其中J是所有那些可从I中的某一状态经过一条a弧而到达的状态的全体。
-
-
子集法:
-
设 NFA M=(K,Σ,f,S,Z)则与之等价的DFA M′=(K′,Σ′,f′,S′,Z′),其中,
- K′=ρ(K)(ρ(K)是K全部子集之集合称为K之幂集)
- Σ′=Σ
- f′(q,a)=ε-closure(M(q,a))
- S′=ε-closure(S)
- Z′={q**︱**q∈K′, q∩Z≠Φ}
-
构造算法:
- 置K′为空集;
- 计算M′的开始状态S′=ε_closure(S), S′作为K′新增状态;
- 对于K′每一新增状态q,计算出每个a∈Σ的转换状态p,即f′(q,a) =p=ε_closure(M(q,a))。如果p∉K′,则p作为K′新增状态;
- 重复③,直到K′不再出现新增状态为止;
- 计算接受状态集Z′={q**︱**q∈K′,q∩Z≠Φ}
-
确定有限自动机的化简:
最小化的DFA:没有多余状态,状态中没有两个是互相等价的。
-
状态等价:
- 定义: 设DFA M=(K,Σ,f,S,Z),p∈K,q ∈K,p和q是等价的(记为p≡q)定义为: p≡q if ∀α∈Σ* [f(p, α)∈Z ⇔f(q, α)∈Z]。
- 条件:
- 一致性条件:状态s与t必须同时为可接受状态或不可接受状态。
- 蔓延性条件:对于所有输入符号,状态s和状态t必须转换到等价的状态里。
-
分割法:
- 把M状态分为两个子集:一个由终态组成,另一个由非终态组成。
- 不断寻找子集与符号使得输出形成新的划分到无法划分为止。