编译原理笔记--词法分析

Posted FANCY PANDA

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译原理笔记--词法分析相关的知识,希望对你有一定的参考价值。

词法分析

正则表达式:L={a}{a,b} * ({ε}∪({.,_}{a,b}{a,b} * ))

正则表达式定义

  • ε是一个RE,L(ε) = {ε}
  • 如果 a∈∑,则a是一个RE,L(a) = {a}
  • 假设 r和 s都是 RE,表示的语言分别是 L®和L(s),则
    • r|s 是一个RE,L( r|s ) = L( r )∪L(s)
    • rs 是一个RE,L( rs ) = L( r ) L(s)
    • r* 是一个RE,L( r* )= (L( r ))*
    • ® 是一个RE,L( ( r ) ) = L( r )
      注:运算的优先级:*、连接、|
列题:
令 ∑ = {a, b},则

 - L(a|b) = L(a)∪L(b) ={a}∪{b} = {a, b}
 - L((a|b)(a|b)) = L(a|b) L(a|b)={a, b}{a, b}= { aa, ab, ba, bb } 
 - L(a*) = (L(a))*= {a}*= { ε, a, aa, aaa, . . . }
 - L((a|b)*) = (L(a|b))* = {a, b}*= { ε, a, b, aa, ab, ba, bb, aaa, . . .}
 - L(a|a*b) = { a, b, ab, aab, aaab, . . .}

正则语言RE:

定律描述
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 = sr|t r连接对|是可分配的
εr = rε = rε 是连接的单位元
r * = ( r|ε ) *闭包中一定包含 ε
r **= r ** 具有幂等性

正则定义:

正则定义是具有如下形式的定义序列:
d1→r1
d2→r2

dn→rn
其中:

  • 每个di都是一个新符号,它们都不在字母表 Σ中,而且各不相同
  • 每个ri是字母表 Σ∪{d1 ,d2 , … ,di-1}上的正则表达式
列题:
C语言中标识符的正则定义
  digit → 0|1|2|…|9
  letter_ → A|B|…|Z|a|b|…|z|_
  id → letter_(letter_|digit)*

有穷自动机FA

FA的典型例子

  • 电梯控制装置

  • 输入:顾客的乘梯需求(所要到达的层号)

  • 状态:电梯所处的层数+运动方向

  • 电梯控制装置并不需要记住先前全部的服务要求,只需要知道电梯当前所处的状态以及还没有满足的所有服务请求
    FA模型
    在这里插入图片描述

  • 输入带(input tape):用来存放输入符号串

  • 读头(head ):从左向右逐个读取输入符号,不能修改(只)、不能往返移动

  • 有穷控制器( finite control ):具有有穷个状态数,根据当前的状态和当前输入符号控制转入下一状态
    FA的表示

  • 转换图 (Transition Graph)

  • 结点:FA的状态

  • 初始状态(开始状态):只有一个,由start箭头指向

  • 终止状态(接收状态):可以有多个,用双圈表示

  • 带标记的有向边:如果对于输入a,存在一个从状态p到状态q的转换,就在p、q之间画一条有向边,并标记上a

    FA定义(接收)的语言

  • 给定输入串x,如果存在一个对应于串x的从初始状态到某个终止状态的转换序列,则称串x被该FA接收

  • 由一个有穷自动机M接收的所有串构成的集合称为是该FA定义(或接收)的语言,记为L(M )
    在这里插入图片描述
    最长子串匹配原则

  • 当输入串的多个前缀与一个或多个模式匹配时,总是选择最长的前缀进行匹配

  • 在到达某个终态之后,只要输入带上还有符号,DFA就继续前进,以便寻找尽可能长的匹配
    在这里插入图片描述

DFA

M = ( S,Σ ,δ,s0,F )

  • S:有穷状态集
  • Σ:输入字母表,即输入符号集合。假设ε不是 Σ中的元素
  • δ:将S×Σ映射到S的转换函数。 s∈S, a∈Σ, δ(s,a)表示从状态s出发,沿着标记为a的边所能到达的状态
  • s0:开始状态 (或初始状态),s0∈ S
  • F:接收状态(或终止状态)集合,F⊆ S

例子:
一个DFA:M = ( S,Σ ,δ,s0,F )

NFA

M = ( S,Σ ,δ,s0,F )

  • S:有穷状态集
  • Σ:输入符号集合,即输入字母表。假设ε 不是Σ中的元素
  • δ:将S×Σ映射到2S的转换函数。s∈S, a∈Σ, δ(s,a)表示从状态s出发,沿着标记为a的边所能到达的状态集合
  • s0:开始状态 (或初始状态),s0∈ S
  • F:接收状态(或终止状态)集合,F⊆ S
    例子:
    一个NFA:M = ( S,Σ ,δ,s0,F )
    在这里插入图片描述

根据RE 构造NFA

例子:
r=(a|b) *abb 对应的NFA
在这里插入图片描述

列子:
从NFA到DFA的转换

在这里插入图片描述

列子:
从带有ε-边的NFA到DFA的转换
在这里插入图片描述

以上是关于编译原理笔记--词法分析的主要内容,如果未能解决你的问题,请参考以下文章

编译原理 实验一 java语言实现对C语言词法分析

编译原理笔记--词法分析

编译原理笔记--词法分析

实验一 词法分析器+编译原理

编译原理让我们来构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 5.)(python/c/c++版)(笔记)Lexer词法分析程序

编译原理-2词法分析