美文网首页
【编译原理】第三章:词法分析

【编译原理】第三章:词法分析

作者: littlefogcat | 来源:发表于2021-01-12 12:05 被阅读0次

一、正则表达式(RE)

语言L=\{a\}\{a,b\}^*(\{\epsilon\}\cup (\{.,\_\}\{a,b\}\{a,b\}^*))
正则表达:r = a(a|b)^*(\epsilon|(.|\_)(a|b)(a|b)^*)

正则表达式可以由较小的正则表达式递归构建。每个正则表达式r定一个语言记作L(r)。

正则表达式优先级为:克林闭包>连接>或。

二、正则定义

简单来说就是重定义。
例如:
letter -> 字母
number -> 数
\d -> 整数

三、有穷自动机(FA)

系统根据当前状态当前的输入信息决定后继行为
每当处理完当前输入后,状态也发生改变。

1. FA的表示

FA的表示

2. FA定义的语言

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

例:对于FA


FA定义的语言

abbaabb是被接收的,而abbaaba则不被接收。

  • 由一个有穷自动机M接收的所有串构成的集合被称为该FA定义的语言,记作L(M)

  • 最长匹配:输入有多个前缀匹配时,会选择最长的前缀进行匹配。

四、有穷自动机的分类

  • 确定的FA(DFA)
  • 非确定的FA(NFA)

重点:转换表
一个有穷自动机可以由转换表表示。

1. DFA

DFA DFA例子

2. NFA

NFA NFA例子

3. DFA与NFA的等价性

  • 对于任何NFA,存在识别同一语言的DFA
  • 对于任何DFA,存在识别同一语言的NFA

例:


DFA与NFA的转换

以上两种自动机都可以用正则表达式r=(a|b)^*abb来表示。
事实上,正则表达式与有穷自动机是等价的

4. 含有空边的NFA

含有空边的NFA

5. DFA的算法实现

从人的角度看,NFA比DFA更加直观;但对于程序来说,DFA比NFA容易实现。

五、从正则表达式RE到有穷自动机FA

直接从RE转换到DFA是比较困难的,所以一般通过NFA作为中介。


转换

1. 从RE到NFA

从RE到NFA

2. 从NFA到DFA

DFA中的每个状态都是NFA中状态集合的一个子集。


从NFA到DFA

即,先写出NFA的转换表,再通过新的状态构建出DFA。

2.1 从带有空边的NFA转换为DFA

例:r=0^*1^*2^*

带有空边的NFA到DFA

3. 子集构造法

子集构造法

六、识别单词的DFA

1. 标识符

记数字为digit,字母为letter\_,那么标识符的正则表达式为:
r=letter\_(letter\_|digit)^*

这个正则表达式转换为NFA,表示如下:


标识符的NFA表示

这个NFA同时也是一个DFA,所以不用再进行转换。

2. 无符号数

记:
数字digit \rightarrow 0|1|...|9
数字串digits \rightarrow digit\ digit^*
小数部分optionalFraction \rightarrow .digits|\epsilon
指数部分optionalExponent \rightarrow (E(+|-|\epsilon)digits)|\epsilon
number \rightarrow digits\ optionalFraction\ optionalExponent

即一个数由一个数字串+可选的小数部分+可选的指数部分构成。
转换为NFA,表示如下:


无符号数的NFA表示

通过子集构造法,将NFA转换为DFA:


无符号数的DFA表示

3. 识别各进制无符号整数的DFA

可以表示10进制、8进制、16进制的DFA:


识别各进制无符号整数的DFA

4. 识别注释的DFA

识别注释的DFA

5. 词法分析阶段的错误处理

  • 单词拼写错误
  • 非法字符
  • 错误恢复

相关文章

  • 你不知道的JavaScript —— 作用域是什么

    1.1 编译原理 传统编译步骤 分词/词法分析(拆分成一个个词法单元)——>解析/语法分析(词法单元流转化为抽象语...

  • 编译原理->词法分析

    词法分析器的作用 词法分析器的主要任务是读入源程序的输入字符、将它们组成词素,生成并输出一个词法单元序列,每个词法...

  • 第一章作用域是什么

    1.1 编译原理 编译语言 分词/词法分析 解析/语法分析 代码生成 对于Javascript来说,大部分情况发生...

  • 什么是作用域

    编译原理 传统编译语言 词法分析:将由字符组成的字符串分解成(对编译语言来说)有意义的代码块,这些代码块被称为词法...

  • 作用域(一)

    编译原理 分词/词法分析这个过程称为分解代码块(词法单元),比如 var a = 2;。这个程序通常会被分解成为下...

  • 2018-09-07

    编译原理 Ch1 概念 编译程序 编译程序由八部分组成: 词法分析程序 语法分析程序 语义分析程序 中间代码生成程...

  • 编译原理大体概念

    编译原理学习 名词解释翻译器 translator编译器 compiler 高级语言--->低级语言词法分析 ...

  • 编译原理之词法分析

    词法分析的问题 术语 模式(pattern):产生和识别元素的规则 记号(token): 按照某个模式(或规则)识...

  • 编译原理:词法分析程序

  • 编译原理-词法分析入门

    想要理解一种语言的意思,首先要理解语言中的单词。词法分析就是将源程序拆解为一个个的单词,并确定单词的类型。 识别出...

网友评论

      本文标题:【编译原理】第三章:词法分析

      本文链接:https://www.haomeiwen.com/subject/tmhjaktx.html