📝 编译器设计教程
153篇技术文档📅  最后修改于: 2021-06-28 07:21:29        🧑  作者: Mango
目标代码生成是编译器的最后阶段。输入:优化的中间表示。输出:目标代码。执行的任务:注册分配方法和优化,汇编级代码。方法:三种流行的寄存器分配和优化策略。实现:算法。目标代码生成使用汇编语言处理,以将优化的代码转换为机器可理解的格式。目标代码可以是机器可读代码或汇编代码。优化代码中的每一行都可以映射到机器(或)汇编代码中的一行或多行,因此存在与它们关联的1:N映射。1:N对应通常假定计算是在称为寄存...
📅  最后修改于: 2021-06-28 07:21:54        🧑  作者: Mango
众所周知,1.2 - 1.0 = 0.2。但是,当您尝试在Python进行相同操作时,您会惊讶于结果:输出:可以将其视为Python的错误,但事实并非如此。这与Python无关,而与底层平台如何处理浮点数有关。在系统内部内部处理浮点数时,通常会遇到这种情况。当浮点数的内部表示使用固定数量的二进制数字表示十进制数时,会导致此问题。很难用二进制表示某个十进制数,因此在许多情况下,它会导致较小的舍入误差...
📅  最后修改于: 2021-06-28 07:22:19        🧑  作者: Mango
变量x的范围是程序的区域,其中x的使用指的是变量的声明。进行范围界定的基本原因之一是使程序不同部分中的变量彼此不同。由于仅有少量的简短变量名,并且程序员共享有关变量命名的习惯(例如,i用于数组索引),因此在任何大小适中的程序中,相同的变量名都将在多个不同的范围中使用。范围界定通常分为两类:1.静态作用域2.动态范围静态作用域:静态作用域也称为词汇作用域。在这种范围内,变量始终指的是其顶层环境。这是...
📅  最后修改于: 2021-06-28 07:22:45        🧑  作者: Mango
错误处理过程的任务是检测每个错误,将其报告给用户,然后制定一些恢复策略并实施它们以处理错误。在整个过程中,程序的处理时间不应太慢。错误是符号表中的空白条目。错误的类型或来源–错误有两种:运行时错误和编译时错误:运行时错误是在程序执行期间发生的错误,通常是由于不利的系统参数或无效的输入数据而发生的。缺少足够的内存来运行应用程序或与另一个程序发生内存冲突以及逻辑错误就是这种情况的示例。当执行的代码未产...
📅  最后修改于: 2021-06-28 07:23:14        🧑  作者: Mango
问题:Lex程序检查给定的数字是否为阿姆斯壮数字。解释:Lex是一个生成词法分析器的计算机程序,由Mike Lesk和Eric Schmidt编写。 Lex读取指定词法分析器的输入流,并输出以C编程语言实现词法分析器的源代码。描述:阿姆斯壮数字是一个数字,该数字是其自己的数字之和,每个数字均提高为数字的幂。例如,153是阿姆斯特朗编号,例子:执行:输出:...
📅  最后修改于: 2021-06-28 07:23:37        🧑  作者: Mango
我们已经讨论了有关语法分析的以下主题。语法分析导论为什么要先跟从?语法分析中的第一组在这篇文章中,将讨论“跟随集”。跟随(X)是可以以某种句子形式立即出现在非终端X右侧的一组终端。例子:计算跟随集的规则:范例1:范例2:范例3:笔记 :Є作为FOLLOW并不表示任何含义(Є是一个空字符串)。$被称为end-marker,它代表输入字符串,因此在解析时使用以指示输入字符串已被完全处理。上面使用的语法...
📅  最后修改于: 2021-06-28 07:23:57        🧑  作者: Mango
Lex是一个生成词法分析器的计算机程序,由Mike Lesk和Eric Schmidt编写。 Lex读取指定词法分析器的输入流,并输出以C编程语言实现词法分析器的源代码。让我们看看如何使用Lex计算行,空格和制表符的数量。例子:下面是实现:C输出:想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。...
📅  最后修改于: 2021-06-28 07:24:16        🧑  作者: Mango
语法符号X的FIRST(X)是从X派生的字符串开始的终端集合。计算FIRST集的规则:如果x是终端,则FIRST(x)= {‘x’}如果x->Є是生产规则,则将add添加到FIRST(x)。如果X-> Y1 Y2 Y3….Yn是一个产品,FIRST(X)= FIRST(Y1)如果FIRST(Y1)包含Є,则FIRST(X)= {FIRST(Y1)–Є} U {FIRST(Y2)}如果FIRST(Y...
📅  最后修改于: 2021-06-28 07:24:59        🧑  作者: Mango
在本文中,我们将概述运算符优先级解析器,并主要关注运算符优先级解析器的作用。并且还将介绍构建优先级函数的算法,最后将讨论运算符优先级解析中的错误恢复。让我们一一讨论。介绍 :运算符优先级解析器,用于运算符优先级语法。运算符优先级语法是一种不包含ε产生式且在任何产生式的RHS上不包含两个相邻非终结点的语法。优先级规则提供了运算符优先级语法。运算符优先级语法可以是模棱两可的或模棱两可的。运算符优先级解...
📅  最后修改于: 2021-06-28 07:25:23        🧑  作者: Mango
在编译器的分析综合模型中,编译器的前端将源程序转换为独立的中间代码,然后编译器的后端使用此中间代码生成目标代码(机器可以理解) )。使用机器独立的中间代码的好处是:由于机器独立的中间代码,可移植性将得到增强。例如,假设如果编译器将源语言翻译成目标机器语言而没有生成中间代码的选项,那么对于每台新机器,一个完整的本机编译器就是必需的。因为,显然,根据机器规范,编译器本身进行了一些修改。重新定位很方便通...
📅  最后修改于: 2021-06-28 07:25:45        🧑  作者: Mango
当将输入字符串(源代码或某种语言的程序)提供给编译器时,编译器会从词法分析(扫描输入并将其划分为标记)到目标代码生成的多个阶段进行处理。语法分析或解析是第二阶段,即在词法分析之后。它检查给定输入的句法结构,即给定输入是否使用正确的语法(输入所用语言的语法)。它是通过建立一个数据结构(称为“解析树”或“语法树”)来实现的。通过使用语言的预定义语法和输入字符串来构造解析树。如果可以在语法树的帮助下(在...
📅  最后修改于: 2021-06-28 07:26:05        🧑  作者: Mango
语义分析是编译器的第三阶段。语义分析可确保程序的声明和语句在语义上是正确的。它是语法在需要时由解析器调用的过程的集合。前一阶段的语法树和符号表都用于检查给定代码的一致性。类型检查是语义分析的重要部分,其中编译器确保每个运算符具有匹配的操作数。语义分析器:它使用语法树和符号表来检查给定程序在语义上是否与语言定义一致。它收集类型信息并将其存储在语法树或符号表中。此类型信息随后在中间代码生成期间由编译器...
📅  最后修改于: 2021-06-28 07:26:30        🧑  作者: Mango
问题:YACC程序实现计算器并识别有效的算术表达式。解释:Yacc(表示“另一个编译器”。)是Unix操作系统的标准解析器生成器。 yacc是一个开源程序,它使用C编程语言为解析器生成代码。首字母缩略词通常用小写字母表示,但有时被视为YACC或Yacc。例子:词法分析器源代码:解析器源代码:输出:...
📅  最后修改于: 2021-06-28 07:26:52        🧑  作者: Mango
增量编译器是一种为一个语句或一组语句生成代码的编译器,该代码独立于为其他语句生成的代码。例子 :C / C++ GNU编译器, Java Eclipse平台等增量编译器就是这样一种编译方案,其中仅重新编译已修改的源文本并将其与先前编译的代码合并,以形成新的目标代码。因此,增量编译器可避免在某些修改后重新编译整个源代码。而是仅对源程序的修改部分进行编译。需要增量编译器:程序员的大部分时间都花在了如下...
📅  最后修改于: 2021-06-28 07:27:14        🧑  作者: Mango
给定一个文本文件作为输入,任务是用文件中的另一个单词替换给定的单词。Lex是一个生成词法分析器的计算机程序,由Mike Lesk和Eric Schmidt编写。Lex读取指定词法分析器的输入流,并输出以C编程语言实现词法分析器的源代码。先决条件:Flex(快速词法分析器生成器)方法:众所周知,yytext拥有当前匹配令牌的值,我们可以将其与要替换的word进行比较。如果yytext的值和要替换的单...