编译原理归纳学习——去除晦涩

NFA

1. (a|b)*ab的NFA

2. aa*|bb*的NFA

DFA

1. (a|b)*ab的DFA    

NFA到DFA的变换

从NFA构造等价的DFA的一般思想是让新构造的DFA的每个状态代表NFA的一个状态集,这个DFA用它的状态去记住该NFA在读入符号后能到达的所有状态。

写一个文法,使其语言是奇数集,且每个奇数不以0开头。

解:文法G(N):

       N→AB|B

       A→AC|D

       B→1|3|5|7|9

       D→B|2|4|6|8

       C→0|D

First集合的求法

First集合最终是对产生式右部的字符串而言的,但其关键是求出非终结符的First集合,由于终结符的First集合就是它自己,所以求出非终结符的First集合后,就可很直观地得到每个字符串的First集合。

1.  直接收取:对形如U-a?的产生式(其中a是终结符),把a收入到First(U)中 2.  反复传送:对形入U-P?的产生式(其中P是非终结符),应把First(P)中的全部内容传送到First(U)中。 Follow集合的求法:

Follow集合是针对非终结符而言的,Follow(U)所表达的是句型中非终结符U所有可能的后随终结符号的集合,特别地,“#”是识别符号的后随符。 1.  直接收取:注意产生式右部的每一个形如“?Ua?”的组合,把a直接收入到Follow(U)中。 2.直接收取:对形如“?UP?”(P是非终结符)的组合,把First(P)除ε直接收入到Follow(U)中。

3.反复传送:对形如P-?U的产生式(其中U是非终结符),应把Follow(P)中的全部内容传送到Follow(U)中。(或 P-?UB且First(B)包含ε,则把First(B)除ε直接收入到Follow(U)中,并把Follow(P)中的全部内容传送到Follow(U)中)

例1:判断该文法是不是LL(1)文法,说明理由 S→ABc A→a|ε B→b|ε?

First集合求法就是:能由非终结符号推出的所有的开头符号或可能的ε,但要求这个开头符号是终结符号。如此题A可以推导出a和ε,所以FIRST(A)={a,ε};同理FIRST(B)={b,ε};S可以推导出aBc,还可以推导出bc,还可以推导出c,所以FIRST(S)={a,b,c}。

Follow集合的求法是:紧跟随其后面的终结符号或#。但文法的识别符号包含#,在求的时候还要考虑到ε。具体做法是把所有包含你要求的符号的产生式都找出来,再看哪个有用。 Follow(S)={#} 如求A的,产生式:S→ABc A→a|ε ,但只有S→ABc 有用。跟随在A后年的终结符号是FIRST(B)={b,ε},当FIRST(B)的元素为ε时,跟随在A后的符号就是c,所以 Follow(A)={b,c} 同理Follow(B)={c}

消除左递归的例子:

提取公共左因子:

LL(1)文法:

LL(1)文法预测分析法:

文法(4 1)‘

1
E→TE′

2 E′→ATE′|ε

3 T→FT′

4 T′→MFT′|ε

5 F→(E)|i

6 A→+|-

7 M→*|/

再考虑文法(4 1)′,首先分别求出各个FIRST集和FOLLOW集如表41所示,再构造相应的LL(1)分析表如表42所示。现以输入符号串i+i*i为例,列出识别此符号串的过程如表43所示。

上面的算法对应课本上的晦涩讲解为:

(1) 若a∈FIRST(γi),则置M[A,a]=“A→γi”;

(2) 若ε∈FIRST(γj),且a∈FOLLOW(A),则置M[A,a]=“A→γj”;

(3) 除上述两种情况外,其余的一切表元素均置为“出错”。

注:M为LL(1)分析表

再来一个例子加深印象:

文法:

各个非终结符的first集合:

关于follow集合我们只要考虑有可能变成空转换的非终结符:

根据FIRST集和FOLLOW集可以生成一张LL(1)文法的预测分析表:

预测分析表法的分析过程:

要以表格的形式,列出分析栈的变化,输入,和输出动作:

以下是上面的文法对于id+id*id串的分析过程

时间: 2024-10-02 18:04:17

编译原理归纳学习——去除晦涩的相关文章

编译原理之我见

经过网上的调查,我发现编译原理并不像我所想象的那样简单,我以为编译原理其实就是像塑造一个翻译师一样,赋予它翻译的架构即可,但是经过调查后,结果却不是我所想,编译原理就是将高级语言翻译成计算机语言(即计算机所能识别的二进制代码)所遵守的规律,让电脑可以懂得高级语言所能表达的东西,内容包括语言和文法,词法分析,语法分析,语法制导编译,中间代码生成,存储管理,代码优化和目标代码生成.编辑原理是计算机专业的一门重要课,旨在介绍编译程序构造的一般原理和方法.编译原理及技术从本质上来讲就是一个算法问题而已,

了解编译原理-笔记小结

这是之前学习编译原理过程中做下的笔记. 因能力有限,在很多地方都理解不到位,特别是对于词法分析与语法分析的过程感觉特别晦涩. 分享这个笔记也是为了自己做个总结,算是一个小的提纲吧,都没怎么深入解析编译的过程. 等以后领悟更多了再作补充吧. 希望各路人士能多加指点,谢谢. 词法分析 作用:将输入转换为一个一个的token,而其用一串整数来表示. 协作:只有当解析器需要的时候才会请求词法分析器,继续扫描输入流,在这个过程中将不断生成符号表. 实现:在通常的编程语言中,相对于不确定的有限自动机(NFA

linux下编译原理分析

linux下编译hello.c 程序,使用gcc hello.c,然后./a.out就可以运行:在这个简单的命令后面隐藏了许多复杂的过程,这个过程包括了下面的步骤: ====================================================================================== 预处理: 宏定义展开,所有的#define 在这个阶段都会被展开 预编译命令的处理,包括#if #ifdef 一类的命令 展开#include 的文件,像上面h

学了编译原理能否用 Java 写一个编译器或解释器?

16 个回答 默认排序? RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和解释器.其实用什么语言来实现编译器并不是最重要的部分(虽然Java也不是实现编译器最方便的语言),最初用啥语言都可以. 我在大学的时候,我们的软件工程和计算机科学的编译原理课的作业好像都是可以用Java来写的.反正我印象中我给这两门课写的作业都是用的Java. ===================

编译原理123

1.编译原理就是什么? 个人理解,编译就是像翻译一样,将一种语言翻译成另一种语言,编译就是将高级语言或汇编语言翻译成电脑能识别的二进制机器语言,编译原理就是讲解这 个编译的过程.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 编译原理是计算机专业设置的一门重要的专业课程.虽然只有少数人从事编译方面的工作,但是这门课在理论.技术.方法上都对学生提供了系统而有效的训练,有 利于提高软件人员的素质和能力. 2.学习编译原理有什么好处? 学习编译原

编译原理的理解

编译原理内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成.大一点的应用可以做到一定的技术先进性,从而让你在本行业站稳脚跟:分析和分解用户输入的SQL语句,理解是否有害和是否有SQL注入等.如果不学,对于不是不是本行业的人来说就没损失,如果是本行业的专业人士,不学只会令自己的编译理解更慢.

编译原理

1.编译原理是什么? (1)就是对程序语言进行翻译: (2)介绍编译程序构造的原理和基本方法: (3)从本质上讲是一个算法问题: 2.学习编译原理有什么好处? (1)接触一些新的算法,如,贪心算法,图论算法等: (2)学习一些新的思想,如,有限状态机,递归下降等: (3)多了一项技能: 3.不学有什么损失? (1)将来出社会可能比较难混: (2)不学好这门课程期末可能不及格: (3)有学不一定有用,不学肯定没用: 4.如何学习编译原理? (1)上课跟上老师的步伐,课前预习,课后复习: (2)多从

编译原理第二次作业 编译器任务总结

在学习了编译原理后我开始明白编译的工作原理了,也更了解编译语言的结构.明白了编译器的编写中需要注意的各项问题,更了解了编译器的编译过程为我之后的编程提供了一些必不可少的经验,还是我的改错能力有所提高.因为写编译器使我在编程发生错误后能及时了解程序在编译过程中的原理是什么,这样我就能知道我的程序是何处的问题. 而且在学习编译原理的时候,学到了一些比较难理解的东西,通过实践不断地消化书本上的理论,最终就会有一个雏形出现.而且在编写的过程时候有一些不知道如何解决的问题时,我就会和组员讨论以得出一个可行

编译原理简单介绍

编译原理学习导论 大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了研究生入学考试的必考内容.编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂.我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了.在20世纪50年代,编译器的编写一直被认为是十分困难的事情,第