编译原理第四章剖析.ppt

  1. 1、本文档共71页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理 第一章 编译程序概述 第二章 PL/0编译程序的实现 第三章 文法和语言 第四章 词法分析 第五章 自顶向下语法分析方法 第六章 自底向上优先分析方法 第七章 LR分析方法 第八章 语法制导翻译和中间代码生成 第九章 符号表 第一○章 代码优化 第一一章 代码生成 单词的描述工具 某种程序设计语言中的所有单词构成一种语言。该语言的语法都能用正规文法表示。正规文法是描述单词的一种工具。 1、正规文法(回顾) 文法G=(VN,VT,P,S),P中每一规则有A→aB或A→a ,A,B?VN,a?VT*,称G(S)是正规文法。 标识符 →l|l 字母数字 字母数字 → l|d|l字母数字| d 字母数字 无符号整数 → d|d无符号整数 l表示a-z中的任何英文字母,d表示0-9中的任何数字 由正规文法产生的语言称为正规集 2、正规式(正则表达式) 是表示正规集的工具,也是用以描述单词符号的方便工具。 ? ? a b ----------- (a) 一个正规式可以表示若干个符号串, (b) 其正规集就是这些符号串的集合 a|b ab a* b* ------------------- (a|b)* a*|b* aba* (a|b)*(aa|bb) (a|b)* ? {?} ? ? a {a} b {b} ----------- (a) {a} 一个正规式可以表示若干个符号串, (b) {b} 其正规集就是这些符号串的集合 a|b {a,b} ab {ab} a* {?,a,aa,aaa,aaaa,….} b* {?,b,bb,bbb,bbbb,….} ------------------- (a|b)* a和b组成的所有串 a*|b* {?,a,aa,aaa,aaaa,….,b,bb,bbb,bbbb,….} aba* 以ab开头后接若干个(包括0个)a组成的串 (a|b)*(aa|bb) (a|b)* ?*上所有含有两个相继的a或两个相继的b组成的串 自动识别单词的方法: (1)把单词的结构用正规式描述; (2)把正规式转换为一个NFA; (3)把NFA转换为相应的DFA; (4)基于DFA构造词法分析程序。 NFA 转换为等价的DFA 从NFA的矩阵表示中可以看出,表项通常是一状态的集合,而在DFA的矩阵表示中,表项是一个状态,NFA到相应的DFA的构造的基本思路是: DFA的每一个状态对应NFA的一组状态. DFA使用它的状态去记录在NFA读入一个输入符号后可能达到的所有状态. 定义对状态集合I的几个有关运算: 1. 状态集合I的ε-闭包,表示为ε-closure(I),定义为一状态集,是状态集I中的任何状态S经任意条ε弧而能到达的状态的集合。 状态集合I的任何状态S都属于ε-closure(I)。 2. 状态集合I的a弧转换,表示为move(I,a)定义为状态集合J,其中J是所有那些可从I中的某一状态经过一条a弧而到达的状态的全体。 状态集合I的有关运算的例子 I={1}, ?-closure(I)=?; I={5}, ?-closure(I)=?; move({1,2},a)=? ?-closure({5,3,4})=?; 状态集合I的有关运算的例子 I={1}, ?-closure(I)={1,2}; I={5}, ?-closure(I)={5,6,2}; move({1,2},a)={5,3,4} ?-closure({5,3,4})={2,3,4,5,6,7,8}; NFA确定化算法: 假设NFA N=(K, ?,f,K0,Kt)按如下办法构造一个DFA M=(S, ?,d,S0,St),使得L(M)=L(N): 1. 构造DFA M的状态,选择NFA N的状态的一些子集构成: M的状态集S由K的一些子集组成。用[S1 S2... Sj]表示S的元素,其中S1, S2,,... Sj是K的状态。并且约定,状态S1, S2,,... Sj是按某种规则排列的,即对于子集{S1, S2}={ S2, S1,}来说,S的状态就是[S1 S2]; 2 M和N的输入字母表是相同的,即是?; 构造DFA M的转换函数,根据新构造的状态和字母表中的字符构造: 转换函数是这样定义的: d([S1 S2,... Sj],a)= [R1R2... Rt] 其中 {R1,R2,... , Rt} = ?-closure(move({S1

文档评论(0)

558411 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档