词法分析
33
例:将文法G[S]转换成正规式 G:S→a A|a A→dA|d 先由产生式得: S=aA|a A=d*d 将A代入S中得: S=ad*d|a 利用正规式变换得 S=a(d*d|ε)=ad* 说明:d*d|ε =(ε|d|dd|…)d|ε =d|dd|…|ε= d* 所求正规式为ad*
34
有穷自动机 (Finite Automata)
状态转换图 确定有穷状态自动机(DFA) 非确定有穷状态自动机(NFA) 把NFA变为DFA DFA的化简
35
状态转换图(Transition Diagram)
为了识别正则文法的句子而专门设计的有向图。 如:C语言中关于标识符定义的规则(词法规则) 如下: <标识符>::=字母|<标识符>字母|<标识符> 数字
正规文法和正规式间的转换
等价性: 对任意一个正规文法,存在一个定义同 一语言的正规式 对任意一个正规式,存在一个定义同一 语言的正规文法
30
1. 将∑上的一个正规式r转换成文法G=(VN,VT,S,P) VT= ∑,首先形成产生式S→r,S为G的开始符 不断利用下面的规则做变换,直到每个产生式最 多含有一个终结符为止 原产生式 变换后产生式 规则1 规则2 规则3 A→xy A→x*y A→x|y A→xB B→y A→xA A→y A→x A→y
2
词法分析程序
词法分析是编译过程中的一个阶段,在语法分 析前进行 ,也可以和语法分析结合在一起作为 一遍。 输入:源程序字符串 输出:单词符号(最基本的语法单位)
3
词法分析程序的功能
词法分析程序主要执行以下功能: 读入源程序字符串,识别开具有独立含义的最 小语法单位——单词(符号); 把单词变换成长度统一的且为定长的属性字; 其他功能: 滤掉空格,跳过注释、换行符 某些预加工处理
(0|1)(0|1)* ∑上的“数”的全体
24
例 令={a,b}, 上的正规式和相应的正 规集的例子有:
正规式 a a b ab (ab)(ab) a (ab) 正规集 {a} {a,b} {ab} {aa,ab,ba,bb} { ,a,a, ……任意个a的串} { ,a,b,aa,ab ……所有由a 和b组成的串} (ab)(aabb)(ab) {上所有含有两个相继 的a或两个相继的b组成 的串}
正规文法描述的是VT*上的正规集
18
例如 :
用l表示a~z中的任一英文字母,d表示0~9中任一 数字
描述标识符的正规文法为 <标识符>→l|l<字母数字> <字母数字>→l|d|l<字母数字>|d<字母数字> 描述无符号整数的正规文法 <无符号整数>→d|d<无符号整数>
19
为什么要引进正则表达式?
例如: e1= (ab), e2 = ba 又如: b(ab) = (ba)b (ab) = (ab)
27
正规式的运算律
设r,s,t为正规式,正规式服从的代数规律有:
1。rs=sr 2。r(st)=(rs)t 3。(rs)t=r(st) 4。r(st)=rsrt (st)r=srtr 5。 r=r, r=r 6。 rr=r r=rrr…
如果一个种别只含一个单词符号,那么该单词符号的类别编码就完 全代表它自身的值。 把单词符号存储在符号表中。不同种类的单词符号可能具有不同类 型的属性。可以用不同种类的符号表实现。
如果一个种别含有多个单词符号,那么还应给出该单词符号的自身 值:标识符自身值是标识符自身的字符串;常数自身值是常数的二 进制数值。
字母 (a-z) 其它 *
此时, 超前搜 索了一 个字符
0
1
2
字母或数 字(a-z0-9)
11
词法分析程序输出单词的形式
词法分析程序输出的单词符号通常用二元式表示:(单词 类别,单词自身的值) 单词类别:表示单词种类,常用整数编码,它是语法分析 需要的 单词自身的值:是编译中其他阶段所需要的信息
正规式和有限自动机
15
正规表达式和有限自动机 ——学习目的和内容
用正则表达式描述词法规则 构造正则表达式等价的NFA 构造NFA等价的DFA 化简DFA 根据DFA编写程序,实现词法分析器 提示:本部分内容占学习内容的25%, 考核内容的1/2与本部分相关
16
单词的描述工具
作用: 描述单词的构成规则,基于这类描 述工具建立词法分析技术,进而实现词法 分析程序的自动构造. 工具有: 正规文法 正规式(Regular Expression)
17
正规文法
多数程序设计语言单词的语法都能用正 规文法(3型文法)描述 正规文法回顾 文法的任一产生式α →β 的形式都为 A→aB或A→a,其中A ,B∈VN ,a∈ VT 。
13
举例
它所输出的单词符号是:
基本字if 左括号( 标识符a 大于号> 常数1 右括号) 标识符b 赋值号= 常数10 分号;
14
例如:程序段 if(a>1) b=10; 假定基本字、运 算符、界符都是 一符一种。
(2,) (29,) (10,’a’) (23,) (11,’1’的二进制) (30,) (10,’b’) (17,) (11,’10’的二进制) (26,)
Token
源程序
词法分析程序
get tokenFra bibliotek语法分析程序 ….
6
完全独立方式
采用词法分析工作完全独立的原因: 简化设计,降低语法分析的复杂性 提高编译效率 增加编译系统的可移植性
属性字序列
源程序
词法分析程序
语法分析程序 ….
7
源程序的输入
在内存开辟缓冲区,将程序文本放进该缓冲区 预处理:删除无用字符等 词法分析程序对缓冲区扫描时,设置两个指示器, 一个指向当前正在识别的单词的开始位置,称为 起始指针;另一个用于向前搜索,以寻找单词的 终点,称为扫描指针。
则识别标识符的状态(转换)图:
状态都是非终结符号 S:开始状态 E:终止状态,用双圈表示 I:标识符状态
字母或数字
S
字母
I
数字
E
36
状态转换图——概念1
有限方向图 结点表示状态
有一个起始状态,初态 至少有一个终止状态,终态。用双圆圈表示 状态的数量有限 箭头上有标记
37
状态之间用有方向的边——箭头相连
4
词法分析程序的实现方式
相对独立方式:把词法分析程序作为语法分析 程序的一个独立子程序。语法分析程序需要新 符号时调用这个子程序。 完全独立方式:词法分析程序作为单独一趟来 实现。词法分析程序读入整个源程序,它的输 出作为语法分析程序的输入。
5
相对独立方式
当采用递归下降分析等技术实现一趟编译程 序时常采用这种方式。
21
(e1), e1e2, e1e2, e1 和(L(e1))。
L(e1), L(e1)∪L(e2), L(e1)L(e2)
其中的“”读为“或”(也有使用“+”代替 “” 的); “ ”读为“连接”;“”读为“闭包”(即,任意有限次 的自重复连接)。在不致混淆时,括号可省去,但规定算符 的优先顺序为“”、“ ”、“” 。连接符“ ”一般可 省略不写。“”、“ ”和“” 都是左结合的。
25
例 ={l,d},r=l(l d) 定义的正规 集: {l,ll,ld,ldd,……}(标识符) 例 ={d,.,e,+,-},则上的正规 式 d(.dd )(e(+- )dd )表示 的是无符号数的集合。其中d为0~9的数 字。
26
两个正规式等价
若两个正规式e1和e2所表示的正规集相同, 则说e1和e2等价,写作e1=e2。
第三章 词法分析
词法分析的基本概念 正规式自动机和状态图 词法分析程序的设计
1
学习目标:
掌握:词法分析程序的构造,正规式和正 规文法到有穷自动机的转换, NFA 到 DFA 的 转换、DFA的化简 理解:正规文法、正规式、 DFA 的概念、 NFA的概念 了解:词法分析程序的自动构造工具
状态转换图——概念2
对于字母表∑,我们感兴趣的是它的一些特 殊字集-正规集。
正规集是字母表Σ上的符合一定规则的符号串构成 的集合 正则表达式是一种适合描述符号的表示法,可由它 定义正规集。
20
正规式(regular expression)
定义(正规式和它所表示的正规集):
设字母标为 1 和都是上的正规式,它们所表示的正规集分别为{} 和 ; 2 任何a ,a是上的一个正规式,它所表示的正规集为 {a}; 3 假定e1和e2都是上的正规式,它们所表示的正规集分别 为L(e1)和L(e2),那么,(e1), e1e2, e1e2, e1也都是正规 式,它们所表示的正规集分别为L(e1), L(e1)∪L(e2), L(e1)L(e2)和(L(e1))。(递归) 4 仅由有限次使用上述三步骤而定义的表达式才是上的正 规式,仅由这些正规式所表示的字集才是上的正规集。
A→dA
32
将正规文法转换成正规式 将每条产生式改写为正规式 用代入法解正规式方程组 最后只剩下一个开始符号定义的正规式,其中 不含非终结符 正规文法到正规式的转换规则:
2.