编译原理(1)


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)。

  1. 定义: 设字母表为Σ,辅助字母表为Σ‘={∅,ε,|,.,*,(,)}。

    1. ε是∑上的正规式,L(ε)= {ε}

    2. Ф是∑上的正规式,L(Ф)=Ф

    3. 任何a∈∑,a是∑上的正规式,L(a)= {a}

    4. 如果e1和e2是∑上的正规式,则

      1. (e1)是∑上的正规式,L((e1))=L(e1)
      2. e1**︱e2 是∑上的正规式,L(e1︱**e2)=L(e1)∪L(e2)
      3. e1 · e2 是∑上的正规式,L(e1· e2)=L(e1)·L(e2)
      4. e1* 是∑上的正规式,L(e1*)=L(e1)*
    5. 仅由有限次使用上述步骤定义的表达式才是Σ上的正规式,仅由这些正规式所表达的符号串的集合才是Σ上的正规集

  2. 正规式服从的代数规律:

    1. “或”的交换律:r**︱s = s︱**r
    2. 结合律:
      • 或:(r**︱s)t = r(s︱**t)
      • 连接:(r·s)·t = r·(s·t)
    3. 分配律:
      • r·(s**︱t)= r·s︱**r·t
      • (s**︱t)·r = s·r︱**t·r
    4. 零律:εr =r,rε=r
    5. “或”的抽取律:r|r=r
  3. 正规式与正规文法之间转换:如果正规式r和文法G,有L®=L(G)则称正规式r和文法G是等价的。

    1. 正规式r→文法G转换方法:

      设∑上正规式r,则等价文法G=(VN,VT,P,S)。其中,VT=∑;从形如产生式 S→r 开始,按表规则进行转换, 直到全部形如产生式, 符合正规文法之规则形式为止,可得到P和VN

    规则1A→xyA→xB,B→y
    规则2A→x*yA→xB, A→y,B→xB, B→y
    规则3A→x**︱**yA→x,A→y
    注:A,B∈VN ,B为新增非终结符
    1. 正规文法转换成正规式:

      规则1A→xB, B→yA→xy
      规则2A→xA**︱**yA→x*y
      规则3A→x,A→ yA→x|y
有穷自动机:
  1. 确定有穷自动机(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,即

  2. 不确定的有穷自动机(NFA):

    • 一个不确定的有穷自动机NFA M是一个五元组:M=(K,Σ,f,S,Z)。其中:
      • K是非空有穷集,每个元素称为状态;
      • Σ是有穷字母表;
      • f是K×Σ*到K的全体子集的映射;即K×Σ*->2K,其中2K表示K的幂集。
      • S⊂K,称为开始状态集;
      • Z⊂K,称为结束状态集,或接受状态集。
NFA转换成等价的DFA:
  1. 前提运算:

    1. 闭包运算:

      • 设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经任意条ε弧而到达的状态的全体。

    2. 映射运算:

      • 设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弧而到达的状态的全体。
  2. 子集法:

    1. 设 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≠Φ}
    2. 构造算法:

      1. 置K′为空集;
      2. 计算M′的开始状态S′=ε_closure(S), S′作为K′新增状态;
      3. 对于K′每一新增状态q,计算出每个a∈Σ的转换状态p,即f′(q,a) =p=ε_closure(M(q,a))。如果p∉K′,则p作为K′新增状态;
      4. 重复③,直到K′不再出现新增状态为止;
      5. 计算接受状态集Z′={q**︱**q∈K′,q∩Z≠Φ}
确定有限自动机的化简:

最小化的DFA:没有多余状态,状态中没有两个是互相等价的。

  1. 状态等价:

    1. 定义: 设DFA M=(K,Σ,f,S,Z),p∈K,q ∈K,p和q是等价的(记为p≡q)定义为: p≡q if ∀α∈Σ* [f(p, α)∈Z ⇔f(q, α)∈Z]。
    2. 条件:
      1. 一致性条件:状态s与t必须同时为可接受状态或不可接受状态。
      2. 蔓延性条件:对于所有输入符号,状态s和状态t必须转换到等价的状态里。
  2. 分割法:

    1. 把M状态分为两个子集:一个由终态组成,另一个由非终态组成。
    2. 不断寻找子集与符号使得输出形成新的划分到无法划分为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值