编译原理——一个编译器的各个步骤的介绍.pdfVIP

编译原理——一个编译器的各个步骤的介绍.pdf

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理——⼀个编译器的各个步骤的介绍 ⼀个编译器的结构分为分析部分(编译器的前端)和综合部分(编译器的后端)。 编译器的前端:把源程序分解成为多个组成要素,并在这些要素之上加上语法结构。然后,它使⽤这个结构来创建该源程序的⼀个中间表 ⽰。如检查出源程序没有按照正确的语法构成,或者语义上不⼀致,它就必须提供有⽤的信息,使得⽤户可以按此进⾏改正,在编译器的前 端,还会收集有关源程序的信息,并把信息存放在⼀个成为符号表的数据结构中。 编译器的后端:根据中间表⽰和符号表中的信息来构造⽤户期待的⽬标程序。 词法分析(lexical analysis):词法分析也称作扫描,是编译器的第⼀个步骤,词法分析器读⼊组成源程序的字符流,并且将它们组织成为 有意义的词素的序列,对于每⼀个词素,词法分析器产⽣如下形式的词法单元作为输出。实际上就是从字符流到单词流的过程。 词法单元:token-name,attribute-value,在这个词法单元中,第⼀个分量是⼀个由语法分析步骤使⽤的抽象符号,⽽第⼆个分量指 向符号表中关于这个词法单元的条⽬。符号表条⽬的信息会被语义分析和代码⽣成步骤使⽤。 举个龙书⾥的例⼦吧:position=initial+rate*60,在这个赋值语句中的字符可以组成如下词素,并映射成为如下词法单元,这些词法单元 会被传递给语法分析阶段。 (1)position是⼀个词素,被映射成词法单元id,1,其中id是表⽰标识符的抽象符号,⽽1指向符号表中position对应的条⽬。⼀个标 识符对应的符号表条⽬存放该标识符有关的信息,⽐如它的名字和类型。 (2)赋值符号=是⼀个词素,被映射成词法单元=。因为这个词法单元不需要属性值,所以我们可以忽略它的第⼆个分量。也可以使⽤ assign这样的抽象符号作为此法单元的名字, 但是为了标记上的⽅便,我们选择使⽤词素本⾝作为抽象符号的名字。 (3)initial是⼀个词素,被映射成词法单元id,2,其中2指向initial对应的符号表条⽬。 (4)+是⼀个词素,被映射成词法单元+ (5)rate是⼀个词素,被映射成词法单元id,3,其中3指向rate对应的符号表条⽬。 (6)*是⼀个词素,被映射成词法单元* (7)60是⼀个词素,被映射成词法单元60,实际上我们应该建⽴⼀个形如number,4的词法单元,其中4指向符号表中对应整数60的 条⽬。 单词的分类:标识符,常量,算符,界符( “;”, “,”),关键字 语法分析:也称作解析,语法分析器使⽤由词法分析器⽣成的各个词法单元的第⼀个分量来创建树形的中间表⽰。该中间表⽰给出了词法分 析产⽣的词法单元流的语法结构。⼀个常⽤的表⽰⽅法是语法树,树中的每个内部结点表⽰⼀个运算,⽽该结点的⼦结点表⽰该运算的分 量。 语义分析:语义分析器使⽤语法树和符号表中的信息来检查源程序是否和语⾔定义的语义⼀致。它同时也收集类型信息,并把这些信息存放 在语法树或符号表中,以便在随后的中间代码⽣成过程中使⽤。语义分析的⼀个重要部分是类型检查,编译器检查每个运算符是否具有匹配 的运算分量,⽐如数组下标必须是整数,若⽤⼀个浮点数来做下标,编译器就会报错。程序设计语⾔可能允许某些类型转换,这被称作⾃动 类型转换。 中间代码⽣成:在把⼀个源程序翻译成⽬标代码的过程中,⼀个编译器可能构造出⼀个或多个中间表⽰。这些中间表⽰可以有多种形式。其 中语法树是⼀种中间表⽰形式。在源程序的语法分析和语义分析完成之后,很多编译器⽣成⼀个明确的低级的或类机器语⾔的中间表⽰,我 们可以把这个表⽰看作是某个抽象机器的程序。该中间表⽰应该具有两个重要的性质: 易于⽣成,且能够被轻松地翻译为⽬标机器上的语⾔。 代码优化 :机器⽆关的代码优化步骤试图改进中间代码,以便⽣成更好的⽬标代码。代码优化⼜分为中间代码优化和⽬标代码的优化。 代码⽣成:代码⽣成器以源程序的中间表⽰形式作为输⼊,并把它映射到⽬标语⾔。如果 ⽬标语⾔是机器代码,那么必须为程序使⽤的每个 变量选择寄存器或内存位置,然后,中间指令被翻译成为能够完成相同任务的机器指令序列。 编译器的重要功能之⼀是记录源程序中使⽤的变量的名字,并收集和每个名字的各种属性有关的信息。这些属性可以提供⼀个名字的存储分 配、它的类型、作⽤于(即在程序的哪些地⽅可以使⽤这个名字的值)等信息。对于过程名字,这些信息还包括 :它的参数数量和类型、每 个参数的传递⽅法(⽐如传值或传引⽤)以及返回类型。 符号表管理 :符号表数据结构为每个变量名字创建了⼀个记录条⽬。记录的字段就是名字的各个属性,这个数据结构应该允许编译器迅速查 找到每

文档评论(0)

139****1921 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档