精华内容
下载资源
问答
  • 2. 设计翻译、生成Token的算法; 3. 编写代码并上机调试运行通过。 3实验要求: ( 用C语言或C++环境设计并实现实验内容 ) 输入———源程序文件; 输出______(1) 相应的Token 系列; (2) 关键字、界符表...
  • 编译原理词法分析程序设计与开发:对输入的字符串形式的源程序按顺序进行扫描,根据源程序的词法规则识别具有独立意义的单词(符号),并输出与其等价的Token序列
  • 编译原理词法分析程序,java实现,用于生成symbol表和token序列
  • 编译原理概述——基本知识要点汇总,主要对翻译程序、编译程序、解释程序、汇编程序几个概念进行区分和总结,并对编译过程及编译程序的基本结构、编译程序的生成方法做出归纳

    halo~我是bay_Tong桐小白
    本文内容是桐小白个人对所学知识进行的总结和分享,知识点会不定期进行编辑更新和完善,了解最近更新内容可参看更新日志,欢迎各位大神留言、指点

    【更新日志】

    最近更新:

    • 更新内容——课程研究内容先导(2021.6.14)
    • 持续更新中……
    结构导图

    在这里插入图片描述

    课程研究内容先导

    在这里插入图片描述
    在这里插入图片描述
    显然这个故事很悲伤……
    在这里插入图片描述
    在这里插入图片描述
    因此,人们需要想办法解决类似这样的问题
    在这里插入图片描述
    其中的相互转换就是编译原理乃至所有语言处理程序所需要研究的内容
    在这里插入图片描述
    【更多相关易混概念区分详细见 专业基础专栏 文章《计算机语言处理相关知识要点区分汇总》

    翻译程序、编译程序、解释程序、汇编程序

    翻译程序: 将一种计算机编程语言所编写的程序(源程序)翻译成与之等价的另外一种计算机语言的程序(目标程序),完成这个翻译工作的程序称为翻译程序。编译程序、解释程序、汇编程序均被认为是翻译程序

    在这里插入图片描述
    编译程序: 源程序语言是高级语言,目标程序语言是汇编语言或机器语言之类的低级语言,这样的翻译程序称为编译程序
    在这里插入图片描述
    解释程序: 在词法、语法、语义分析方面与编译程序的工作原理基本相同,但在执行过程中不产生目标程序,而是直接解释执行源程序或源程序的内部形式(中间代码),即边解释边执行
    在这里插入图片描述

    汇编程序: 源程序语言是汇编语言,输出目标程序语言是机器语言,这样的翻译程序称为汇编程序
    在这里插入图片描述
    通常目标程序文件仍不能被CPU直接执行,需要通过链接程序进行连接后才可生成可执行程序.EXE。现代编译器通常包含以下的主要工作流程:
    在这里插入图片描述


    在这里插入图片描述
    编译原理学科主要研究的即是编译程序的相关知识内容

    汇编更多基础概念及相关知识内容详细见 《微机原理与接口技术》 专栏

    编译过程及编译程序的基本结构

    编译过程主要分为五个阶段(词法分析、语法分析、语义分析及中间代码生成、代码优化、目标代码生成),五个阶段的任务分别由五个程序完成

    词法分析概述

    该阶段任务是对构成源程序的字符串从左到右进行扫描和分解,根据语言的词法规则识别出一个个具有独立意义的单词,确定单词的类型,将识别出的单词转换成统一的机内表示——词法单元(token)形式。完成该任务的程序为词法分析程序

    【简单说,即进行词法分类】以两行C语言代码为例
    在这里插入图片描述
    token:< 种别码,属性值 >
    在这里插入图片描述
    举一个例子:
    在这里插入图片描述

    语法分析概述

    该阶段任务是在词法分析的基础上,根据语言的语法规则从词法分析器输出的token序列中识别出各类短语,并构造语法分析树。完成该任务的程序为语法分析程序

    【简单说,即进行语法结构的分析构造。如 变量 = 表达式 构成一个赋值语句】
    在这里插入图片描述

    语义分析及中间代码生成概述

    首先对每种语法单位进行静态的语义审查,然后分析其含义,并用另一种语言形式(比源语言更接近于目标语言的一种中间代码或直接用目标语言)来描述这种语义。完成该任务的程序为语义分析及中间代码生成程序

    【简单说,即进行语义审查、生成中间代码】

    语义分析的主要任务:

    1)收集标识符的属性信息

    • 种属:简单变量、复合变量(数组……)、过程……
    • 类型:整型、实型、字符型、布尔型、指针型……
    • 存储位置、长度
    • 作用域
    • 参数和返回值信息:参数个数、参数类型、参数传递方式、返回值类型……

    2)语义检查

    在这里插入图片描述
    常用的中间表示形式:三地址码(由类似于汇编语言的指令序列组成,可表示成四元式、三元式、间接三元式)、语法结构树(简称语法树)【PS:语法结构树不同于语法分析树】

    代码优化概述

    对前阶段产生的中间代码进行等价变换或改造,以期获得更为高效(省时间省空间)的目标代码。完成该任务的程序为代码优化程序

    优化主要包括局部优化和循环优化,使其运行得更快一些,或占用空间更少一些,或二者兼顾

    目标代码生成概述

    将中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。目标代码生成的一个重要任务是为程序中使用的变量合理分配寄存器

    【简单说,即由优化的中间代码转换生成目标代码】

    表格管理和错误处理

    在编译程序的各个阶段中,都涉及表格管理【记录源程序所使用的变量名、属性等各种相关信息】和错误处理【差错并准确报告错误的种类及出错位置】,分别由表格管理程序和错误处理程序完成

    以上为一个典型的编译程序的主要组成部分,结构框图如下:
    在这里插入图片描述
    编译前端与编译后端:
    在这里插入图片描述
    优点:程序逻辑结构清晰;优化更充分

    PS:编译过程中几个相邻,有联系的阶段的工作可以一起进行,如语法分析进行句子结构分析的同时结合语义规则直接进行语义分析,这一技术称为语法制导翻译

    编译程序的生成方法

    生成一个编译程序一般要考虑以下几个方面:

    • 对源语言和目标语言认真分析
    • 设计编译算法
    • 选择语言编制程序
    • 调试编译程序
    • 提交相关文档资料

    持续更新中……
    我是桐小白,一个摸爬滚打的计算机小白

    展开全文
  • 编译原理

    千次阅读 2016-07-07 16:49:22
    编译原理 编辑词条 B 添加义项  ? 编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成...

    编译原理 编辑词条

    编译原理计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。 编译原理是计算机专业设置的一门重要的专业课程。虽然只有少数人从事编译方面的工作,但是这门课在理论、技术、方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力。 目前各个大学使用的教材机械工业出版社、国防工业出版社出版的《编译原理》。

    基本信息

    • 书名

      编译原理

    • 装帧

      平装

     
    • 开本

      16

    • 页数

      542

    编译原理计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。 编译原理是计算机专业设置的一门重要的专业课程。虽然只有少数人从事编译方面的工作,但是这门课在理论、技术、方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力。 目前各个大学使用的教材机械工业出版社、国防工业出版社出版的《编译原理》。

    折叠编辑本段基本概念

    编译器 是将汇编或高级计算机语言翻译为二进制机器语言代码的计算机程序。编译器将源程序(source language) 编写的程序作为输入,翻译产生目标语言(target language )机器代码的等价程序。通常地,源程序为高级语言(high-level language ),像C或C + +、汉语语言程序等,而目标则是机器语言的目标代码 (object code,有时也称作机器代码(machine code )),也就是可以在计算机硬件中运行的机器代码软件程序。这一过程可以表示为:

    源程序→编译器 →目标机器代码程序

    折叠编辑本段编译原理课程

    这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的 必修课程,同时也成为了研究生入学考试的必考内容。编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂。 我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。在20世纪 50年代,编译器的编写一直被认为是十分困难的事情,第一Fortran的编译器据说花了18年的时间才完成。在人们尝试编写编译器的同时,诞生了许多跟 编译相关的理论和技术,而这些理论和技术比一个实际的编译器本身价值更大。就犹如数学家们在解决著名的哥德巴赫猜想一样,虽然没有最终解决问题,但是其间 诞生不少名著的相关数论。

    折叠编辑本段发展历程

    在20世纪40年代,由于冯·诺伊曼在存储-程序编译原理实验程序编译原理实验程序计算机方面的先锋作用,编写一串代码或程序已成必要,这样计算机就可以执行所需的计算。开始时,这些程序都是用机器语言 (machine language )编写的。机器语言就是表示机器实际操作的数字代码,例如:

    C7 06 0000 0002 表示在IBM PC 上使用的Intel 8x86处理器将数字2移至地址0 0 0 0 (16进制)的指令。

    但编写这样的代码是十分费时和乏味的,这种代码形式很快就被汇编语言(assembly language )代替了。在汇编语言中,都是以符号形式给出指令和存储地址的。例如,汇编语言指令 MOV X,2 就与前面的机器指令等价(假设符号存储地址X是0 0 0 0 )。汇编程序(assembler )将汇编语言的符号代码和存储地址翻译成与机器语言相对应的数字代码。

    汇编语言大大提高了编程的速度和准确度,人们至今仍在使用着它,在编码需要极快的速度和极高的简洁程度时尤为如此。但是,汇编语言也有许多缺点:编写起来也不容易,阅读和理解很难;而且汇编语言的编写严格依赖于特定的机器,所以为一台计算机编写的代码在应用于另一台计算机时必须完全重写。

    发展编程技术的下一个重要步骤就是以一个更类似于数学定义或自然语言的简洁形式来编写程序的操作,它应与任何机器都无关,而且也可由一个程序翻译为可执行的代码。例如,前面的汇编语言代码可以写成一个简洁的与机器无关的形式 x = 2。

    在1954年至1957年期间,IBM的John Backus带领的一个研究小组对FORTRAN语言及其编译器的开发,使得上面的担忧不必要了。但是,由于当时处理中所涉及到的大多数程序设计语言的翻译并不为人所掌握,所以这个项目的成功也伴随着巨大的辛劳。几乎与此同时,人们也在开发着第一个编译器, Noam Chomsky开始了他的自然语言结构的研究。他的发现最终使得编译器结构异常简单,甚至还带有了一些自动化。Chomsky的研究导致了根据语言文法(grammar ,指定其结构的规则)的难易程度以及识别它们所需的算法来为语言分类。正如现在所称的-与乔姆斯基分类结构(Chomsky hierarchy )一样-包括了文法的4个层次:0型、1型、2型和3型文法,且其中的每一个都是其前者的专门化。2型(或上下文无关文法(context-free grammar ))被证明是程序设计语言中最有用的,而且今天它已代表着程序设计语言结构的标准方式。

    分析问题( parsing problem ,用于限定上下文无关语言的识别的有效算法)的研究是在20世纪60年代和70年代,它相当完善地解决了这一问题, 现在它已是编译理论的一个标准部分。它们与乔姆斯基的3型文法相对应。对它们的研究与乔姆斯基的研究几乎同时开始,并且引出了表示程序设计语言的单词(或称为记号)的符号方式。

    人们接着又深化了生成有效的目标代码的方法,这就是最初的编译器,它们被一直使用至今。人们通常将其误称为优化技术(optimization technique ),但因其从未真正地得到过被优化了的目标代码而仅仅改进了它的有效性,因此实际上应称作代码改进技术(code improvement technique )。

    这些程序最初被称为编译程序-编译器,但更确切地应称为分析程序生成器 (parser generator ),这是因为它们仅仅能够自动处理编译的一部分。这些程序中最著名的是 Yacc (yet another compiler- compiler),它是由Steve Johnson在1975年为Unix系统编写的。

    类似地,有穷自动机的研究也发展了另一种称为扫描程序生成器 (scanner generator )的工具,Lex (与Yacc同时,由Mike Lesk为Unix系统开发的)是这其中的佼佼者。在20世纪70年代后期和80年代早期,大量的项目都关注于编译器其他部分的生成自动化,这其中就包括代码生成。这些尝试并未取得多少成功,这大概是因为操作太复杂而人们又对其不甚了解。

    编译器设计最近的发展包括:首先,编译器包括了更为复杂的算法的应用程序,它用于推断或简化程序中的信息;这又与更为复杂的程序设计语言(可允许此类分析)的发展结合在一起。其中典型的有用于函数语言编译的Hindle y - Milner类型检查的统一算法。

    其次,编译器已越来越成为基于窗口的交互开发环境(interactive development environment,IDE )的一部 分,它包括了编辑器、链接程序、调试程序以及项目管理程序。这样的IDE的标准并没有多少, 但是已沿着这一方向对标准的窗口环境进行开发了。

    折叠编辑本段相关程序

    折叠解释程序

    解释程序(interpreter):解释程序是如同编译器的一种语言翻译程序。它与编译器的不同之处在于:它立即执行源程序而不是生成在翻译完成之后才执行的目标代码。从原理上讲,任何程序设计语言都可被解释或被编译,但是根据所使用的语言和翻译情况,很可能会选用解释程序而不用编译器。例如, 我们经常解释BASIC语言而不是去编译它。类似地,诸如LISP 的函数语言也常常是被解释的。

    解释程序也经常用于教育和软件的开发,此处的程序很有可能被翻译若干次。而另一方面,当执行的速度是最为重要的因素时就使用编译器,这是因为被编译的目标代码比被解释的源代码要快得多,有时要快10倍或更多。但是,解释程序具有许多与编译器共享的操作,而两者之间也有一些混合之处。

    折叠汇编程序

    汇编程序(assembler):汇编程序是用于特定计算机上的汇编语言的翻译程序。正如前面所提到的,汇编语言是计算机的机器语言的符号形式,它极易翻译。有时,编译器会生成汇编语言以作为其目标语言, 然后再由一个汇编程序将它翻译成目标代码。

    折叠连接程序

    连接程序(linker):编译器和汇编程序都经常依赖于连接程序,它将分别在不同的目标文件中编译或汇编的代码收集到一个可直接执行的文件中。在这种情况下,目标代码,即还未被连接的机器代码,与可执行的机器代码之间就有了区别。连接程序还连接目标程序和用于标准库函数的代码,以及连接目标程序和由计算机的操作系统提供的资源(例如,存储分配程序及输入与输出设备)。连接程序现在正在完成编译器最早的一个主要活动(这也是"编译"一词的用法, 即通过收集不同的来源来构造)。连接过程对操作系统和处理器有极大的依赖性。

    折叠装入程序

    装入程序(loader):编译器、汇编程序或连接程序生成的代码经常还不完全适用或不能执行,但是它们的主要存储器访问却可以在存储器的任何位置中且与一个不确定的起始位置相关。这样的代码被称为是可重定位的(relocatable ),而装入程序可处理所有的与指定的基地址或起始地址有关的可重定位的地址。装入程序使得可执行代码更加灵活,但是装入处理通常是在后台(作为操作环境的一部分)或与连接相联合时才发生,装入程序极少会是实际的独立程序。

    折叠预处理器

    预处理器(preprocessor ):预处理器是在真正的翻译开始之前由编译器调用的独立程序。预处理器可以删除注释、包含其他文件以及执行宏(宏macro是一段重复文字的简短描写)替代。预处理器可由语言(如 C )要求或以后作为提供额外功能(诸如为FORTRAN提供Ratfor预处理器)的附加软件。

    折叠编辑器

    编辑器(editor):编译器通常接受由任何生成标准文件(例如ASCII文件)的编辑器编写的源程序。现在, 编译器已与另一个编辑器和其他程序捆绑进一个交互的开发环境-IDE中。此时,尽管编辑器仍然生成标准文件,但会转向正被讨论的程序设计语言的格式或结构。这样的编辑器称为基于结构的(structure based ),且它早已包括了编译器的某些操作;因此,程序员就会在程序的编写时而不是在编译时就得知错误了。从编辑器中也可调用编译器以及与它共用的程序,这样程序员无需离开编辑器就可执行程序

    折叠调试程序

    调试程序(debugger ):调试程序是可在被编译了的程序中判定执行错误的程序,它也经常与编译器一起放在IDE 中。运行一个带有调试程序的程序与直接执行不同,这是因为调试程序保存着所有的或大多数源代码信息(诸如行数、变量名和过程)。它还可以在预先指定的位置(称为断点(breakpoint )) 暂停执行,并提供有关已调用的函数以及变量的当前值的信息。为了执行这些函数,编译器必须为调试程序提供恰当的符号信息,而这有时却相当困难,尤其是在一个要优化目标代码的编译器中。因此,调试又变成了一个编译问题。

    折叠描述器

    描述器(profiler):描述器是在执行中搜集目标程序行为统计的程序。程序员特别感兴趣的统计是每一个过程的调用次数和每一个过程执行时间所占的百分比。这样的统计对于帮助程序员提高程序的执行速度极为有用。有时编译器也甚至无需程序员的干涉就可利用描述器的输出来自动改进目标代码。

    折叠项目管理程序

    项目管理程序(project manager):软件项目通常大到需要由一组程序员来完成,这时对那些由不同人员操作的文件进行整理就非常重要了,而这正是项目管理程序的任务。例如,项目管理程序应将由不同的程序员制作的文件的各个独立版本整理在一起,它还应保存一组文件的更改历史,这样就能维持一个正在开发的程序的连贯版本了(这对那些由单个程序员管理的项目也很有用)。项目管理程序的编写可与语言无关,但当其与编译器捆绑在一起时,它就可以保持有关特定的编译器和建立一个完整的可执行程序的链接程序操作的信息。在Unix系统中有两个流行的项目管理程序:sccs (source code control system )和rcs (revision control system )。

    折叠编辑本段步骤

    编译器内部包括了许多步骤或称为阶段源代码(phase),它们执行不同的逻辑操作。将这些阶段设想为编译器中一个个单独的片断是很有用的, 尽管在应用中它们是经常组合在一起的,但它们扫描程序确实是作为单独的代码操作来编写的。

    折叠扫描程序

    扫描程序(scanner):在这个阶段编译器实际阅读源程序(通常以分析程序字符流的形式表示)。扫描程序执行词法分析注释树符号表 (Lexical analysis ):它将字符序列收集到称作记号错误处 (token )的有意义单元中,记号同自然语言,如英源代码理器语中的字词相似。因此可以认为扫描程序执行与优化程序拼写相似的任务。中间代码例如在下面的代码行(它可以是C程序的一部分)中:代码生成器 a [index] = 4 + 2 这个代码包括了1 2个非空字符,但只有 8个目标代码记号:a 标识符目标代码优化程序 [ 左括号 i n d e x 标识符 ] 右括号 = 赋值目标代码 4 数字编译器的阶段 + 加号 2 数字 每一个记号均由一个或多个字符组成,在进一步处理之前它已被收集在一个单元中。扫描程序还可完成与识别记号一起执行的其他操作。例如,它可将标识符输入到符号表中, 将文字(litral)输入到文字表中(文字包括诸如3 . 1415926535的数字常量,以及诸如"Hello,world ! "的引用字符串)。

    折叠语法分析

    语法分析(parser ):语法分析程序从扫描程序中获取记号形式的源代码,并完成定义程序结构的语法分析 (syntax analysis ),这与自然语言中句子的语法分析类似。语法分析定义了程序的结构元素及其关系。通常将语法分析的结果表示为分析树(parse tree)或语法树(syntax tree)。例如,还是那行C代码,它表示一个称为表达式的结构元素,该表达式是一个由左边为下标表达式、右边为整型表达式的赋值表达式组成。这个结构可按下面的形式表示为一个分析树:请注意,分析树的内部节点均由其表示的结构名标示出,而分析树的叶子则表示输入中的记号序列(结构名以不同字体表示以示与记号的区别)。分析树对于显示程序的语法或程序元素很有帮助,但是对于表示该结构却显得力不从心了。分析程序更趋向于生成语法树,语法树是分析树中所含信息的浓缩(有时因为语法树表示从分析树中的进一步抽取,所以也被称为抽象的语法树(abstract syntax tree ))。下面是一个C赋值语句的抽象语法树的例子:请注意,在语法树中,许多节点(包括记号节点在内)已经消失。例如,如果知道表达式是一个下标运算,则不再需要用括号"["和"]"来表示该操作是在原始输入中。

    折叠语义分析

    语义分析(semantic analyzer ):程序的语义就是它的"意思",它与语法或结构不同。程序的语义确定程序的运行,但是大多数的程序设计语言都具有在执行之前被确定而不易由语法表示和由分析程序分析的特征。这些特征被称作静态语义(static semantic),而语义分析程序的任务就是分析这样的语义(程序的"动态"语义具有只有在程序执行时才能确定的特性,由于编译器不能执行程序,所以它不能由编译器来确定)。一般的程序设计语言的典型静态语义包括声明和类型检查。由语义分析程序计算的额外信息(诸如数据类型)被称为属性(attribute),它们通常是作为注释或"装 饰"增加到树中(还可将属性添加到符号表中)。在正运行的C表达式 a [index] = 4 + 2 中,该行分析之前收集的典型类型信息可能是:a是一个整型值的数组,它带有来自整型子范围的下标;index则是一个整型变量。接着,语义分析程序将用所有的子表达式类型来标注语法树,并检查赋值是否使这些类型有意义了,如若没有,则声明一个类型匹配错误。在上例中, 所有的类型均有意义,有关语法树的语义分析结果可用以下注释了的树来表示。

    折叠优化程序

    优化程序(source code optimizer):编译器通常包括许多代码改进或优化步骤。绝大多数最早的优化步骤是在语义分析之后完 成的,而此时代码改进可能只依赖于源代码。这种可能性是通过将这一操作提供为编译过程中的单独阶段指出的。每个编译器不论在已完成的优化种类方面还是在优化阶段的定位中都有很大的差异。在上例中,我们包括了一个源代码层次的优化机会,也就是:表达式4 + 2可由编译器计算先得到结果6 (这种优化称为常量合并(constant folding ))。当然,还会有更复杂的情况。还是在上例中,通过将根节点右面的子树合并为它的常量值,这个优化就可以直接在(注释)语法树上完成:尽管许多优化可以直接在树上完成,但是在很多情况下,优化接近于汇编代码线性化形式的树更为简便。这样节点的变形有许多,但是三元式代码(three-address code )(之所以这样称呼是因为它在存储器中包含了3个(或3个以上)位置的地址)却是标准选择。另一个常见的选 择是P -代码(P - code ),它常用于Pascal编译器中。在前面的例子中,原先的C表达式的三元式代码应是:t = 4 + 2 a [ index] = t (请注意,这里利用了一个额外的临时变量t 存放加法的中间值)。这样,优化程序就将这个代码改进为两步。首先计算加法的结果:t = 6 a [index] = t 接着,将t替换为该值以得到三元语句 a [index] = 6 ,指出源代码优化程序可能通过将其输出称为中间代码(intermediate code )来使用三元式代码。中间代码一直是指一种位于源代码和目标代码(例如三元式代码或类似的线性表示)之间的代码表示形式。但是,我们可以更概括地认为它是编译器使用的源代码的任何一个内部表示。此时,也可将语法树称作中间代码,源代码优化程序则确实能继续在其输出中使用这个表示。有时,这个中间代码也称作中间表示(intermediate representation,IR)。

    折叠代码生成

    代码生成(code generator):代码生成器得到中间代码(IR),并生成目标机器的代码。正是在编译的这个阶段中,目标机器的特性成为了主要因素。当它存在于目标机器时,使用指令不仅是必须的而且数据的形式表示也起着重要的作用。例如,整型数据类型的变量和浮点数据类型的变量在存储器中所占的字节数或字数也很重要。在上面的示例中,现在必须决定怎样存储整型数来为数组索引生成代码。例如,下面是所给表达式的一个可能的样本代码序列(在假设的汇编语言中):

    M O V R0,index ;;

    value of index -> R0 M U L R0,2 ;;

    double value in R0 M O V R1,&a ;;

    address of a -> R1 A D D R1,R0 ;;

    add R0 to R1 M O V *R1,6 ;;

    constant 6 -> address in R1

    在以上代码中,为编址模式使用了一个类似C的协定,因此& a是a的地址(也就是数组的基地址),* R1则意味着间接寄存器地址(因此最后一条指令将值6存放在R1包含的地址中)。这个代码还假设机器执行字节编址,并且整型数占据存储器的两个字节(所以在第2条指令中用2作为乘数)。

    折叠目标代码

    目标代码(target code optimizer ):在这个阶段中,编译器尝试着改进由代码生成器生成的目标代码。这种改进包括选择编址模式以提高性能、将速度慢的指令更换成速度快的,以及删除多余的操作。在上面给出的样本目标代码中,还可以做许多更改:在第2条指令中,利用移位指令替代乘法(通常地,乘法很费时间),还可以使用更有效的编址模式(例如用索引地址来执行数组 存储)。使用了这两种优化后,目标代码就变成:

    MOV R0,index ;;

    value of index -> R0 SHL R0 ;;

    double value in R0 MOV &a[R0],6 ;;

    constant 6 -> address a + R0

    到这里就是编译原理的简要描述,但还应特别强调编译器在其结构细节上差别很大。

    折叠编辑本段数据结构

    编译原理一直是计算机学习的必修课.

    当然,由编译器的阶段使用的算法与支持这些阶段的数据结构之间的交互是非常强大的。编译器的编写者尽可能有效实施这些方法且不引起复杂性。理想的情况是:与程序大小成线性比例的时间内编译器,换言之就是,在0 ( n )时间内,n是程序大小的度量(通常是字符数)。本节将讲述一些主要的数据结构,它们是其操作部分阶段所需要的,并用来在阶段中交流信息。

    折叠记号

    记号(token):当扫描程序将字符收集到一个记号中时,它通常是以符号表示这个记号;这也就是说,作为一个枚举数据类型的值来表示源程序的记号集。有时还必须保留字符串本身或由此派生出的其他信息(例如:与标识符记号相关的名字或数字记号值)。在大多数语言中,扫描程序一次只需要生成一个记号(这称为单符号先行(single symbol lookahead))。在这种情况下,可以用全程变量放置记号信息;而在别的情况(最为明显的是FORTRAN)下,则可能会需要一个记号数组。

    折叠语法树

    语法树(syntax tree):如果分析程序确实生成了语法树,它的构造通常为基于指针的标准结构,在进行分析时动态分配该结构,则整棵树可作为一个指向根节点的单个变量保存。结构中的每一个节点都是一个记录,它的域表示由分析程序和之后的语义分析程序收集的信息。例如,一个表达式的数据类型可作为表达式的语法树节点中的域。有时为了节省空间,这些域也是动态分配或存放在诸如符号表的其他数据结构中,这样就可以有选择地进行分配和释放。实际上,根据它所表示的语言结构的类型(例如:表达式节点对于语句节点或声明节点都有不同的要求),每一个语法树节点本身都可能要求存储不同的属性。在这种情况下,可由不同的记录表示语法树中的每个节点,每个节点类型只包含与本身相关的信息。

    折叠符号表

    符号表(symbol table):这个数据结构中的信息与标识符有关:函数、变量、常量以及数据类型。符号表几乎与编译器的所有阶段交互:扫描程序、分析程序或将标识符输入到表格中的语义分析程序;语义分析程序将增加数据类型和其他信息;优化阶段和代码生成阶段也将利用由符号表提供的信息选 出恰当的代码。因为对符号表的访问如此频繁,所以插入、删除和访问操作都必须比常规操作更有效。尽管可以使用各种树的结构,但杂凑表却是达到这一要求的标准数据结构。有时在一个列表或栈中可使用若干个表格。

    折叠常数表

    常数表(literal table):常数表的功能是存放在程序中用到的常量和字符串,因此快速插入和查找在常数表中也十分重要。但是,在其中却无需删除,这是因为它的数据全程应用于程序而且常量或字符串在该表中只出现一次。通过允许重复使用常量和字符串,常数表对于缩小程序在存储器中的大小显得非常重要。在代码生成器中也需要常数表来构造用于常数和在目标代码文件中输入数据定义的符号地址。

    折叠中间代码

    中间代码(intermediate code):根据中间代码的类型(例如三元式代码和P -代码)和优化的类型,该代码可以是文本串的数组、临时文本文件或是结构的连接列表。对于进行复杂优化的编译器,应特别注意选择允许简单重组的表示。

    折叠临时文件

    临时文件(temporary file):计算机过去一直未能在编译器时将整个程序保留在存储器中。这一问题已经通过使用临时文件来保存翻译时中间步骤的结果或通过"匆忙地"编译(也就是只保留源程序早期部分的足够信息用以处理翻译)解决了。存储器的限制现在也只是一个小问题了,现在可以将整个编译单元放在存储器之中,特别是在可以分别编译的语言中时。但是偶尔还是会发现需要在某些运行步骤中生成中间文件。其中典型的是代码生成时需要反填(backpatch)地址。例如,当翻译如下的条件语句时 if x = 0 then ... else ... 在知道else部分代码的位置之前必须由文本跳到else部分:

    CMP X,0 JNE NEXT ;;

    location of NEXT not yet known < code for then-part > NEXT : < code for else-part >

    通常,必须为NEXT的值留出一个空格,一旦知道该值后就会将该空格填上,利用临时文件可以很容易地做到这一点。

    如果想利用上面的编译原理开发一套属于自己的编程语言,或者想在一个产品中嵌入编程语言,可以参考zengl开源网开发的zengl编程语言,该编程语言为国人使用C语言开发,里面包含两个部分,一个是编译器,一个是解释执行中间代码的虚拟机。编译器包含了词法扫描,语法分析,中间代码输出等,虚拟机则类似JAVA一样解释执行中间代码。作者将所有的版本都公布出来,好让读者可以由浅入深的做研究,并且为了证明该编程语言的实用性,还结合SDL游戏开发库开发了一款图形界面和命令行界面的21点扑克小游戏 。

    zengl编程语言目前适用平台为windows和linux (最开始在Linux下使用gcc开发,后来移植到windows平台)

    折叠编辑本段其他问题

    可从许多不同的角度来观察编译器的结构,还有其他一些可能的观点:编译器的物理结构、操作的顺序等等。由于编译器的结构对其可靠性、有效性、可用性以及可维护性都有很大的影响,所以编译器的编写者应熟悉尽可能多的有关编译器结构的观点。

    折叠分析和综合

    在这个观点中,已将分析源程序以计算其特性的编译器操作归为编译器的分析(analysis) 部分,而将生成翻译代码时所涉及到的操作称作编译器的综合(synthesis )部分。当然,词法分析、语法分析和语义分析均属于分析部分,而代码生成却是综合部分。在优化步骤中,分析和综合都有。分析正趋向于易懂和更具有数学性,而综合则要求更深的专业技术。因此,将分析步骤和综合步骤两者区分开来以便发生变化时互不影响是很有用的。

    折叠前端和后端

    本观点认为,将编译器分成了只依赖于源语言(前端(front end ))的操作和只依赖于目标语言(后端(back end ))的操作两部分。这与将其分成分析和综合两部分是类似的:扫描程序、分析程序和语义分析程序是前端,代码生成器是后端。但是一些优化分析可以依赖于目标语言,这样就是属于后端了,然而中间代码的综合却经常与目标语言无关,因此也就属于前端了。在理想情况下,编译器被严格地分成这两部分,而中间表示则作为其间的交流媒介。这一结构对于编译器的可移植性(portability)十分重要,此时设计的编译器既能改变源代码(它涉及到重写前端),又能改变目标代码(它还涉及到重写后端)。在实际中,这是很难 做到的,而且称作可移植的编译器仍旧依赖于源语言和目标语言。其部分原因是程序设计语言和机器构造的快速发展以及根本性的变化,但是有效地保持移植一个新的目标语言所需的信息 或使数据结构普遍地适合改变为一个新的源语言所需的信息却十分困难。然而人们不断分离前端和后端的努力会带来更方便的可移植性。

    折叠

    编译器发现,在生成代码之前多次处理整个源程序很方便。这些重复就是( pass)。首遍是从源中构造一个语法树或中间代码,在它之后的遍是由处理中间表示、向它增加信息、更换结构或生成不同的表示组成。遍可以和阶段相应,也可无关-遍中通常含有若干个阶段。实际上,根据语言的不同,编译器可以是一遍(one pass )-所有的阶段由一遍完成,其结果是编译得很好,但(通常)代码却不太有效。Pascal语言和C 语言均允许单遍编译。(Modula - 2语言的结构则要求编译器至少有两遍)。大多数带有优化的编译器都需要超过一遍:典型的安排是将一遍用于扫描和分析,将另一遍用于语义分析和源代码层优化,第3遍用于代 码生成和目标层的优化。更深层的优化则可能需要更多的遍:5遍、6遍、甚至8遍都是可能的。

    折叠语言定义和编译器

    程序设计语言的词法和语法结构通常用形式的术语指定,并使用正则表达式和上下文无关文法。但是,程序设计语言的语义通常仍然是由英语(或其他的自然语言)描述的。这些描述(与形式的词法及语法结构一起)一般是集中在一个语言参考手册(language reference manual )或语言定义(language definition)之中。因为编译器的编写者掌握的技术对于语言的定义有很大的影响,所以在使用了一种新的语言之后,语言的定义和编译器同时也能够得到开发。类似地,一种语言的定义对于构造编译器所需的技术也有很 大的关系。编译器的编写者更经常遇到的情况是:正在实现的语言是众所周知的并已有了语言定义。有时这个语言定义已达到了某个语言标准(language standard )的层次,语言标准是指得到诸如美国国家标准协会(American National Standards Institute ,ANSI )或国际标准化组织 (International Organization for Standardization,ISO )的官方标准组织批准的标准。FORTRAN、 Pascal和C语言就具有ANSI标准,Ada有一个通过了美国政府批准的标准。在这种情况下,编译器的编写者必须解释语言的定义并执行符合语言定义的编译器。通常做到这一点并不容易, 但是有时由于有了标准测试程序集(测试组(test suite )),就能够测试编译器(Ada有这样一个测试组),这又变得简单起来了。有时候,一种语言可从数学术语的形式定义(formal definition )中得到它的语义。现在人们已经使用了许多方法,尽管一个称作表示语义(denotational semantics )的方法已经成为较为常用的方法,在函数编程共同体中尤为如此,但现在仍然没有一种可成为标准的方法。当语言有一个形式定义时,那么在理论上就有可能给出编译器与该定义一致的数学证明,但是由于这太难了,而几乎从未有人做过。无论怎样, 运行时环境的结构和行为是尤其受到语言定义影响的编译器构造的一个方面。

    展开全文
  • 编译原理词法分析源码,将一段程序代码,分析成一个有序token序列
  • 计算机编译原理 第二章 词法分析 词法分析概述 词法分析程序的手工实现 正规表达式与有限自动机 词法分析程序的自动生成 2.1 词法分析器设计方法 词法分析是编译过程中的第一个阶段其主要任务是从左到右逐个字符地对...
  • 编译系统功能分析 编译程序总体结构 编译程序的生成 打赏作者 本文引用 计算机语言发展 码文不易,希望支持,谢谢-&gt;支持原创  机器语言 machine language 机器语言(machine language)是一...

    目录

    计算机语言发展

    码文不易,希望支持,谢谢->支持原创

     机器语言 machine language

    机器语言(machine language)是一种指令集的体系。这种指令集称为机器码(machine code),是电脑的CPU可直接解读的数据。维基——机器语言

     汇编语言 assemble language

    汇编语言(英语:assembly language)[注 1][1]是一种用于电子计算机、微处理器、微控制器,或其他可编程器件的低级语言。在不同的设备中,汇编语言对应着不同的机器语言指令集。一种汇编语言专用于某种计算机系统结构,而不像许多高级语言,可以在不同系统平台之间移植。维基——汇编语言

     高级语言 high level language

    语句定义数据 描述算法
    维基——高级语言

    高级语言分类

     命令式语言 imperative language

    指令式编程(英语:Imperative programming),是一种描述电脑所需作出的行为的编程典范。几乎所有电脑的硬件工作都是指令式的;几乎所有电脑的硬件都是设计来运行机器码,使用指令式的风格来写的。较高级的指令式编程语言使用变量和更复杂的语句,但仍依从相同的典范。菜谱和行动清单,虽非计算机程序,但与指令式编程有相似的风格:每步都是指令,有形的世界控制情况。因为指令式编程的基础观念,不但概念上比较熟悉,而且较容易具体表现于硬件,所以大部分的编程语言都是指令式的。维基——命令式编程

     函数(应用)式语言

    函數式編程(英語:functional programming)或稱函式程式設計,又稱泛函編程,是一種編程典範,它將電腦運算視為數學上的函式計算,並且避免使用程式狀態以及易變物件。函數程式語言最重要的基礎是λ演算(lambda calculus)。而且λ演算的函式可以接受函式當作輸入(引數)和輸出(傳出值)。维基——函數程式語言

     逻辑式语言

     面向对象式语言

    物件導向程式設計(英語:Object-oriented programming,縮寫:OOP)是種具有物件概念的程式編程典範,同時也是一種程式開發的抽象方針。它可能包含資料、屬性、程式碼與方法。物件則指的是類別的例項。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充功能性,物件裡的程式可以存取及經常修改物件相關連的資料。在物件導向程式編程裡,電腦程式會被設計成彼此相關的物件。维基——面向对象程序设计

    翻译系统

     翻译程序 Translator

    翻译程序

     解释程序 Interpreter

    解释程序

     编译程序 compiler

    编译程序

     其他

    • 诊断编译
    • 优化编译
    • 交叉编译
    • 可变目标
    • 并行编译
    • 汇编程序
    • 交叉汇编
    • 反汇编

    编译系统功能分析

    编译器(compiler),是一种计算机程序,它会将用某种编程语言写成的源代码(原始语言),转换成另一种编程语言(目标语言)。 维基——编译器

     分析

    词法、语法、语义

     翻译

    语句的翻译、代码生成

    编译程序总体结构

    编译程序总体结构

    码文不易,希望支持,谢谢->支持原创

     1.词法分析

      词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为标记(token)序列的过程。进行词法分析的程序或者函数叫作词法分析器(lexical analyzer,简称lexer),也叫扫描器(scanner)。词法分析器——维基百科
    - 输入:字符串
    - 输出:(种别码,属性值)——序对属性值——token的机内表示

     2.语法分析

      语法分析(英语:syntactic analysis,也叫 parsing)是根据某种给定的形式文法对由单词序列(如英语单词序列)构成的输入文本进行分析并确定其语法结构的一种过程。语法分析——维基百科

    • 输入:Token序列
    • 输出:语法成分

     3.语义分析

      语义分析是编译过程的一个逻辑阶段, 语义分析的任务是对结构上正确的源程序进行上下文有关性质的审查,进行类型审查。语义分析——百度百科

     4.中间代码生成 intermediate code

      中间代码生成是产生中间代码的过程。所谓“中间代码”是一种结构简单、含义明确的记号系统,这种记号系统复杂性介于源程序语言和机器语言之间,容易将它翻译成目标代码。中间代码生成——百度百科

    • 输入:语法成分
    • 输出:中间代码

    扩展阅读 波兰表达式和逆波兰表达式

     5.代码优化

      所谓代码优化是指对程序代码进行等价(指不改变程序的运行结果)变换。代码优化——百度百科

      对中间代码的优化处理:对代码进行等价变换以求提高执行效率——提高运行速度和节省存储空间。

      与机器无关的优化

    1. 局部优化

      • 常量合并:常数运算在编译期间完成,如8+5
      • 公共子表达式的提取:基本块内
    2. 循环优化

      • 强度削减
      • 代码外提

      与机器有关的优化

    1. 寄存器的利用
      将常用量放入寄存器,以减少访问内存的次数
    2. 体系结构
      MIMD、SIMD、SPMD、向量机、流水机

    3. 存储策略
      根据算法访存的要求安排:Cache、并行存储体系——减少访问冲突

    4. 任务划分
      按运行的算法即体系结构,划分子任务(MPMD)


    • 输入:中间代码
    • 输出:优化过的中间代码

     6.目标代码生成

      将中间代码转换成目标机上的机器指令代码或汇编代码

    • 输入:中间代码
    • 输出:指令代码或汇编代码

     7.表格管理

      管理各种符号表(常数、标号、变量、过程、结构……)

     8.错误处理

      进行各种错误的检查、报告、纠正,以及相应的续编译处理(如:错误的定位与局部化)

    编译程序的生成

      如何实现编译器?

    在另一篇中作了较为详细的讲解,可以前往阅读。编译程序的生成

    打赏作者

    码文不易,希望支持,谢谢->支持原创

    微信支付微信支付

    再次感谢,大家对本人的支持。

    本文引用

    1.维基——机器语言
    2.维基——汇编语言
    3.维基——高级语言
    4.维基——命令式编程
    5.维基——函數程式語言
    6.维基——面向对象程序设计
    7. 维基——编译器
    8. 词法分析器——维基百科
    9. 语法分析——维基百科
    10. 语义分析——百度百科
    11. 中间代码生成——百度百科
    12. 代码优化——百度百科

    展开全文
  • 编译原理概述

    2016-11-09 20:21:31
    编译原理的应用 准备系统地整理学习编译原理的相关知识。虽然这部分知识很多时候非常抽象,却能够很高的提高程序员内在的修养。如果每一种程序语言是一套招式,那么编译原理就是内功。不管程序语言如何变,都摆脱...

    编译原理的应用


    准备系统地整理学习编译原理的相关知识。虽然这部分知识很多时候非常抽象,却能够很高的提高程序员内在的修养。如果每一种程序语言是一套招式,那么编译原理就是内功。不管程序语言如何变,都摆脱不了编译原理研究的BNF范式。具体来说,学习编译原理可能有以下几个方面的用处。


    • 在平常写代码中的需要。我们在处理结构化文本(例如去除文本中的干扰内容,解析web页面等),计算复杂的表达式(既包括数值的计算,也可能包括字符串的操作)时,都会有意无意地用到编译原理的知识。
    • 软件开发的需要。在开发文本编辑器,尤其是代码编辑器时,都免不了要对用户输入的文本进行处理。这个过程与编译原理的知识密切相关。
    • 模式识别以及自然语言处理的应用。编译原理是的本质就是解析文本的生成模式。
    • 编写开发工具。常听到有人说,一流的程序员,主要精力都花在编写工具上面。一个开发工具,其实就是一个代码解释器。


    编译的过程

    • 预处理:主要处理文件包含以及宏定义。将所有源文件中的代码整合为一个整体。代码中用到宏,都被替换成实际的字符串。
    • 线性分析:也称为词法分析。将代码分割成一系列的记号(token)组成的集合。这些记号从语法分析的角度,被称为终结符。它可以是关键字,变量,运算符以及常量等。
    • 语法分析:语法分析处理的是词法分析阶段输出的记号序列。它的主要工作是分析这一串记号序列的模式(更准确地说,这串记号序列是通过哪些产生式生成的)。
    • 语义分析:包括变量检查,类型检查等。更复杂的语义检查可能会分析函数的每条运行路径是否都有返回值等。通常语义分析比语法分析要困难很多。因此需要单独提取出来。但是对于BNF语法,语义分析和语法分析可以同时完成。当语法分析完毕,句子的语义随之明了,中间代码生成完毕。这样的翻译过程称为语法制导翻译。
    • 生成中间代码:所谓中间代码是指介于源代码和目标代码之间的代码。它的特点是易于从源代码产生,同时又易于生成目标代码。
    • 中间代码优化:是指对中间代码进行优化,删去不必要的操作以提高运行效率。代码优化是编译过程中最具艺术性的过程。
    • 目标代码生成:将中间代码翻译成目标代码。




    展开全文
  • 编译原理1.2

    2020-04-15 10:41:59
    词法分析概述 词法分析的主要任务 从左到右逐行扫描源程序的字符,...词法分析后得到的token序列举例 通过第一个分量就可以区分的单词,第二个分量都是空的 SLP左括号 SRP右括号 LP左花括号 RP右花括...
  • 编译原理实验,实现了一个词法分析器生成Token序列。中间代码、四元式生成。含有实验报告。
  • 编译原理 扫描器 (1) 设计扫描器的有限自动机(识别器); (2) 设计翻译、生成Token的算法(翻译器); (3) 编写代码并上机调试运行通过。...•输出——相应的Token序列; 关键字表和界符表; 符号表和常数表;
  • 编译原理end

    千次阅读 多人点赞 2020-01-14 17:29:22
    //数字序列 void W();//复合语句 void X();//条件 void Y();//语句1 void Z();//因子 //构造四元式 void siYuan(string op,string s1,string s2,string res) { sy[sy_num].op =op; sy[sy_num].s1=s1; sy...
  • 编译原理之绪论

    2018-03-14 23:09:37
    编译原理之绪论 既然是说编译原理,那么就可以提问: 什么是编译器 编译器就是一个程序,它读入用某种语言编写的源程序,并翻译成一个与之等价的另一种语言编写的源程序。编译器身上还有一个任务,就是发现编译...
  • 编译原理入门笔记

    千次阅读 多人点赞 2018-05-24 20:24:37
    什么是编译原理? 编译原理这门课程本来是很多大学必修的一门课程,但是我的本科课程里面并没有安排这门课程,由于研究生需要研究这方面的基础,于是开始自学。相信很多人都知道这门课程是计算机基础课程中比较难...
  • Javac编译原理

    千次阅读 2017-02-25 17:24:17
    Javac编译原理 转载来源:http://www.cnblogs.com/wade-luffy/p/5925728.html 1概述   java源代码(符合语言规范)-->javac-->.class(二进制文件)-->jvm-->机器语言(不同平台不同种类) 如何让java的语法规则...
  • 1、参考书籍:《编译原理》第三版 清华大学出版社 1、本文内容全部来源于开源社区 GitHub和以上博主的贡献,本文也免费开源(可能会存在问题,评论区等待大佬们的指正) 2、本文目的:开源共享 抛砖引玉 一起学习 3...
  • 读入源程序的输入序列 组合成词素(lexemes) 建立词法单元(token) RE :regular expression 正则表达式 //// 一个很有意思的东西 C语言中标识符的正则定义 digit--->0|2|...|9 letter_--->A|B|...|Z|a|b|......
  • Java的编译原理

    万次阅读 2019-10-21 21:22:41
    目录 概述 Java中的前端编译 解析与填充符号表 插入式注解处理器 语义分析与字节码生成 Java中的后端编译 ...java语言的"编译期"分为前端编译和后端编译两个阶段。前端编译是指把*.ja...
  • 编译原理实验代码

    千次阅读 2019-04-04 20:36:55
    编译原理实验代码(有Bug) /* #include "pch.h" #include "exe2.h" #include<memory> int main() { //终结符 list<string> terminator; terminator.push_back("a"); terminator.push_back("b"); ...
  • 编译原理绪论

    2020-03-18 22:52:23
    前言:近期正在学b站上哈工大的编译原理课,但是越学越崩溃。所以干脆停止看视频,慢下来汇总、理清知识。我搜索了几篇关于编译原理的文章,读完后提取出有用的知识。当做入门吧,争取搞清why。[若侵权,请联系我...
  • 编译原理——引论

    千次阅读 2015-02-22 16:03:51
    大型程序经常被分成多个部分进行编译,因此,可重定位的机器代码有必要和其他可重定位的目标文件以及库文件连接到一起,形成真正在机器上运行的代码。一个文件中的代码可能指向另一个文件中的位置,而 链接器(linker...
  • 编译原理:文法与语法分析基本概念语法分析​ 语法分析器的输入是词法分析后的结果——Token序列。每当调用一次词法分析器将读出一个单词,并将其Token表示回送给语法分析器。语法分析器的输入单位可视为一个Token。...
  • 编译原理第三版答案

    万次阅读 多人点赞 2018-12-19 21:21:23
    答:编译程序主要由以下几个部分组成:词法分析、语法分析、语义分析、中间代码生成、中间代码优化、目标代码生成、错误处理、表格管理。 2. 实现编译程序的主要方法有哪些? 答:主要有:转换法、移植法、自展法...
  • 可以这样入门编译原理

    千次阅读 2013-12-15 15:23:56
    学过编译原理的人都知道,编译原理这门课确实难学。我所看的关于编译原理的书籍有大家所熟悉的紫龙书以及《编译原理实践》,作者都为美国人。因为自己不是计算机专业的,所以没有上过这门课,而自学起来,由于没有一...
  • 学习完成编译原理基础之后,我们知道编译原理的第一步就是把源程序的单词进行分类处理,变成一个二元组token,包括单词的种类和值。学习本章知识首先需要了解一些基本概念,不过编译原理这门课程学起来困难、枯燥的...
  • 词法分析(编译原理

    万次阅读 2015-03-23 19:08:01
    编译原理词法分析

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,856
精华内容 5,542
关键字:

编译原理token序列