📝 编译器设计教程

153篇技术文档
  YACC程序,用于二进制到十进制的转换

📅  最后修改于: 2021-06-28 07:08:56        🧑  作者: Mango

问题:编写用于二进制到十进制转换的YACC程序。解释:Yacc(表示“另一个编译器”。)是Unix操作系统的标准解析器生成器。 yacc是一个开源程序,它使用C编程语言为解析器生成代码。首字母缩略词通常用小写字母表示,但有时被视为YACC或Yacc。例子:词法分析器源代码:解析器源代码:输出:...

  编译器设计中的解析器类型

📅  最后修改于: 2021-06-28 07:09:19        🧑  作者: Mango

解析器是编译器的阶段,该阶段将令牌字符串作为输入,并在现有语法的帮助下将其转换为相应的解析树。解析器也称为语法分析器。解析器的类型:解析器主要分为两类:自上而下的解析器和自下而上的解析器。这些解释如下。1.自上而下的解析器:自上而下的语法分析器是一种语法分析器,它通过扩展非终结符来借助语法生成为给定的输入字符串生成解析,即它从起始符号开始并在终结符上终止。它使用最左导数。进一步的自上而下的解析器分...

  Lex程序计算文件中给定单词的频率

📅  最后修改于: 2021-06-28 07:09:41        🧑  作者: Mango

问题:给定一个文本文件作为输入,任务是计算文件中给定单词的出现频率。解释:Lex是一个生成词法分析器的计算机程序,由Mike Lesk和Eric Schmidt编写。 Lex读取指定词法分析器的输入流,并输出以C编程语言实现词法分析器的源代码。方法:众所周知,yytext拥有当前匹配令牌的值,我们可以将其与要计数其频率的单词进行比较。如果yytext的值与给定的单词相同,则增加count变量。输入...

  编译器设计中的代码优化

📅  最后修改于: 2021-06-28 07:10:09        🧑  作者: Mango

综合阶段的代码优化是一种程序转换技术,该技术试图通过使中间代码消耗较少的资源(即CPU,内存)来改进中间代码,以便产生运行速度更快的机器代码。编译器优化过程应满足以下目标:优化必须正确,不得以任何方式改变程序的含义。优化应提高程序的速度和性能。编译时间必须保持合理。优化过程不应延迟整个编译过程。何时进行优化?代码优化通常在开发阶段结束时执行,因为它会降低可读性并添加用于提高性能的代码。为什么要优化...

  用于十进制到十六进制转换的Lex程序

📅  最后修改于: 2021-06-28 07:10:29        🧑  作者: Mango

问题:编写一个Lex程序以进行十进制到十六进制的转换。解释:Lex读取指定词法分析器的输入流,并输出以C编程语言实现词法分析器的源代码。函数yylex()是运行规则部分的主要flex函数。先决条件:Flex(快速词法分析器生成器)例子:执行:输出:想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。...

  语言处理器:汇编器,编译器和解释器

📅  最后修改于: 2021-06-28 07:10:52        🧑  作者: Mango

语言处理器–汇编语言是与机器相关的,但用于表示指令的助记符不能被机器直接理解,而高级语言则与机器无关。计算机可以用机器代码(即0和1的形式)理解指令。直接用机器代码编写计算机程序是一项繁琐的任务。这些程序主要用Java,C++, Python等高级语言编写,被称为源代码。这些源代码无法由计算机直接执行,必须将其转换为机器语言才能执行。因此,使用特殊的翻译器系统软件将以高级语言编写的程序翻译为机器代...

  非递归预测解析算法

📅  最后修改于: 2021-06-28 07:11:25        🧑  作者: Mango

先决条件–自上而下的解析器分类Predictive解析是递归下降解析的一种特殊形式,不需要回溯,因此可以预测使用哪个生产来替换输入字符串。非递归预测分析或表驱动的也称为LL(1)解析器。该解析器遵循最左边的导数(LMD)。预测解析过程中的主要问题是确定要应用于非终端的产品。此非递归解析器查找要在解析表中应用的生产。 LL(1)解析器具有以下组件:非递归预测解析算法:主要概念->借助FIRST()和...

  编译器设计中的输入缓冲

📅  最后修改于: 2021-06-28 07:11:52        🧑  作者: Mango

词法分析器一次从左到右扫描一个字符。它使用两个从ptr(bp)开始并向前的指针来跟踪已扫描输入的指针。最初,两个指针都指向输入字符串的第一个字符,如下所示前进的ptr继续搜索词尾的结尾。遇到空格后,它指示勒克姆结束。在上面的示例中,ptr(fp)遇到空白时,立即识别了词素“ int”。fp将在空白处向前移动,当fp遇到空白时,它将忽略并向前移动。然后在下一个标记处设置begin ptr(bp)和f...

  LL(1)解析表的构造

📅  最后修改于: 2021-06-28 07:12:26        🧑  作者: Mango

先决条件–自上而下的解析器的分类,第一个集合,第二个集合自上而下的解析器从开始非终端开始,自上而下地构建解析树。自上而下的解析器有两种类型:具有回溯功能的自上而下的解析器自上而下的解析器,无回溯没有回溯的自上而下的解析器可以进一步分为两部分:在本文中,我们将讨论非递归下降,也称为LL(1)解析器。LL(1)解析:这里的第一个L表示输入的扫描将以从左到右的方式进行,第二个L表示在此解析技术中,我们将...

  编译器设计中的语法定向翻译

📅  最后修改于: 2021-06-28 07:12:50        🧑  作者: Mango

背景:解析器使用CFG(Context-free-Grammer)来验证输入字符串并为编译器的下一阶段生成输出。输出可以是解析树或抽象语法树。现在,为了使语义分析与编译器的语法分析阶段交织在一起,我们使用“语法定向翻译”。定义语法定向翻译是语法的扩充规则,可促进语义分析。 SDT涉及以附加在节点上的属性的形式自下而上和/或自上而下地从解析树传递信息。语法定向的转换规则使用1)节点的词汇值,2)常量...

  Lex程序检查输入是否为数字

📅  最后修改于: 2021-06-28 07:13:11        🧑  作者: Mango

Lex是一个生成词法分析器的计算机程序。 Lex读取指定词法分析器的输入流,并输出以C编程语言实现词法分析器的源代码。先决条件:Flex(快速词法分析器生成器)。给定输入,任务是检查输入是否为数字。例子:下面是实现:输出:...

  综合属性和继承属性之间的差异

📅  最后修改于: 2021-06-28 07:13:35        🧑  作者: Mango

在“语法定向定义”中,使用了两个属性,一个是“合成”属性,另一个是继承的属性。如果某个属性的解析树节点值由子节点处的属性值确定,则该属性被称为“合成”属性;而如果其解析树节点值由父节点和/或同级节点中的属性值确定,则该属性被称为“继承”属性。节点。现在,我们将看到综合属性和继承属性之间的比较。这两个属性之间的比较如下:S.NOSynthesized AttributesInherited Attr...

  YACC程序检查给定的字符串是否是回文

📅  最后修改于: 2021-06-28 07:13:57        🧑  作者: Mango

问题:编写YACC程序以检查给定的字符串是否为回文。解释:Yacc(表示“另一个编译器”。)是Unix操作系统的标准解析器生成器。 yacc是一个开源程序,它使用C编程语言为解析器生成代码。首字母缩略词通常用小写字母表示,但有时被视为YACC或Yacc。例子:词法分析器源代码:解析器源代码:输出:...

  交叉汇编器和编译器之间的区别

📅  最后修改于: 2021-06-28 07:14:19        🧑  作者: Mango

1.交叉汇编器:交叉汇编程序是在具有一种类型的处理器的计算机上运行但为另一种类型的处理器生成机器代码的汇编程序。例如,如果我们使用具有8086兼容机器语言的PC来生成8085处理器的机器代码,则需要在PC兼容机器上运行但生成8085助记符的机器代码的交叉汇编程序。它以汇编语言为输入,并以机器语言为输出。图–交叉汇编器在上面的框图中,我们可以看到在机器B上运行了一个汇编程序,但是将机器A的汇编代码转...

  静态分配和堆分配之间的区别

📅  最后修改于: 2021-06-28 07:14:39        🧑  作者: Mango

静态分配:静态分配是一种分配过程,用于在编译时分配所有数据对象。在这种分配类型中,数据对象的分配仅在编译时完成。如同在静态分配中一样,编译器决定了无法随时间更改的存储范围,因此,在以后的阶段,编译器很容易知道激活记录中的这些数据对象的地址。静态分配是在FORTRAN中实现的。堆分配:堆分配是一种分配过程,其中堆用于管理内存分配。堆有助于管理动态内存分配。在堆分配中,与堆栈分配相同,也可以创建动态数...