Compiler construction 什么是符号分辨率?

这似乎是每个人都在谈论但没有人定义的事情之一……我似乎找不到关于这个话题的任何信息。什么是符号分辨率?这是我发现的最好的东西: 这与您的程序是如何编译的有关吗?好吧,既然您提到了Unix的nm,我可以精确地指出符号分辨率 可执行文件可以引用未在其内部定义的实体。例如,共享库上的变量或过程。这些实体由外部符号标识。可执行文件也可能具有可由外部文件引用的内部符号——当然,库也是如此 在此上下文中,符号解析是指一旦程序加载到内存中,就为它所引用的所有外部实体分配适当的地址。这意味着更改加载程序中引用外

Compiler construction 如何将MDSD与模型解释编码风格进行比较

希望这个问题不会太笼统: 传统上,定义为将模型规范转换为可编译程序源 除此之外,还可以解释模型 虽然解释通常较慢,但更新模型的部署可能更简单 一般来说:为什么要使用MDSD编译模型?什么时候应该解释模型?您所说的是“可执行规范”。当你的规范完成时,这是可行的(例如,覆盖所有的情况;许多当前的模型)不完整,或者仅仅是由于中间的附加java源代码文本,这是不容易解释的),而且你的解释程序足够快,所以用户基础不关心。 但这就是问题所在。编译器存在的全部原因是因为解释规范通常比编译的等效规范慢100倍。

Compiler construction 基于TI微控制器的Opencv

是否有适用于微控制器的OpenCV交叉编译器 谢谢OpenCV交叉编译器?呃。。。我不确定这样的东西是否存在!让我们不要将跨编译器(如gcc)与OpenCV混合使用,OpenCV是一个用于计算机视觉的跨平台库 但是,如果您是指为微控制器编译的OpenCV,您可能会发现一些用于您正在使用的平台的预构建二进制文件,但这些都不是OpenCV开发人员的官方版本 讨论在微控制器上使用OpenCV时遇到的一些挑战: 您将遇到的主要问题是OpenCV使用浮点数学,而大多数微控制器只有定点乘法器,因此您必须转换

Compiler construction 在库源代码中实现Eiffel/circular定义中的基元类型

我是埃菲尔铁塔的新手,我试图了解“基本”类型(例如,INTEGER_32、REAL_64等)是如何实现的。我被埃菲尔图书馆类源文件中的循环依赖项弄糊涂了 基本类型实现为非扩展父类的“扩展”版本。例如,INTEGER_32是INTEGER_REF_32的扩展子级。(请注意,“扩展”并不意味着“的实例”。扩展类是类,而不是对象。) 整数\u REF\u 32包含扩展整数\u 32的实例。在integer\u REF\u 32对象中的某个地方必须有一个扩展整数,这是有道理的,但在这里,这意味着父对象包

Compiler construction 句法定向翻译

我需要语法指导翻译方面的帮助。我不知道如何分解语法,这样我就可以为它生成四倍 举个例子: S ::= If E then S1 else S2 被分解成这个(因为我们不知道跳转目标) 1.:=S2 2. ::= S1其他 3. ::= 如果E那么 分解时的一般方法是什么?通常,在可能需要生成代码的位置将每个语法构造分开(如您在if-then-else中所演示的),并将代码生成操作附加到解析器的语法规则简化操作 虽然您可以这样做,但您将得到相当笨拙的代码;从根本上说,您最终将实现一个堆

Compiler construction 关于构建非常基本的编译器的问题

为了好玩和练习,我想用Java构建一个非常简单的编程语言和编译器。我将描述我的设计思想,然后问一些关于它的问题。感谢您的帮助: 设计: 用这种语言编写的程序将运行在我将创建的一个简单的虚拟机上 编写和运行程序的步骤: 程序员在编译器中编写代码,这是一种IDE。 编译过程如下: 编译器扫描代码,并将每一行转换为操作代码。例如,如果代码行是:print hello,编译器会将其转换为类似于phello的内容-这将是 操作码 扫描完整个代码后,我们将得到一个字节码文件,由生成的所有操作码组成 这个字节

Compiler construction 编译器和编程语言设计(只是好奇)

这是我最近一直在思考的一个问题。作为一名计算机工程专业的学生,我想知道计算机科学或计算机工程的哪些领域特别关注编译器,因为: 我将在有一些不同专业的学院学习: -计算机(CPU架构、操作系统、计算机网络、实时系统和一些其他硬件问题,我喜欢的) -软件(软件体系结构、数据库设计、web服务、高级编程概念、分布式系统…) -计算机科学(算法、逻辑、图形、人工智能……我想一切都是纯理论的) 最后一个专业有一个叫做“编译器”的主题,所以我的问题是:编译器只和逻辑、算法和类似的东西相关吗?是否有机会独自或

Compiler construction 如何为编译器捕获令牌

我正在编写一段代码,同时创建自己的编译器。我正在设置一个标记器,用标记a、b、10和12识别dim a[10]、b[12] 我试图让函数识别a、10、b和12作为令牌,代码如下: while (startPos < line.length()) { if (line[startPos] == '[' || line[startPos] == ']' || line[startPos] == ',') { token[tokenNumber] = temp;

Compiler construction Mincaml中需要的alpha转换示例

我有一门关于ocaml/mincaml函数编程的课程,我们讨论了alpha转换。如果我理解得很好,alpha转换的目标是在语法上区分两个不同的变量,这两个变量可能在代码的不同部分被赋予相同的名称,对吗 我的问题是,假设我们在这个话题上都有很好的背景知识,我们的老师进展得相当快,特别是说“你会很容易找到需要alpha转换才能给出正确答案的MinCaml程序。” 我一直在搜索,但我真的不明白,您是否会想到一个例子,或者一个好的在线文档,以帮助我更好地理解这个概念,并提供一些确实需要alpha转换的例

Compiler construction 什么是A-范式?

我在读各种中间表单,但除了类似维基的条目外,我无法获得关于A-normal表单的信息。这里有人知道这件事吗?或者有很好的资源吗?请参阅 计算机科学,行政管理 范式(缩写为ANF)是一种 程序的标准形式,它是 由Flanagan等人于1993年引入 充当中间人 函数编译器中的表示 对进行后续转换的步骤 机器代码更直接 在ANF中,函数的所有参数 一定很琐碎。即评估 每一个论点都必须停止 马上 文法 下面的BNF语法描述了 改进的纯λ-演算 支持ANF的约束条件: 编译器中使用的ANF变体或 在研究

Compiler construction Haskell脱糖策略

我正在为纯功能程序开发一个虚拟机,我希望能够测试和使用各种各样的Haskell模块。VM将非类型化lambda演算中的基本术语作为输入。我想知道从现代Haskell模块(例如使用MPTC、模式保护等)中提取这种表示的好方法是什么。我做了一些研究,但似乎还没有一个工具可以做到这一点(我很高兴弄错了),这没关系。我正在寻找一种方法 GHC核心似乎过于注重操作,特别是因为虚拟机所做的一件事就是显著改变评估顺序。有没有更接近lambda演算的可访问的中间表示法?Hm。。。听说过这个吗?我不知道你需要什么

Compiler construction NetBeans 7 Java使用大型项目在保存时编译

我有一个包含数千个源代码文件的Java项目。对于提供Java源代码的类,我经常在运行时遇到ClassNotFoundException。当我禁用保存时编译时,我没有遇到这个问题,但这是一个有用的特性,我希望启用它 有没有一种方法可以让我告诉NetBeans“我知道你认为这些文件已经编译过了,但无论如何都要安排它们进行编译(或者我希望你重新编译)”NetBeans应该在保存文件后进行编译;未能做到这一点是一个bug,而不是最终用户应该努力解决的问题 但是,可以创建自定义构建脚本,导入build.x

Compiler construction 32位体系结构中64位操作数上的操作?

大多数编译器如何在32位环境中对64位操作数(例如长整数)执行操作?换句话说,有没有一种方法可以在一个步骤中实现这些操作,或者我们需要访问多个内存位置来实现这些操作?它们使用两个寄存器来保存64位的值。一个用于低32位,一个用于高32位 对于x86,64位加法/减法是使用带进位的加法和带借位的减法指令完成的: add %eax, (lower 32-bits of operand) adc %edx, (upper 32-bits of operand) 64位乘法要复杂得多,但也可以

Compiler construction 请参阅前面的./configure选项

我有一个简单的问题 我正试图复制我的一位同事用源代码编译的程序所做的设置。我已经找到了源文件的目录,我想看看他用来进行配置的确切命令 考虑到程序的性质,我猜他没有运行简单的“/configure”。我想知道他使用了哪些选项,例如…/configure--option1--option2,等等 有简单的方法吗?试试/config.status--version

Compiler construction 图着色寄存器分配器

在我的编译器课程中,我正在为MIPS体系结构构建一个基于图着色的寄存器分配器。我正在遵循Muchnick对我的实施的相同处理 Muchnick对如何处理这些分配器中的函数参数有些模糊 我已经做了一些假设,我想我会澄清同样的问题 有一个步骤可以将中级IR转换为低级IR。嵌套函数调用尚未处理。我的想法是从右到左扫描函数调用,并为最内部的向外调用设置IRs。通过这种方式,我可以使用MIPS调用约定,将前几个参数分配给参数寄存器,剩余的参数分配给堆栈,溢出量最小(只有1个) 书中的寄存器合并处理对我来说

Compiler construction 词法分析器:通过有限自动机实现正则表达式?

敬礼 在阅读dragonbook的第3章(词法分析)时,我几乎了解了所有内容(他们如何用正则表达式指定标记),直到他们开始谈论有限自动机。这似乎是描述词汇分析器的一个重要部分 现在我理解了有限自动机的概念,但我不明白它在词法分析器中的作用和用法?为什么不仅仅用正则表达式指定标记 提前感谢。正则表达式可以用有限自动机表示,更精确地说,可以用确定性自动机表示 编写正则表达式时,lexer会将其转换为DFA以在文本中查找匹配项。当然,有限自动机在词汇分析器中有它的作用 有非常简单的算法可以将正则表达式

Compiler construction 如何从windows命令行执行FreePascal作为;fpc“;

我注意到有一个地方,他们可以从windows命令行将FreePascal编译器称为“fpc”,如: fpc my_program_source.pas 如何做到这一点?是不是某个命令分配了“command=>exeFile” 谢谢。下面是要做的: 在计算机上查找FPC.EXE。蛮力方法是 DIR/S C:\FPC.EXE 转到Windoze控制面板并查找系统。在“高级设置”下,您应该可以找到路径变量 修改路径,使其看起来像 WHEVER-IT-WAS:C:\WHAT\EVER\DIRECT

Compiler construction 直接编码与表驱动lexer?

我是编译器构造领域的新手,我想知道直接编码和表驱动lexer分析器之间的区别是什么 如果可能,请使用简单的源代码示例 谢谢 编辑: 在书中,作者将lexers分为三(3)种类型:表驱动、直接编码和手工编码 我假设您所说的“直接编码”是指手写的词法分析器,而不是作为词法生成器输出的词法分析器。那样的话。。。(见下文。) 。。。表驱动的lexer是一个(通常自动生成)程序,它使用某种查找表来确定要执行的操作。考虑对应于正则表达式 Ab*A < /C>(故意不最小化): 如果我们只考虑字符“a”和“

Compiler construction 编译器如何检测未赋值局部变量的使用?

Java或C#等语言的编译器会抱怨,如果您试图使用尚未(肯定)分配/初始化的局部变量 我想知道这个功能是如何在编译器中实现的。显然,有关变量初始化状态的信息可以保存为布尔标志,并在检测到赋值语句后进行相应设置。但是像循环体或条件语句这样的(嵌套的)子作用域呢?这相对容易。在使用变量之前,每个可能的代码执行路径都必须指向赋值。循环也被视为可能的路径;重复对于这种分析来说并不重要。这可以通过计算活性信息来实现 编译器通常将源代码转换为较低级别的中间表示(IR),将代码划分为基本块(无跳代码),并从中

Compiler construction 在创建二进制文件时,Android编译器如何理解底层不同处理器的指令集?

当我们编译android应用程序时,我们不需要考虑它使用的处理器类型。e、 g.如果应用程序与图像处理相关,则应用程序开发人员不需要知道DSP手机硬件的图像处理器。此外,每部手机将有不同的供应商DSP,这些DSP将有不同的指令集。编译器如何知道这一点?它不知道。它产生解释性字节码。它是适应显示硬件的运行库,而不是编译器。它是Android,顺便说一句:)@500 InternalServerError没有区别。只是不同的字节码。它仍然是字节码,而不是本机代码。@EJP:我知道,我只是指出了OP的

Compiler construction 编程语言的标准库是如何实现的?

我很难理解除了C以外的编程语言的标准库是如何编写的 据我所知,C标准库可以在C和汇编程序的混合体中实现,其中需要汇编程序,以便可以调用系统调用,从而 fopen,fscanf。。。可以使用 其他编程语言如何使用其标准库实现这一功能(处理i/o、文件以及需要系统调用的所有其他内容)?它们都允许像C这样的汇编程序内联,还是有其他方法 我已经读到C及其标准库可以用于实现其他语言库,但我不确定这是如何实现的 edit1.试图更具体一些。 (实现标准库的语言称为new\u lang) 如果有人能详细说明第

Compiler construction 分散代码流的技术?

我想知道是否有一些众所周知的技术可以分散应用程序的代码流。在我的例子中,我想在我自己的字节码上使用它们,字节码由我为一个项目编写的一个小vm执行。我非常有兴趣尝试使用我的字节码流来学习一些关于这种技术的知识。我在inet上搜索了一下,几乎找不到关于它的信息 干杯。几年前,我参与了一个项目,对Flash ActionScript代码进行模糊处理,以破坏反向工程的尝试并确保游戏安全。我们建立了一个工具,每当有人加载游戏时,都会对flash进行模糊处理 实际的混淆是在VM模型上完成的,它基于以下简单的

Compiler construction 如何将基于堆栈的指令转换为基于寄存器的指令?

我的任务是从编译器设计学校的工作中为类C语言生成mips指令。从计算机体系结构中,我们了解到mips是一个基于寄存器的指令集,它显式地管理32个左右的通用寄存器。当我从词法分析、构建AST到生成真实代码的过程中,我发现基于寄存器的指令非常难以想象。由于我目前正在关注Python解释器的编译器部分的设计,我发现它基于堆栈的字节代码非常容易理解和实现。然而,我正在学习的课程需要3地址中间代码,最后是mips代码 下面是我发现基于堆栈的代码容易而基于寄存器的代码难的原因: 基于堆栈的代码基本上只是推

Compiler construction 汇编语言程序设计

我试图写一个程序,输入一个小于10的正数,然后输出第一个数的和。例如,5将是5+4+3+2+1。命令包括停止、加载、存储、添加、求和、乘、除、输入、输出、分支、分支(如果为0)和分支(如果为非0)。有人能帮我吗。我有点卡住了。我写的是: IN n LD n ADD sum STO sum LD n SUB one ADD sum STO sum BRG

Compiler construction Lisp编译器设计

我在找一本编译器设计书。我在大学里学的;但讲座从来不是为我准备的。此外,在我的大学里,他们没有做太多的实际工作。我相信,即使我认真学习有限自动机和编译器设计的课程,我也不会知道如何实现编译器。因此,我正在寻找有关实现编译器的书籍。我觉得“现代编译器实现”很好。它有三种语言可供选择,我选择了C语言书,因为C语言是一种小型语言,我要做的事情更多,在做的过程中要学的东西也更多。然而,我想学习为Lisp或python设计编译器的课程[可能也使用相同的语言];但我找不到太多可用的材料。Lisp是一种古老的

Compiler construction 获取Delphi源代码,然后将其转换为Objective-C代码的程序是编译器吗?还是源代码转换器?

我在工作中卷入了这场争论。我的同事告诉我,生成机器代码的东西就是编译器。然后(在我提到谷歌闭包编译器之后)他改变了主意:显然,对他来说,编译器是用任何语言生成优化的源代码的东西(这没有意义,因为优化是编译器的可选步骤。)他说,一个程序生成,例如,Objective-C代码是源代码转换器,而不是编译器 据我所知,一个用一种语言获取源代码并将其转换成任何语言(不仅仅是机器代码)的程序就是一个编译器。因此,源代码转换器==编译器 那么,什么是编译器?我在其他任务中构建 我们使用的定义是,当您从一种语言

Compiler construction 给定一种语言,定义它的CFG

给定 定义一个CFG,使LG=L1 在我看来,这些作品应该是正确的答案 L1 = {w belongs to {a,b}* | has as many a as b} 我的理由是: L1包含像{ab,aabb,aaabbb 现在我有一个疑问:如果我应用上述成果,简而言之: → aSa 我应用1得到S→ aSa→ aaSaa我选择了2个,我得到了S→ aSa→ aaSaa→ aabSbaa,然后使用空字符串得到最后的字符串S→ aSa→ aaSaa→ aabSbaa→ AAAAA 现在,也许我错

Compiler construction 在Windows XP或Windows 7上编译C

如何在Windows7或WindowsXP上编译C--代码?我想编译一些示例C代码,但上唯一可用的编译器是Linux。在Windows上构建此类东西的最佳方法是使用或。它们旨在为您提供一个与Linux兼容的Windows编译环境。然后,您可以按照Linux指令构建和安装,但生成的工具将在Windows上运行;如您所愿。为什么不暂时从合适的Linux“Live CD”启动您的电脑,这样您就可以使用基于Linux的编译器?假设我有Linux,我应该如何处理c-减号?有IDE吗?如何安装、编译?Hel

Compiler construction 流水线处理器如何保证原子性?

当处理器执行单个指令时,可以假定这是一个原子操作。但是,当处理器使用流水线时,它是如何工作的呢?该指令与许多其他指令以不同的步骤并行执行,分多个步骤执行。但如果其他指令中有一条干扰了我们怎么办?处理器如何“回滚”指令的效果,或完全避免干扰?这是由处理器的设计者定义的,对于每个特定的处理器,它可能是不同的。例如,如果我们采用典型的Intel/AMD x86/x64处理器系列,单个指令并不总是原子指令 您必须始终说出您所谈论的处理器类型。如果它是与x86/x64不同的平台,您可能会在获得更好的答案,

Compiler construction 使用手写编译器生成字节码时如何处理作用域

我已经为一个简单的堆栈机器编写了一个小编译器。它只能通过一些虚拟机黑客来组装和处理范围/功能。也就是说,我让它在字节码本身中定义作用域和作用域内变量定义 我可以得到一些关于如何处理范围的建议吗 我面临的问题主要是,我如何让它知道何时应该和何时不应该用内部变量覆盖外部变量,以及类似的问题。字节码是可变的,我更愿意更改它 其他问题包括如何在返回后将变量保留在外部。所以一个变量仍然有它的值。我可以把它推到堆栈中,但是我可以有很多变量 我认为需要做一些编译器工作来检查这些东西,但我想不出需要做什么来检查

Compiler construction 如果编译器声称是标准兼容的,但它';不是吗?

如果具有国际标准的语言“X”的编译器推销自己并声称它符合标准,但事实并非如此,会发生什么情况?是否有任何法规或惩罚措施来防止这种情况?编译器是商用的还是免费的有关系吗?如果有编译器100%符合相关的语言标准,我会感到惊讶。一些编译器比其他编译器更遵守标准,比如法规和处罚,这是一个许可问题。GPL许可下的自由软件有以下条款。见15。和16 在适用法律允许的范围内,本计划不提供任何担保。除非另有书面规定,否则版权持有人和/或其他方“按原样”提供程序,不提供任何形式的明示或暗示担保,包括但不限于对适销

Compiler construction 使用ANTLR语法来识别不同的函数(函数可能具有相同的起始项,但中间有关键字)

我刚刚遇到了一件令人头痛的事 我尝试将语句拆分为不同的函数,就像我有一个示例语句一样 start n turnTo 's'. n terminate. end 这两个语句都以“n”开头,目前我正在写 statement : (turnTo_statment|terminate_statment)* ; turnTo_statment : variable 'turnTo' '\'' value '\'' '.' ; terminate_

Compiler construction 如何扩展ELF二进制文件

我正在写一个小的仪器工具。我必须在二进制文件中插入插装例程。一个好的方法应该是在一个单独的代码段和一个单独的数据段中插入这些例程,您能解释一下如何实现这一点吗?此外,如何修改原始文件中代码段的大小 最好的 我必须在二进制文件中插入插装例程。一个好的方法应该是将这些例程插入一个单独的代码段和一个单独的数据段中 什么是二进制文件?对可撤销(ET_REL)对象文件执行此操作与对完全链接的可执行文件(ET_EXEC)或共享库(ET_DYN)执行此操作有很大区别 你能解释一下如何做到这一点吗 对于ET\u

Compiler construction 编写编程语言:如何编译 我编写一个简单的编程语言(如果是这样的话,如果是这样的话),来测试我的正则表达式解析技巧,我提出一个问题:我的编译器应该把代码转换成C++代码,然后用G++编译成ELF可执行文件,或者我应该设法把我的语言代码编译成字节码(或者其他什么)。你可以这么做。例如,C++的最初实现(“C带类”)将C++代码转换成C代码,用C语言编译。当然,它不再是这样工作的

最好从GCC或LLVM开始,为您的语言编写一个新的前端,利用现有的代码生成工具为众多的体系结构提供支持。大多数编程语言都不能用普通的旧正则表达式进行解析。是的,这将考验你的技能;你可能会失败;问题是,你学到了什么?人们在做这种练习时反复得到的教训是,编写“编译器”而不关注文献会导致糟糕的结果。而且,没有人感到惊讶。

Compiler construction 用野牛做计算器

这是我的野牛密码。问题是,当我输入例如4+3时,程序检测到语法错误。但当我输入4+3,即数字之间用空格分隔时,它会计算并完美地显示结果。请提示它可能出了什么问题 输入: |输入线 ; 行:新行 |expr新行{cout乍一看,似乎4+3应该标记为{number}{signednumber},而不是{number}{PLUS}{number} 另外,我认为您不应该为有符号的数字使用特殊标记。解析器应该找出这是一元还是二元加减。这是您的全部吗?不,我只是在这里复制了语法规则部分。不确定是否应该将整

Compiler construction 我可以用LLVM作为编译器生成本机代码吗';什么是后端?

我将使用LLVM作为编译器的后端。是否有可能使用LLVM发出纯本机代码,或者我是否应该编写机器代码生成器?您必须为目标机器发出纯本机代码,除非已经有了目标机器。@downvoter这很有趣。这个答案实际上是重言式的。还有第三种选择?“纯本机代码”——与之相对的是什么?当然,您可以发出本机代码(这是LLVM的目的之一)。例如,使用LLVM MCJIT(假设您想要JIT编译)。

Compiler construction 编程语言进化与底层架构

假设我们有一种编程语言foofoo有一个针对系统a的编译器,但没有针对系统B的编译器。现在systemb开发人员可以为foo编写自己的编译器,也可以编写一个systema模拟器,在systemb上运行,并可以使用为systema编写的编译器。emulator的一个明显优点是,它不仅限于运行编译器,还向其他systema特定程序打开systemb。在大多数情况下,明显的缺点是性能和复杂性取决于系统 我感兴趣的是找出哪种方法更容易维护。例如,让php成为所讨论的语言,并假设phc是该语言唯一可用的编

Compiler construction 在哪里为Flex编写规范文件?

我想使用flex bison执行一些模式匹配。我想知道如何使用flex以及在何处为其创建规范文件(工具或软件)。当flex生成令牌时,在何处为bison编写规范文件。我想了解编辑器、IDE或工具。我可以使用Turbo C执行所有任务吗?或者需要什么?这个问题没有得到答案,因为它需要一个入门教程,而且任何搜索引擎都可以在网上找到大量可用的内容 这里有一个很好的教程:它回答了大多数问题 由于bison和flex文件是一个文本文件,它可以被任何文本编辑器修改,例如notepad、notepad++、v

Compiler construction 如何在OCaml编译器中遍历类型化抽象语法树

我试图在OCaml项目中转储所有标识符的类型信息,基本上与遍历类型化抽象语法树()相同。由于我是OCaml编译器代码库的新手,我不确定编译器是否提供了API,以便我们可以轻松编写插件来完成这项工作,或者我们必须破解编译器代码?这又是如何与OCamlbuild交互的?谢谢你的任何提示或建议 OCaml以名为compiler libs的库的形式提供了自己的编译器。它拥有一切,允许从具体的语法转向可执行的,所有中间步骤都在您的控制之下,当然包括typedtree 坏消息是它没有记录在案。我建议您使用u

Compiler construction 什么';当编译器面对代码后面定义的对象的引用时,它会被调用吗?

在设计编译器时,您必须处理一个常见问题:一行代码可能引用后面一行中定义的内容。例如: function f() { return g(5); } function g() { do something; } 第一行是指尚未定义的函数g,因此编译器必须跟踪当前范围内对g的引用。当在下一行定义g时,编译器可以确定前一行引用的内容 这叫什么 我知道在编译器设计中有一个术语,但我就是记不住了。它被称为正向参考。[[1]:@SteveRindsberg,谢谢你的链接,但我想你的评论中有点不对劲。我确

Compiler construction 为什么编译器仅从.cpp文件生成对象文件.o

正如标题所说:为什么编译器只从.cpp文件而不是头文件生成对象文件.o?如果实现在.h文件中,链接器如何知道如何将对象文件链接在一起 为什么编译器只从.cpp文件而不是头文件生成对象文件.o 具体的,我假设编译器是GCC的C++编译器。 编译器将把头文件编译成目标文件,如果您 很明显,这才是你真正想要的 标题.h #ifndef HEADER_H #define HEADER_H #include <iostream> inline void hw() { std::co

Compiler construction 的$0没有声明的类型

Bison编译器返回“例程”没有声明类型的错误$0。我正试图打印一条声明函数的消息,因此在打印函数体之前,我必须先打印大括号。我阅读了文档,从该页面找到了一个解决方案:因此我尝试将其应用于我的问题: fun_decl : type routine fun {end_fonction();}; routine : {declare_fonction($0);}; 我还为非终端“type”指定了一个类型: %type <type_object> type %类型

Compiler construction 在Scheme中,`(begin)`的返回值是多少?

我知道(begin expr1 expr2…将计算所有表达式并返回最后一个计算的表达式 我发现在Chez方案中,允许使用begin而不使用这样的表达式:(begin)。我把Chez计划作为我学习的一部分。当我在控制台中写入(begin)时,它不会发送语法错误,它只是不显示任何内容,就好像我正在获取void 我的问题是,到时会返回什么? 我认为通过运行(void)可以获得void对象。 然而,当我测试它时,我意识到它不是 我正在学习Chez Scheme,这是我正在学习的编译器课程的一部分,我需要

Compiler construction 如何使用有限自动机实现扫描仪

我正在制作一个简单的扫描仪。假设为我的语言定义了以下标记: !, !=, !==, <, <<, { !,!=,!= 最常见的规则是“maximalmunch”,它总是选择尽可能长的令牌 一般来说,使用DFA扫描单个令牌的算法如下:(要对输入进行令牌化,重复此算法,直到到达输入端,每次扫描从上一次扫描留下的输入光标开始。) 将DFA状态设置为启动状态。然后,对于顺序中的每个输入字符: 如果DFA在角色上有转换,则移动到IIindicated状态。如果该状态为接受状态,则记录

Compiler construction ocaml编译器是使用编译器前端模块解析来解析源代码还是使用ocamlyacc来解析源代码?

我试着阅读ocaml编译器的源代码,使用4.07源代码 我从driver/main.ml读取它 我注意到它使用driver/pparse.ml第161行函数“parse”来解析lex buf (我添加了一行Printf.Printf“pparse.parse”,在make world之后,我使用boot/ocamlrun./ocamlc-nostdlib-I stdlib-ca.ml对其进行测试,控制台写入“pparse.parse”): 我想知道Parse.implementation是函数实

上一页   1   2   3   4    5   6  ... 下一页 最后一页 共 49 页