返回顶部

第三章词法分析

作者:@cherish.
课程学习内容为作者从学校的PPT处摘抄,仅供自己学习参考,若需转载请注明出处:https://www.cnblogs.com/cherish-/p/16370927.html


词法分析

单词的形式化描述工具

  • 基于生成观点、计算机观点和识别观点,分别形成了正规文法、正规式和有穷自动机3种用于描述词法的工具。

正规文法

设文法G=(VN,VT,P,S),如果任意AβP,AVN,且β只能是aBaε,则称文法G属于右线性3型文法。

正规式及其表达的语言

也称为正则表达式,其表达的语言称为正规集。

  • 对给定的字母表
  • ε都是正规式,其正规集分别是{ε}
  • aa上的正规式,其正规则集为{a}
  • 如果rs都是上的正规式,则(算符优先级由高到低位:*, ,|)
    • (r)是正规式,它表示的正规集为L(r)
    • r|s是正规式,它表示的正规集为L(r)L(s)
    • rs是正规式,它表示的正规集为L(r)L(s)
    • r是正规式,它表示的正规集为L(r)=L(r)
  • 有限次使用上述步骤而定义的表达式仍是正规表达式,它们表示的符号串的集合是正规集。

【例】:令={a,b},则上正规式和对应的正规集如下:

正规式 正规集
a {a}
a|b {a,b}
ab {ab}
(a|b) {a,b}
a {ε,a,aa,....}
(a|b)a {a,b}{a}
(a|b)(a|b) {aa,ab,ba,bb}
  • 所有词法结构一般都可以用正规式描述

  • 若两个正规式所表示的正规集相同,则称这两个正规式等价,如b(ab)=(ba)b

  • 正规式的代数定律:设r,s,t为正规式,则有:

正规式和正规文法之间转换

  • 如果正规式r和正规文法G,有L(r)=L(G)则称正规式r和文法G是等价的。

正规式r文法G转换方法

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

正规文法转换成正规式

  • 基本上是正规式到正规文法的逆过程,按下列规则将文法处理成只剩下一个开始符号定义的正规式。

  • 注意此处规则2与前面的区别

有穷自动机

本质上和状态转换图相同,但有穷自动机只回答Yes/No

分为两类:

  • 不确定的有穷自动机NFA:输入符号包括ε,一个符号可以标记在离开同一状态的多条边上
  • 确定的有穷自动机DFA:输入符号不含ε,每个状态以及每个符号最多只有一条边

两种自动机都识别正则语言,对于每个可以用正则表达式描述的语言,均可用某个NFADFA来识别;反之亦然。

确定的有穷自动机DFA

DFA形式化定义

  • 确定有穷自动机DFA M是一个五元组M=(K,,f,S,Z),其中:

    • K:有穷状态集。
    • :输入字母表(有穷),输入符号集。
    • f:状态转移函数,为K×K的单值部分映射,f(ki,a)=kj表示:当现行状态为ki;输入字符为a时,将状态转移到下一状态kjkj称为ki的一个后继状态。
    • SK:初始状态。
    • ZK:终态集,也称可接受状态或结束状态。

DFA的扩展状态转移函数

  • f:K×K映射。设a,β,qK,即(qK,f(Kk,t))

    f(q,aβ)={f(q,a)β=εf(f(q,a),β)βε

DFA识别的语言

  • DFA M = (K,,f,S,Z),如果α,f(S,α)Z,则称符号串αDFA M所接受(或识别)的。DFA M所接受的符号串的集合记为L(M)

    L(M)={α|α,f(S,α)Z}

  • 上的一个符号串集V是正规的,当且仅当存在一个上的DFA,使得V=L(M)

非确定有穷自动机NFA

一个非确定有穷自动机NFA M是一个五元组M=(K,,f,S,Z),其中:

  • K:有穷状态集。
  • :输入字母表(有穷)。
  • f:状态转移函数,为K×({ε})P(K)的部分映射,P(K)表示K的幂集。
  • SK:初始状态
  • ZK:终态集

【例】

NFA扩展状态转移函数:f(q,a)Move(I,a)f(I,t)

f:P(K)×P(K)映射。

a,t,β,IK,即:

Move(I,a)=qIf(q,a)f(I,aβ)={Move(I,a)β=εf(Move(I,a),β)βε

NFA识别的语言

NFA M = (K,,f,S,Z),如果α,f(S,α)Z,则称符号串αNFA M所接受(或识别)的。NFA M所接受的符号串的集合亦记为L(M),即:

L(M)={α|α,f(S,α)Z}

自动机的等价

对于任何两个有穷自动机MM,如果L(M)=L(M),则称MM等价。

对于每个NFA M存在一个DFA M,使得L(M)=L(M),反之亦然。

DFANFA描述能力相同

状态集I的转换运算

NFA M = (K,,f,S,Z),IK,a{ε},则Move(I,a)定义如下:

Move(I,a)=qIf(q,a)

状态集IεClosure(I)

NFA M = (K,,f,S,Z),IK,则εClosure(I)定义如下:

  • εClosure(I)=I
  • εClosure(I)=εClosure(I)Move(εClosure(I),ε)
  • 重复上一步,直到εClosure(I)不再扩大为止。

NFA到DFA的转换算法(子集构造法)

  • 输入:NFA N = (K,,f,S0,Z)

  • 输出:等价的DFA D = (D,,g,S=εClosure({S0}),F)g(T,a)=εClosure(move(T,a))=U

  • 方法:一开始εClosure({S0})D中的唯一状态,且它未加标记:

    while(在D中有一个未标记状态T){T加上标记;
    	for(每个输入符号a){
    		U = ε-closure(move(T , a));
    		if(U不在D中) 将U加入D中,且不加标记;
    		Dtran[T , a] = U;
    	}
    }
    
  • F={q|qD,qZ}

【例】

DFA的化简

消除无用状态;无用状态是指不可达,没有通路到达终态。

合并等价状态:

  • 一致性条件:pq同时是可接受状态或不可接受状态
  • 蔓延性条件:对所有输入符号,pq必须转移到等价的状态中。

方法:分割法——状态被分成不同子集,不同的子集不等价,同一子集等价

DFA最小化:

正规式和有穷自动机的等价性

对于上的NFA M,可以构造一个上的正规式r,使得L(r)=L(M)

对于上的每一个正规式r,可以构造一个上的NFA M,使得L(M)=L(r)

NFA M 正规式r

M=<S,,δ,S0,F>,对M的状态转移图进行以下改造:

  • 新增两个状态X,Y,作为开始状态和接受状态,且将Xε指向M的所有开始状态,将M的所有接受状态经ε指向Y,得到M,显然有L(M)=L(M)

  • 反复使用下面的三条规则,逐步消去结点,直到只剩下X,Y为止。XY的弧上标记的符号串,即为上等价的正规式r

正规式r NFA M

  • 首先把r表示成:

  • 按下面的规则对r进行分裂:

  • 直到每条弧上只剩单个符号a{ε}

【例】

正规文法和有穷自动机的转换

  • 正规文法G,NFAM,使得L(M)=L(G)
  • NFAM,正规文法G,使得L(M)=L(G)

正规文法G NFA M

  • G=(VN,VT,P,S)
  • M的字母表=VT
  • G的每个非终结符是M的一个状态;
  • G的开始符SM的开始状态S
  • 增加一个新状态Z,作为M的终态;
  • M的状态转移函数f
    • 如果AaP,f(A,a)=Z
    • 如果AεP,f(A,ε)=Z
    • 如果AaBP,f(A,a)=B

【例】

NFAM G

有穷自动机M=(K,,f,S,Z)正则文法G=(K,,P,S)

  • 必要时确定化M(如果M含有ε转移)
  • G的产生式P由下列方法构造:
    • 如果f(B,a)=C,BaC
    • 对可接受态Z,增加产生式Zε
    • 如果f(B,a)=CC为终态且非始态又无出边,可直接Ba

【例】

posted @   cherish-lgb  阅读(138)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示