编译原理(2)词法_1(正规表达式与有限自动机简介)

合集下载

【编译原理】词法分析:正则表达式与有限自动机基础

【编译原理】词法分析:正则表达式与有限自动机基础

【编译原理】词法分析:正则表达式与有限⾃动机基础引⾔: 编译语⾔设计的精髓在于⾃动化过程,即如果要设计⼀门编程语⾔,那么⼀定要设计⼀个⾃动化系统,能够⾃⾏读⼊分析程序员写⼊的程序,将其翻译为机器能够识别的指令等信息。

当然⾼级语⾔的编译不是⼀蹴⽽就的,⽽是通过若⼲步的分解、规约、转换、优化,最后得到⽬标程序。

具体的编译步骤如下: 源程序就是我们写⼊的⾼级语⾔,编译的第⼀步叫做“词法分析”。

词法分析的本质,就是要拆解出语句的每⼀个单词,然后对这个单词的类型进⾏辨识。

⾸先拿中⽂来举例。

⽐如有⼀句话是“我喜欢你”,那么⾸先我们要把这句话拆成“我”、“喜欢”、“你”,然后再逐个分析他们的类型,得到“我”->主语;“喜欢”->谓语;“你”->宾语。

这样我们就把这句话每个单词都分析出来了,也就完成了中⽂的“词法分析”。

那么回到编程语⾔,它的词法分析就是将字符序列转换为单词(Token)序列的过程。

翻译成俗话,就是把我们写的⼤⽚语⾔⽂本分解为⼀个⼀个单词,再输出每个单词的类型。

举⼀个例⼦:int p = 3 + a; 这个语句⾮常简单,即定义⼀个变量p,它的初值为变量a与3的加和。

那么接下来我们要对这个语句进⾏词法分析,⾸先我们要把这段⽂本拆解成单词,拆出来就是'int'、'p'、'='、'3'、'+'、'a'、';'。

对这些单词再进⾏类型的辨识,那么就得到以下结果:语素语⾔类型int关键字p标识符=运算符3数字+运算符a标识符 这样我们就把这段⽂本中的每个单词的类型都分析出来了。

乍⼀看⾮常简单对不对,对于⼈类⽽⾔你只需要⽤⾁眼就可以轻松观察出来每个单词的类型,但对于计算机⽽⾔,它可没有⼈类那样的智能。

如果想要计算机能够识别并分析语素的类型,那就需要我们⼈类来为它构造⼀个⾃动化输⼊和分析的系统。

编译原理基础知识

编译原理基础知识

编译原理基础知识编译原理是计算机科学中一门重要的学科,它研究的是将程序源代码转化为可执行代码的过程。

掌握编译原理的基础知识对于理解计算机编程语言的运行原理以及进行高效编程至关重要。

本文将介绍编译原理的基本概念、过程和常用算法。

一、编译原理概述编译器是实现编译原理的工具,它将高级语言代码转化为机器语言代码。

编译器的工作过程可以分为三个主要阶段:词法分析、语法分析和语义分析。

词法分析器主要负责将源代码分解为词法单元,语法分析器则负责将词法单元组织成语法树,而语义分析器则检查语法树的语义错误并进行修正。

二、词法分析词法分析是编译器的第一个阶段,它将源代码分解为词法单元(Token)。

词法单元是程序中的最小可识别单位,如标识符、关键字、运算符等。

词法分析器通常使用有限自动机、正则表达式等方法进行词法单元的识别和分类。

三、语法分析语法分析是编译器的第二个阶段,它将词法单元组织成语法树(Parse Tree)。

语法树是由语法分析器根据源代码的语法规则生成的一棵树状结构。

语法分析器使用上下文无关文法(CFG)来描述语法规则,并通过递归下降、LR分析等算法进行语法单元的解析和组织。

四、语义分析语义分析是编译器的第三个阶段,它主要负责检查语法树的语义错误并进行修正。

语义分析器会检查变量的声明和使用是否一致、类型是否匹配等问题,并生成中间代码或目标代码。

常见的语义分析算法包括类型检查、符号表管理等。

五、代码生成代码生成是编译器的最后一个阶段,它将语义分析阶段生成的中间代码或目标代码转化为可执行代码。

代码生成器会优化代码的执行效率,包括寄存器分配、指令选择、代码重排等。

常用的代码生成算法有静态单赋值(SSA)形式转换、线性扫描代码生成等。

六、总结编译原理是计算机科学中的一门重要学科,它涉及到将源代码转化为可执行代码的过程。

掌握编译原理的基础知识可以帮助我们理解计算机编程语言的运行原理,提高编程效率。

本文介绍了编译原理的概述,包括词法分析、语法分析、语义分析和代码生成等基本概念和过程。

编译原理基础知识

编译原理基础知识

编译原理基础知识编译原理是计算机科学领域的一个重要分支,涵盖了计算机程序设计的基本概念和技术。

它主要研究如何将高级程序设计语言(源语言)转换为计算机能够执行的机器语言(目标语言),以实现程序的正确性和高效性。

本文将重点介绍编译原理的基础知识。

一、编译原理的定义与作用编译原理是通过编译器将源代码转换为目标代码的理论和方法的总称。

编译器是一个软件工具,它能够将高级语言程序翻译成机器语言程序。

编译原理的主要作用是提高程序的执行效率和可维护性,同时也有助于程序员更好地理解程序的结构和语义。

二、编译原理的基本过程1. 词法分析(Lexical Analysis):将源程序分解为词法单元(Token)的序列,每个词法单元代表了程序中的一个基本语法单位,如关键字、标识符、常量等。

2. 语法分析(Syntax Analysis):通过语法分析器(Parser)根据语法规则检测和分析词法单元序列,构建语法树(Syntax Tree),以表达程序的语法结构。

3. 语义分析(Semantic Analysis):对语法树进行语义检查,包括类型检查、作用域分析等,并生成符号表。

4. 中间代码生成(Intermediate Code Generation):将语法树转换为中间代码,中间代码是一种类似于汇编语言的低级表示形式,与具体的硬件平台无关,便于后续优化与目标代码生成。

5. 代码优化(Code Optimization):对中间代码进行各种优化,以提高程序的执行效率和资源利用率。

6. 目标代码生成(Code Generation):将优化后的中间代码转换为目标代码,目标代码是特定硬件平台上的机器代码,可以直接由计算机执行。

三、编译原理的常见技术和算法1. 正则表达式和有限自动机:用于对词法单元进行识别和划分的基础技术。

2. 上下文无关文法和语法分析算法:用于语法分析的基本概念和方法,如LL文法、LR文法和LALR文法等。

编译原理教程课后习题参考答案——

编译原理教程课后习题参考答案——

第二章 词法分析2.1 完成下列选择题:(1) 词法分析器的输出结果是 。

a. 单词的种别编码b. 单词在符号表中的位置c. 单词的种别编码和自身值d. 单词自身值(2) 正规式M1和M2等价是指 。

a. M1和M2的状态数相等b. M1和M2的有向边条数相等c. M1和M2所识别的语言集相等d. M1和M2状态数和有向边条数相等(3) DFA M(见图2-1)接受的字集为 。

a. 以0开头的二进制数组成的集合b. 以0结尾的二进制数组成的集合c. 含奇数个0的二进制数组成的集合d. 含偶数个0的二进制数组成的集合【解答】(1) c (2) c (3) d图2-1 习题2.1的DFA M2.2 什么是扫描器?扫描器的功能是什么?【解答】 扫描器就是词法分析器,它接受输入的源程序,对源程序进行词法分析并识别出一个个单词符号,其输出结果是单词符号,供语法分析器使用。

通常是把词法分析器作为一个子程序,每当词法分析器需要一个单词符号时就调用这个子程序。

每次调用时,词法分析器就从输入串中识别出一个单词符号交给语法分析器。

2.3 设M=({x,y}, {a,b}, f, x, {y})为一非确定的有限自动机,其中f 定义如下:f(x,a)={x,y} f {x,b}={y}f(y,a)=Φ f{y,b}={x,y}试构造相应的确定有限自动机M ′。

【解答】 对照自动机的定义M=(S,Σ,f,So,Z),由f 的定义可知f(x,a)、f(y,b)均为多值函数,因此M 是一非确定有限自动机。

先画出NFA M 相应的状态图,如图2-2所示。

图2-2 习题2.3的NFA M 用子集法构造状态转换矩阵,如表表2-1 状态转换矩阵1b将转换矩阵中的所有子集重新命名,形成表2-2所示的状态转换矩阵,即得到 M ′=({0,1,2},{a,b},f,0,{1,2}),其状态转换图如图2-3所示。

表2-2 状态转换矩阵将图2-3所示的DFA M ′最小化。

编译原理知识点总结

编译原理知识点总结

编译原理知识点总结编译原理是计算机科学中的一个重要领域,它研究的是将高级程序语言转化为可执行目标代码的原理和方法。

在软件开发过程中,编译器起着至关重要的作用,因此了解编译原理的知识点对于理解和优化程序的性能至关重要。

1. 词法分析:词法分析是编译器的第一步,它将源代码划分为一个个的词法单元,如关键字、标识符、运算符等。

词法分析器通过正则表达式和有限自动机来实现,可以有效地将源代码转化为词法单元流。

2. 语法分析:语法分析是编译器的第二步,它通过语法规则将词法单元流转化为抽象语法树(AST)。

语法分析器使用上下文无关文法来描述语言的语法结构,并通过LL(1)分析、LR(1)分析等算法来构建抽象语法树。

3. 语义分析:语义分析是编译器的第三步,它对抽象语法树进行语义检查和类型推断。

语义分析器会检查变量的作用域、类型是否匹配等语义错误,并生成中间代码或目标代码。

4. 中间代码生成:中间代码生成是编译器的一项重要任务,它将抽象语法树转化为中间表示形式,如三地址码、四地址码等。

中间代码是一种抽象的低级语言,便于后续的优化和目标代码生成。

5. 代码优化:代码优化是编译器的关键环节,它通过对中间代码进行分析和优化,提高程序的执行效率和资源利用率。

常见的代码优化技术包括常量折叠、循环优化、函数内联等。

6. 目标代码生成:目标代码生成是编译器的最后一步,它将中间代码转化为目标机器代码。

目标代码生成器根据目标机器的特性和指令集,生成可执行的目标代码。

7. 符号表管理:符号表是编译器中用于管理变量、函数等符号信息的数据结构。

符号表包含了符号的名称、类型、作用域等信息,编译器在词法分析、语法分析和语义分析阶段使用符号表进行符号的查找和管理。

8. 错误处理:错误处理是编译器中一个重要的组成部分,它负责检测和报告源代码中的错误。

编译器需要能够准确地定位错误的位置,并给出有意义的错误信息,帮助程序员快速定位和修复错误。

编译原理涉及的知识点非常广泛,上述仅是其中的一部分。

编译原理2.2自动机理论

编译原理2.2自动机理论
编译原理2.2自动机理论
contents
目录
• 自动机概述 • 有限自动机 • 正则文法和正则表达式 • 确定有限自动机(DFA) • 非确定有限自动机(NFA)
01 自动机概述
定义与分类
定义
自动机是一个抽象的机器,用于模拟有限状态系统的行为。它由一组状态、一 组输入符号和一组转移函数组成,根据输入符号和当前状态来决定下一个状态。
正则文法与正则表达式的转换
正则文法转换为状态机
通过构造一个状态机来描述正则文法的语言,状态机中的每个状态对应一个产生式,状态之间的转移 对应于产生式的应用。
正则表达式转换为状态机
将正则表达式转换为状态机的方法包括确定化和非确定化两种。确定化是将一个不确定的状态机转换 为确定的状态机,非确定化是将一个确定的状态机转换为不确定的状态机。
工具辅助
使用自动机生成工具或编译器工具集中的工 具,如Lex或Yacc等,根据语言规范生成 DFA。
DFA的应用实例
词法分析
01
DFA可以用于实现词法分析器,将输入的字符串分割成一个个
单词或符号。
正则表达式匹配
02
DFA可以用于实现正则表达式匹配算法,判断一个字符串是否
符合正则表达式的模式。
语法分析
正则表达式的应用实例
1 2
文本匹配
正则表达式可以用来匹配文本中的特定模式,例 如查找字符串中的数字、邮箱地址等。
文本替换
正则表达式可以用来替换文本中的特定模式,例 如将字符串中的所有数字替换为特定字符。
3
文本解析
正则表达式可以用来解析文本中的结构化数据, 例如从CSV文件中提取数据。
04 确定有限自动机(DFA)
正则文法的性质

《编译原理》第2章 编译基础-形式语言与有穷自动机

整理课件
句型、推导
G[E]: E→E+T|T T→T*F|F F→(E)|a
对于句子a+a*a 有不同 的推导
EE+T T+T F+T a+T a+T*F a+F*F a+a*F a+a*a
EE+T E+T*F E+T*a E+F*a E+a*a T+a*a F+a*a a+a*a
整理课件
例:奇偶测试器
0
0
1
q0
q1

1
自动机:M=(Q,∑ ,δ ,q0,Z)
Q={ q0, q1}
∑ ={0,1}
q0=q0 Z={q1}
整理课件
映射函数:
δ( q0,0)= q0 0
0
δ( q0,1)= q1
1
δ( q1,0)= q1 q0
q1
δ( q1,1)= q0
1
例:000110001
整理课件
第四节 正规文法与有穷自动机 1、正规文法 产生的语言的推导 例:文法 G=(VN,VT,P,S) 其中: VN={A,B,C}
VT={a,b,c} S=A P:A →aB A →aA
B →bB B →bC C →cC C →c
整理课件
A=>aA=>aaA=>…..=>aa…aB =>aa…abB=>aa…abb…bC =>aa…abb…bcC=> aa…abb…bccC => aa…abb…bcc…c
D→ε
Aa→bD
自然语言属于上下文有关文法
整理课件
文法的类型

《编译原理》第三章 词法分析器


有限自动机模型
Finite Automata (FA):
一个有限自动机的模型如下所示:
... ... head finite control input tape
输入带被分成一个个的小单元来装输入符号, 其右边是无限延伸的。 有限状态控制器由有限个状态组成,并根据读 入字符将当前状态转换成下一个状态
有限自动机与正规式的等价性证明
• 证明一: 对于∑上的NFA M,我们来构造∑上的正规式r, 使得L(r)=L(M)。 首先,我们将状态图的概念拓广,令每条弧可 用正规式作标记。并在M的转换图上加进两个 结点,一个为X,一个为Y。从X用ε弧连接到Y, 从而形成一个新的NFA,记为M’,它只有一个初 态X和一个终态Y。显然L(M)=L(M’)。即,这 两个NFA是等价的。 现在来逐步消去M’中的所有结点,直至只剩下 X和Y为止。
有限自动机接受的语言
The language accepted by FA
一个FA 能够接受的语言定义如下:
• 对于一个 DFA M, 可接受的语言表示为: L(M)={ x | x∈Σ* and f(s0 , x)∈Z} • 对于一个 NFA M, 其接受的语言为: L(M)={x | x∈Σ*and f(s0, x)∩Z≠Φ} • 两个 FA M and M’ 是等价的当且仅当 L(M) = L(M’)
M
M
a
M
假设对于任意 正规式 r1 and r2, 如果 |r1| < k 而 且 |r2| < k, 那么就于一个NFA M1 and M2 对应 于r1 和 r2. 所以对于任意 RE r, |r| = k, 我们有:
• 这个自动机所接受的语言是所有被3整除 以后余数为2的二0, q1, q2, q3}, {0, 1}, f1, q0 {q3} ) . 其中f1如下所示 :

编译原理讲义全范文

编译原理讲义全范文编译原理是计算机科学中的一门重要课程,它研究如何将高级语言程序转化为可执行代码的过程。

在编译原理的学习过程中,我们需要掌握一系列的理论知识和实践技巧,以便正确地设计和实现编译器。

下面是一份全面的编译原理讲义,主要包括词法分析、语法分析、语义分析、优化与目标代码生成等内容。

一、词法分析1.编译原理概述2.词法分析的定义和作用3.词法分析器的实现方法4.正则表达式和有限自动机5.正则表达式到NFA的转化6.NFA到DFA的转化7.最小化DFA8.正则表达式到DFA的转化9.词法分析器生成器的使用二、语法分析1.上下文无关文法的定义和作用2.语法分析的定义和作用3.自顶向下语法分析方法4.递归下降分析方法5.预测分析方法6.LL(1)文法和LL(1)分析方法7.自底向上语法分析方法8.LR分析方法和SLR分析方法LR分析方法和LR分析方法10.LR分析器生成器的使用三、语义分析1.语义分析的定义和作用2.语义动作和语法制导定义3.语法制导翻译和语义树的构建4.属性文法和符号表管理5.语义分析的错误处理6.语义分析器的实现方法四、中间代码生成1.中间代码的定义和作用2.中间代码的表示方法3.中间代码生成的基本原理4.三地址码的生成方法5.语法树的线性化6.优化技术在中间代码生成中的应用7.中间代码生成器的实现方法五、代码优化1.代码优化的概述2.代码的局部优化技术3.代码的全局优化技术4.数据流分析和优化5.控制流优化和代码调度6.代码优化器的实现方法六、目标代码生成1.目标代码的定义和作用2.目标机器的特性和指令系统3.指令选择和寄存器分配4.目标代码生成的基本原理5.基本块和流图的生成6.目标代码的生成方法7.目标代码生成器的实现方法七、构建编译器1.编译器整体架构与设计2.词法分析器的实现3.语法分析器的实现4.语义分析器的实现5.中间代码生成器的实现6.代码优化器的实现7.目标代码生成器的实现8.编译器的调试和测试技巧通过学习以上内容,我们将全面了解编译原理的基本理论和实践技术,掌握编译器的设计和实现方法。

编译原理练习答案蒋宗礼第三章


一个非确定有限自动机(NFA)M 是一个五元式:M=(Q, ∑ ,f,s0,Z) 。 在确定有限自动机的描述中,(1) 、 (2) 、(5)同确定有限自动机,而(3)为:f 是一个 * 以 Q× ∑ 到 Q 的子集的映射,即 f:S×∑*→2Q。 。 显然,一个含有 m 个状态和 n 个输入字符的非确定有限自动机可表示成一张状态图, 该图含有 m 个状态结点,每个结可射出若干条有向弧与别的结点相连接,每条弧用∑*中的 一个字(不一定要不同的字且可以是空字ε )作标记(称为输入字) ,整个图至少含有一个 初态结点以及若干个 (可以是 0 个) 终态结点, 某些结既可以是初态结点又可以是终态结点。 注意:DFA 是 NFA 的特例。对于每个非确定有限自动机 M,存在着一个确定有限自动机 M`,使得 L(M)=L(M`) ,即两个有限自动机等价。
任何地方出现,所以本题只需要考虑一种情况,另外一种情况也可以类似求得。考虑包含奇 数个 0 的字符串:由于只关心 0 的个数的奇偶数,我们可以把二进制串分成多段来考虑,第 1 段为二进制串的开始到第 1 个 0 为止, 这一段包含 1 个 0, 并且 0 的前面有 0 个或多个 1, 对于剩下的二进制串按照每段包含两个 0 的方式去划分,即以 0 开始,以 0 结尾,中间可以 有 0 个或多个 1,如果一个二进制串被这样划分完后,剩下的部分如果全部是全 1 串(这些 全 1 串在前面划分的串之间或最后) ,则该二进制串就具有奇数个 0,所以该二进制可以这 * * * 样描述:以第 1 段(1 ) )开始,后面由全 1 串(1 )以及包含两个 0 的串(01 0)组成, * * * * * 所以包含奇数个 0 的正规表达式为:1 0(1|01 0) ,本题的解答则是:1 0(1|01 0) * * * * |0 1(0|10 1) 。 例 8 语言 L 是所有由偶数个 0 和偶数个 1 组成的句子的集合,给出定义 L 的正规文法。 【解】解题思路: 这道题可以从状态转换图着手,由于每读入 1 个“0” , “0”的个数的奇偶数就会变,每 读入 1 个“1” , “1”的个的奇偶数也会改变,因此本题可以引入 4 个状态,分别代表偶数个 “0”和“1” 、奇数个“0”和“1” 、奇数个“1”偶数个“0”和奇数个“0”偶数个“1” , 那么,能接受语言 L 的状态转换图如下图 3 所示。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.4
正规表达式与有限自动机简介
正规表达式到有限自动机的构造
2.5
词法分析器的自动生成
2.3

正规表达式与优先自动机简介
2.3.1:正规表达式与正规集(定义和运算)
–状态转换图可以构造词法分析程序,但属于非形式化描述
–正规表达式(简称正规式)是词法分析的形式化表示方法 • 所谓形式化的方法,是指用一整套带有严格规定的符号 体系来描述问题的方法,优点:更加清晰和准确 –例如:形式化表示标识符,即标识符的正规式: letter(letter | digit)* 能够表示的单词集合称为正规集
西北农林科技大学本科教程
第 2 讲
主讲教师:赵建邦
本讲目标

第二章《词法分析》前三节

2.1 2.2 2.3
词法分析器的设计方法 一个简单的词法分析器 正规表达式与有限自动机简介

重点掌握

状态转换图的概念 正规表达式的概念和运算
第二章 词法分析
2.1 2.2
词法分析器的设计方法 一个简单的词法分析器
2.1.1:单词符号的分类与输出形式
–输出形式:单词符号通常表示成如下的二元式:
(单词种别,单词自身的值/内码值) 1、单词种别:即单词的种类。为了处理方便,通常让每种单 词对应一个整数码,可以最大限度地将每个单词区别开来 • 保留字:可以统一视为一种,也可一字一种(后一种较
常用)
• 标识符:统一归为一种 • 常数:可统一归为一种或按照整型、实型、布尔型等分 为几种 • 运算符和界符可统一归为一种或采用一符一种
• 则 Σ* = {ε,a,b,aa,ab,ba,bb,aaa,…}
–6.空语言:不含任何字的语言{ },用‘Ф’表示 注意区分ε、{ }和{ε}: ε是空字,是语言字的集合中的一个元素, 不是Σ的元素 { }不包含任何字,属于集合的概念 {ε}由空字组成的集合,这个集合比{ }多一个元素
2.3

2.1

词法分析器的设计方法
2.1.2:状态转换图(举例)
标识符
无符号整数
无符号数字
2.1

词法分析器的设计方法
2.1.2:状态转换图(编程)
–含分支的状态
• 对应一个switch()语句 • 或对应一组if-else语句 –含回路的状态 • 对应一个while语句 图2-4(a) 含分支的状态i
个保留字。当然,也可以专设一个保留字表来进行处理。
空白 0
字母或数字 字母 1 数字 3 5 非字母与数字
* 返回(id,id在符号表 中的位置)或返回(保 2 留字,—)
*
4
数字
非数字

返回(+,—)
6 7 其它
返回(num,num在常 数表中的位置)
*

*
8
返回(=,—) 返回(relop,EQ)
2.1
词法分析器的设计方法
词法分析器的处理结构(2种):

第一种:词法分析器和语法分析器完全分开
–词法分析器的输出(单词符号流)作为语法分析器的输入
将词法分析工作作为独立的一遍来完成,在这个过程中不
断查询和完善符号表
图2-1(a) 词法分析程序作为主程序
2.1
词法分析器的设计方法
词法分析器的处理结构(2种):
–终态对应一个return()语句
• 意味着从词法分析器返回 到调用段,一般指返回到 语法分析器 图2-4(b) 含回路的状态i
第二章 词法分析
2.1 2.2
词法分析的设计方法 一个简单的词法分析器
2.3 2.4ຫໍສະໝຸດ 正规表达式与有限自动机简介
正规表达式到有限自动机的构造
2.5
词法分析器的自动生成
10
2.1

词法分析器的设计方法
2.1.2:状态转换图(概念)
–上一小节解决了单词符号的表示,但是如何识别单词呢?
答:借助‚状态转换图‛ 在词法分析中,可以用状态转换图来识别单词。状态转 换图是状态有限的有向图,结点代表状态,用圆圈表示;结 点之间可由有向边连接,代表状态转换关系,有向边上可标
记字符,表示前一状态接受某一个字符之后的状态转移
例如,右图表示在状态i下的状态转换: 若输入字符为x,则读入x并转换到状 态j; 若输入字符为y,则读入y并转换到状 态k。
2.1

词法分析器的设计方法
2.1.2:状态转换图(表示)
–状态转换图的要求
• 状态(即结点)个数有限 • 至少一个初始状态,若干终止状态 • 每条边上标有字符(也可以是空字符) –状态转换图的表示习惯
单词符号 while if else switch case 标识符 常数 种别编码 1 2 3 4 5 6 7 助记符 while if else switch case id num 内码值 - - - - - id在符号表中的位置 num在常数表中的位 置
2.2

一个简单的词法分析器示例
2.2.1:C语言子集的单词符号表示 单词符号 种别编码 助忆符 内码值
+ * <= < == =

8 9 10 11 11 11 12 13
+ * relop relop relop =

- - - LE LT EQ - -
2.2

一个简单的词法分析器示例
2.2.2:C语言子集对应的状态转换图
–对输出程序串预处理
• 在设计的状态转换图中,首先对输入串做预处理,即剔 除多余的空白符(在实际的词法分析中,预处理还包括剔 除注释和制表换行符等编辑性字符的工作),使词法分析 工作既简单又清晰。 –将保留字作为一类特殊的标识符来处理 • 即对保留字不专设对应的状态转换图,当转换图识别出 一个标识符时就去查对表2.1的前五项,确定它是否为一
2.1
单词符号分类举例
例如:if(a>1) b=100; 如果采用每种单词对应一个整数码,对应的二元式序列? 假如五类单词的种别规定如下: 保留字if种别:2 上面的子程序输出的二元式序列: 标识符种别:10 ( 2, ) if 常量种别: 11 ( 29, ) ( “=”种别: 17 ( 10,’a’ ) a “>”种别: 23 ( 23, ) > “;”种别: 26 ( 11,’1’的二进制) 1 “(”种别: 29 ( 30, ) ) “)”种别: 30 ( 10,’b’ ) b ( 17, ) = 采用第一种表示 ( 11,’100’的二进制) 100 ( 26, ) ;


10 11
= 9 返回(;—) 返回({—) 非法字符错
图2-5 简单词法分 析的状态转换图
21

12
其他
13
2.2

一个简单的词法分析器示例
2.2.2:C语言子集对应的状态转换图
–特别注意:状态2在识别标识符和保留字时:
• 1、先看识别出的单词是否是保留字,否则是标识符 • 2、如果是标识符,查符号表中是否已有,如果表中没有 此标识符,将此标识符登录到符号表中,并返回(id,id 在符号表中的位置/入口指针);若表中已有此标识符,
正规表达式与优先自动机简介
2.3.1:正规表达式与正规集(递归定义)
– 对于给定的字母表Σ,正规式和正规集定义为:
• (1) ε和Ф都是Σ上的正规式,它们所表示的正规集分别为 {ε}和Ф。 • (2) 对于任一个符号a∈Σ,a是Σ上的一个正规式,它所表 示的正规集为{a}。 这两条规则称为基础规则 第二条:从普通的符号产生对应的正规式和正规集
• 标识符:用户自己定义的常量名、变量名、方法名等
• 常数:布尔常数(true/false)和其它常数 • 运算符: “+”、“- ”、“ * ”、“/ ”、“>”、“<” 等 • 界符:在语言中是作为语法上的分界符号使用的,如 ‚,”、‚;”、‚(”、‚)”、‚=”等
2.1

词法分析器的设计方法
• getbe()和getchar()的使用区别
• reserve():如果token保存的是保留字,则返回编码(15),否则返回0 • retract():扫描指针回退一个字符,同时将character 置空
第二章 词法分析
2.1 2.2
词法分析的设计方法 一个简单的词法分析器
2.3
2.3
2.4
正规表达式与有限自动机简介
正规表达式到有限自动机的构造
2.5
词法分析器的自动生成
2.1
词法分析器的设计方法
回顾词法分析器:

定位 –词法分析是编译的第一个阶段

任务
–从左至右逐个字符地对源程序进行扫描,产生一个个单词
(Token)符号

功能
–输入源程序,输出单词符号(流)
–不断访问、更新符号表
–1.字母表:语言元素的非空有穷集合,通常用‘Σ’表示
• 例如: Σ={a,b,c} • Σ是字母表,它由a,b,c三个元素组成 • 注意:字母表中至少包含一个元素,任何语言的字母表 规定了该语言中允许出现的一切符号。如英文的字母表
是26个字母、数字和标点符号的集合;C语言的字母表是
由字母、数字和若干专用符号组成。 –2.符号:字母表中的每一个元素,也叫字符
• 初始状态用‚
○”表示
• 非终止状态用‚○‛表示 字符 • 状态之间的跳转用‚ • 终止状态用‚◎*‛表示
‛(有向边)表示
2.1

词法分析器的设计方法
2.1.2:状态转换图(表示)
–特别说明:终止状态用‚◎*‛表示
• 某些终止状态是在读入了一个其它不属于该单词的符号 后才得到相应的单词编码的,这表明在识别单词的过程 中多读入了一个符号,所以识别出单词后应将最后多读 入的这个符号予以回退;我们对此类情况的处理是在终 态上以‚*‛作为标识。 例如:想要识别数字,输入 ‚234a” 读入‘2’:状态0->1 读入‘3’:状态1 读入‘4’:状态1 读入‘a’:状态1->2 回退,识别‚234‛
相关文档
最新文档