pl0编译程序的研究与改进
㈠ 编译程序的构造需要掌握哪些原理和技术
内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。
㈡ 用C++语言对下述文法和单词表定义的语言设计编制一个编译器。(1)单词符号及种别表
系统与网络安全--主要是试用电脑方面的,和编程语言/数学的联系不大
计算机图形学--主要是一些图形显像的原理和算法,和编程靠点边,但是有点复杂,这个和楼主的专业有一点点联系吧,不过图形学里面的编程似乎其他地方都用不到
密码学--基本上是纯数学了,讲密码的加密和解密,感觉不深学的话很简单,学了不搞研究的话基本没有用
如果楼主想好好学学编程的话,不如直接去把C看个透彻,了解一下C++,其他都是一通百通的
要是非要在这三个课程里面选一个的话,我建议楼主选计算机图形学。<
学习编程,从何入手?
如果您想学习编程,却又不知从何入手,那么您不妨看看下面的几种学习方案,可能会给您一些启示吧!
方案一 Basic语言 & Visual Basic
优点
(1)Basic 简单易学,很容易上手。
(2)Visual Basic 提供了强大的可视化编程能力,可以让你轻松地做出漂亮的程序。
(3)众多的控件让编程变得象垒积木一样简单。
(4)Visual Basic 的全部汉化让我们这些见了English就头大的人喜不自禁。
缺点
(1)Visual Basic 不是真正的面向对象的开发文具。
(2)Visual Basic 的数据类型太少,而且不支持指针,这使得它的表达能力很有限。
(3)Visual Basic 不是真正的编译型语言,它产生的最终代码不是可执行的,是一种伪代码。它需要一个动态链接库去解释执行,这使得Visual Basic 的编译速度大大变慢。
综述:方案一适合初涉编程的朋友,它对学习者的要求不高,几乎每个人都可以在一个比较短的时间里学会vB编程,并用VB 做出自己的作品。对于那些把编程当做游戏的朋友来说,VB 是您最佳的选择。
方案二 Pascal语言 & Delphi
优点
(1)Pascal语言结构严谨,可以很好地培养一个人的编程思想。
(2)Delphi是一门真正的面向对象的开发工具,并且是完全的可视化。
(3)Delphi使用了真编译,可以让你的代码编译成为可执行的文件,而且编译速度非常快。
(4)Delphi具有强大的数据库开发能力,可以让你轻松地开发数据库。
缺点
Delphi几乎可以说是完美的,只是Pascal语言的过于严谨让人感觉有点烦。
综述: 方案二比较适合那些具有一定编程基础并且学过Pascal语言的朋友。
方案三 C语言 & Visual C++
优点
(1)C语言灵活性好,效率高,可以接触到软件开发比较底层的东西。
(2)微软的MFC库博大精深,学会它可以让随心所欲地进行编程。
(3)VC是微软制作的产品,与操作系统的结合更加紧密。
缺点
对使用者的要求比较高,既要具备丰富的C语言编程经验,又要具有一定的WINDOWS编程基础,它的过于专业使得一般的编程爱好者学习起来会有不小的困难。
综述: VC是程序员用的东西。如果你是一个永不满足的人,而且可以在编程上投入很大的精力和时间,那么学习VC你一定不会后悔的。
方案四 C++语言 & C++ Builder
优点
(1)C++语言的优点全部得以继承。
(2)完全的可是化。
(3)极强的兼容性,支持OWL、VCL和MFC三大类库。
(4)编译速度非常快。
缺点
由于推出的时间太短,关于它的各种资料还不太多。
综述:我认为C++ Builder 是最好的编程工具。它既保持了C++语言编程的优点,又做到了完全的可视化。
方案五 SQL语言 & Power Builder
对于一些传统的数据开发人员来说,Foxpro系列也许让他们感到更加熟悉。但是对于初学者来说,PowerBuilder也许是最好的数据库开发工具。各种各样的控件,功能强大的PowerBuilder语言都会帮助你开发出自己的数据库应用程序<
难道编写这些功能强大的软件调用的是编译器中内置的已经写好的具有某种强大功能的函数吗?
要想实现具有某些复杂功能的界面软件,一般都有库函数让你调用,windows下有MFC,linux下有QT等,JAVA上面则有swing,但是切记,一般的图形界面库只给你提供界面的显示,其具体功能还是要你自己来实现的,这就好比这些库函数给你一个外壳,你向里面装什么东西由你决定。
至于你所说的在屏幕上打印结果,则是编程的基础,因为大多数软件的作用都是和数据打交道,无非是对数据的增、删、改、查,显示等操作。而你在屏幕上打印的计算结果,即是对数据的改,和显示的过程,只不过显示的时候放在终端而已,而当你使用界面库函数的时候,就可以把这个结果显示到你需要显示的界面上去了。
最后,编程语言不仅仅只是对阿拉伯数字的
㈢ 程序是如何编写的
设计环境 程序也就是指令的集合,它告诉计算机如何执行特殊的任务。
㈣ 自顶向下的语法分析方法
一、 理解确定的自顶向下分析思想
确定的自顶向下分析方法,是从某文法的开始符号出发,考虑如何根据当前的输入符号(单词符号)唯一地确定选用哪个产生式替换相应非终结符往下推导,或如何构造一棵相应的语法树,其末端结点以从左向右的顺序连接正好为给定的输入符号串,则所给的输入符号串为该文法的句子。
二、 掌握LL(1)文法的判别步骤
一个文法中含有左递归和左公共因子绝对不是LL(1)文法,所以也就不可能用确定的自顶向下分析法。
某些含有左递归和左公共因子的文法在通过等价变换把它们消除以后可能变为LL(1)文法,但需要用LL(1)文法的定义判别,也就是说文法中不含左递归和左公共因子,只是LL(1)文法的必要条件。
掌握LL(1)文法的定义。熟练掌握FIRST集、FOLLOW集和SELECT集的计算方法。
三、某些非LL(1)文法到LL(1)文法的等价交换
理解两种非LL(1)文法的等价变换方法,特别要注意的是:消除了左递归、提取了左公共因子后不一定就能满足LL(1)文法的条件。
四、确定的自顶向下分析方法
掌握递归下降子程序的特点以及用PL/0程序分析PL/0编译程序的语法分析过程。
掌握如何构造预测分析表;
能用预测分析方法判断给定的输入符号串是否是该文法的句子。
㈤ 请问pascal编译程序的功能是什么
编辑词条编译程序
编译程序
compiler
把用高级程序设计语言书写的源程序,翻译成等价的计算机汇编语言或机器语言的目标程序的翻译程序。编译程序属于采用生成性实现途径实现的翻译程序。它以高级程序设计语言书写的源程序作为输入,而以汇编语言或机器语言表示的目标程序作为输出。编译出的目标程序通常还要经历运行阶段,以便在运行程序的支持下运行,加工初始数据,算出所需的计算结果。编译程序的实现算法较为复杂。这是因为它所翻译的语句与目标语言的指令不是一一对应关系,而是一多对应关系;同时也因为它要处理递归调用、动态存储分配、多种数据类型,以及语句间的紧密依赖关系。但是,由于高级程序设计语言书写的程序具有易读、易移植和表达能力强等特点,编译程序广泛地用于翻译规模较大、复杂性较高、且需要高效运行的高级语言书写的源程序。
功能 编译程序的基本功能是把源程序翻译成目标程序。但是,作为一个具有实际应用价值的编译系统,除了基本功能之外,还应具备语法检查、调试措施、修改手段、覆盖处理、目标程序优化、不同语言合用以及人-机联系等重要功能。①语法检查:检查源程序是否合乎语法。如果不符合语法,编译程序要指出语法错误的部位、性质和有关信息。编译程序应使用户一次上机,能够尽可能多地查出错误。②调试措施:检查源程序是否合乎设计者的意图。为此,要求编译程序在编译出的目标程序中安置一些输出指令,以便在目标程序运行时能输出程序动态执行情况的信息,如变量值的更改、程序执行时所经历的线路等。这些信息有助于用户核实和验证源程序是否表达了算法要求。③修改手段:为用户提供简便的修改源程序的手段。编译程序通常要提供批量修改手段(用于修改数量较大或临时不易修改的错误)和现场修改手段(用于运行时修改数量较少、临时易改的错误)。④覆盖处理:主要是为处理程序长、数据量大的大型问题程序而设置的。基本思想是让一些程序段和数据公用某些存储区,其中只存放当前要用的程序或数据;其余暂时不用的程序和数据,先存放在磁盘等辅助存储器中,待需要时动态地调入。⑤目标程序优化:提高目标程序的质量,即占用的存储空间少,程序的运行时间短。依据优化目标的不同,编译程序可选择实现表达式优化、循环优化或程序全局优化。目标程序优化有的在源程序级上进行,有的在目标程序级上进行。⑥不同语言合用:其功能有助于用户利用多种程序设计语言编写应用程序或套用已有的不同语言书写的程序模块。最为常见的是高级语言和汇编语言的合用。这不但可以弥补高级语言难于表达某些非数值加工操作或直接控制、访问外围设备和硬件寄存器之不足,而且还有利于用汇编语言编写核心部分程序,以提高运行效率。⑦人-机联系:确定编译程序实现方案时达到精心设计的功能。目的是便于用户在编译和运行阶段及时了解内部工作情况,有效地监督、控制系统的运行。
早期编译程序的实现方案,是把上述各项功能完全收纳在编译程序之中。然而,习惯做法是在操作系统的支持下,配置调试程序、编辑程序和连接装配程序,用以协助实现程序的调试、修改、覆盖处理,以及不同语言合用功能。但在设计编译程序时,仍须精心考虑如何与这些子系统衔接等问题。
工作过程 编译程序必须分析源程序,然后综合成目标程序。首先,检查源程序的正确性,并把它分解成若干基本成分;其次,再根据这些基本成分建立相应等价的目标程序部分。为了完成这些工作,编译程序要在分析阶段建立一些表格,改造源程序为中间语言形式,以便在分析和综合时易于引用和加工(图1)。
数据结构 分析和综合时所用的主要数据结构,包括符号表、常数表和中间语言程序。符号表由源程序中所用的标识符连同它们的属性组成,其中属性包括种类(如变量、数组、结构、函数、过程等)、类型(如整型、实型、字符串、复型、标号等),以及目标程序所需的其他信息。常数表由源程序中用的常数组成,其中包括常数的机内表示,以及分配给它们的目标程序地址。中间语言程序是将源程序翻译为目标程序前引入的一种中间形式的程序,其表示形式的选择取决于编译程序以后如何使用和加工它。常用的中间语言形式有波兰表示、三元组、四元组以及间接三元组等。
分析部分 源程序的分析是经过词法分析、语法分析和语义分析三个步骤实现的。词法分析由词法分析程序(又称为扫描程序)完成,其任务是识别单词(即标识符、常数、保留字,以及各种运算符、标点符号等)、造符号表和常数表,以及将源程序换码为编译程序易于分析和加工的内部形式。语法分析程序是编译程序的核心部分,其主要任务是根据语言的语法规则,检查源程序是否合乎语法。如不合乎语法,则输出语法出错信息;如合乎语法,则分解源程序的语法结构,构造中间语言形式的内部程序。语法分析的目的是掌握单词是怎样组成语句的,以及语句又是如何组成程序的。语义分析程序是进一步检查合法程序结构的语义正确性,其目的是保证标识符和常数的正确使用,把必要的信息收集和保存到符号表或中间语言程序中,并进行相应的语义处理。
综合部分 综合阶段必须根据符号表和中间语言程序产生出目标程序,其主要工作包括代码优化、存储分配和代码生成。代码优化是通过重排和改变程序中的某些操作,以产生更加有效的目标程序。存储分配的任务是为程序和数据分配运行时的存储单元。代码生成的主要任务是产生与中间语言程序符等价的目标程序,顺序加工中间语言程序,并利用符号表和常数表中的信息生成一系列的汇编语言或机器语言指令。
结构 编译过程分为分析和综合两个部分,并进一步划分为词法分析、语法分析、 语义分析、 代码优化、存储分配和代码生成等六个相继的逻辑步骤。这六个步骤只表示编译程序各部分之间的逻辑联系,而不是时间关系。编译过程既可以按照这六个逻辑步骤顺序地执行,也可以按照平行互锁方式去执行。在确定编译程序的具体结构时,常常分若干遍实现。对于源程序或中间语言程序,从头到尾扫视一次并实现所规定的工作称作一遍。每一遍可以完成一个或相连几个逻辑步骤的工作。例如,可以把词法分析作为第一遍;语法分析和语义分析作为第二遍;代码优化和存储分配作为第三遍;代码生成作为第四遍。反之,为了适应较小的存储空间或提高目标程序质量,也可以把一个逻辑步骤的工作分为几遍去执行。例如,代码优化可划分为代码优化准备工作和实际代码优化两遍进行。
一个编译程序是否分遍,以及如何分遍,根据具体情况而定。其判别标准可以是存储容量的大小、源语言的繁简、解题范围的宽窄,以及设计、编制人员的多少等。分遍的好处是各遍功能独立单纯、相互联系简单、逻辑结构清晰、优化准备工作充分。缺点是各遍之中不可避免地要有些重复的部分,而且遍和遍之间要有交接工作,因之增加了编译程序的长度和编译时间。
一遍编译程序是一种极端情况,整个编译程序同时驻留在内存,彼此之间采用调用转接方式连接在一起(图2)。当语法分析程序需要新符号时,它就调用词法分析程序;当它识别出某一语法结构时,它就调用语义分析程序。语义分析程序对识别出的结构进行语义检查,并调用“存储分配”和“代码生成”程序生成相应的目标语言指令。
随着程序设计语言在形式化、结构化、直观化和智能化等方面的发展,作为实现相应语言功能的编译程序,也正向自动程序设计的目标发展,以便提供理想的程序设计工具。
参考书目
陈火旺、钱家骅、孙永强编:《编译原理》,国防工业出版社,北京,1980。
A.V.Aho, Principles of Compiler Design,Addison Wes-ley, Reading, Massachusetts, 1977.
--------------------------------------------------------------------------------
编译程序 (compiler)
将用高级程序设计语言书写的源程序,翻译成等价的用计算机汇编语言、机器语言或某种中间语言表示的目标程序的翻译程序。用户利用编译程序实现数据处理任务时,先要经历编译阶段,再经历运行阶段。编译阶段以源程序作为输入,以目标程序作为输出,其主要任务是将源程序翻译成目标程序。运行阶段的任务是运行所编译出的目标程序,实现源程序中指定的数据处理任务,其工作通常包括:输入初始数据,对数据或文件进行数据加工,输出必要信息和加工结果等。编译程序的实现算法较为复杂。这是因为它所翻译的语句与目标语言的指令不是一一对应关系,而是一多对应关系;同时因为它要在编译阶段处理递归调用、动态存储分配、多种数据类型 实现 、 代码生成与代码优化等繁杂技术问题;还要在运行阶段提供良好、有效的运行环境。由于高级程序设计语言书写的程序具有易读、易移植和表达能力强等特点,所以编译程序广泛地用于翻译规模较大、复杂性较高、且需要高效运行的高级语言书写的源程序。
功能 编译程序的基本功能是把源程序翻译成目标程序。此外,还要具备语法检查、调试措施、修改手段、覆盖处理、目标程序优化、不同语言合用以及人机联系等具有实际应用价值的重要功能。①语法检查。检查源程序是否合乎语法 。②调试措施。检查源程序是否合乎用户的设计意图。③修改手段。为用户提供简便的修改源程序的手段。④覆盖处理。主要为处理程序较长、数据量较大的大型问题程序而设置。基本思想是让一些程序段和数据公用某些存储区,其中只存放当前要用的程序段或数据,其余暂时不用的程序段和数据均存放在磁盘等辅助存储器中,待需要时动态地调入存储区中运行。⑤目标程序优化。提高目标程序的质量,即使编译出的目标程序运行时间短、占用存储少。⑥不同语言合用 。便于用户利用多种程序设计语言编写应用程序或套用已有的不同语言书写的程序模块。最为常见的是高级语言和汇编语言的合用。⑦人机联系。便于用户在编译和运行阶段及时了解系统内部工作情况,有效地监督、控制系统的运行。
早期编译程序的实现方案,是把上述各项功能完全收纳在编译程序之中 。后来的习惯方法是在操作系统的支持下,配置编辑程序、调试程序、连接装配程序等实用程序或工具软件,目的是创造一个良好的开发环境和运行环境,便于应用软件的编程、修改、调试、集成以及报表生成、界面设计等工作。但编译程序设计者设计编译方案时,仍需精心考虑上述各项功能,较好地解决目标程序与这些实用程序或软件工具之间的配合与衔接等问题。
工作过程 编译程序必须分析源程序,然后综合成目标程序。为达到这个目的,编译程序要在分析阶段建立一些表格,改造源程序为中间语言形式,以便在分析和综合时易于引用和加工。
数据结构 分析和综合时所用的主要数据结构,包括符号表、常数表和中间语言程序。符号表由源程序中所用的标识符连同它们的属性组成,其中属性包括种类(如变量、数组、结构、函数、过程等)、类型(如整型、实型、字符串、复型、标号等),以及目标程序所需的其他信息。常数表由源程序中用的常数组成,其中包括常数的机内表示以及分配给它们的目标程序地址。中间语言程序是将源程序翻译成目标程序前引入的一种中间形式的程序,其表示形式的选择取决于编译程序以后如何使用它和如何加工它。常用的中间语言形式有波兰表示、三元组、四元组以及间接三元组等。
分析部分 源程序的分析是经过词法分析、语法分析和语义分析三个步骤实现的。词法分析由词法分析程序(又称为扫描程序 )完成,其任务是识别单词(即标识符 、常数、保留字,以及各种运算符、标点符号等)、造符号表和常数表,以及将源程序换码为编译程序易于分析和加工的内部形式。语法分析程序是编译程序的核心部分,其主要任务是根据语言的语法规则,检查源程序是否合乎语法,并分解源程序。如果不合乎语法,则输出语法出错信息;如果合乎语法,则分解源程 序的语法结构, 构造中间语 言形式的内部程序。语法分析的目的是掌握单词是怎样组成语句的,以及语句又是如何组成程序的。语义分析程序进一步检查合法程序结构的语义正确性,其目的是保证标识符和常数的正确使用,把必要的信息收集和保存到符号表或中间语言程序中,并进行相应的语义处理。
综合部分 综合阶段根据符号表和中间语言程序产生出目标程序,其主要工作包括代码优化、存储分配和代码生成。代码优化是通过重排和改变程序中的某些操作,以产生更加有效的目标程序。存储分配是为程序和数据分配运行时的存储单元。 代码生成是产 生与中间语 言程序等价的目标程序,亦即,顺序加工中间语言程序,利用符号表和常数表中的信息生成一系列的汇编语言或机器语言指令。
动态 20世纪80年代以后,程序设计语言在形式化、结构化、直观化和智能化等方面有了长足的进步和发展,主要表现在两个方面:①随着程序设计理论和方法的发展,相继推出了一系列新型程序设计语言,如结构化程序设计语言、并发程序设计语言、分布式程序设计语言、函数式程序设计语言、智能化程序设计语言、面向对象程序设计语言等;②基于语法、语义和语用方面的研究成果,从不同的角度和层次上深刻地揭示了程序设计语言的内在规律和外在表现形式。与此相应地,作为实现程序设计语言重要手段之一的编译程序,在体系结构、设计思想、实现技术和处理内容等方面均有不同程度的发展、变化和扩充。另外,编译程序已作为实现编程的重要软件工具,被纳入到软件支援环境的基本层软件工具之中。因此,规划编译程序实现方案时,应从所处的具体软件支援环境出发,既要遵循整个环境的全局性要求和规定,又要精心考虑与其他诸层软件 工具之间的相互支援、配合和衔接关系。
㈥ 编译原理PL/0如何将
1、分析原来的IF语句的BNF
<条件语句>::=IF <条件>THEN <语句>
和扩展后的IF语句的BNF
<条件语句>::=IF <条件>THEN <语句>[ELSE <语句>]
在原有的程序上把if----then 扩展为if then else(不是改程序里的if then,而是实现能分析if then else,原有的只能分析if then)
2、pl0的一维数组扩充
分析BNF
<数组变量声明>::=<标识符> ( <下界>: <上界>)
<数组变量引用>::= <标识符> ( <表达式> )
在实现上的要求
找到应该修改的地方,进行修改和扩充
㈦ pl0是什么类PCODE是什么
你是不是说poi包啊。这是专门用来操作的excel的jar包,pcode是什么啊,没听过
㈧ 编制一个读单词程序,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运
你这是要做一个编译器的词法分析程序么?怎么会跑到英语考试版块。建议你去读下《编译原理》这本书,前面有讲解,书后有整个编译器PL0的源代码,可以参考下。
㈨ 编译原理 词法分析器的问题
#include <iostream>
#include <vector>
#include <utility>
#include <string>
#include <fstream>
#include <algorithm>
#include <cstdlib>
using namespace std;
//用来存储目标文件名
string file_name;
//提取文本文件中的信息。
string GetText();
//获得一个单词符号,从位置i开始查找。
//并且有一个引用参数j,用来返回这个单词最后一个字符在str的位置。
string GetWord(string str,int i,int& j);
//这个函数用来除去字符串中连续的空格和换行
//第一个参数为目标字符串,第二个参数为开始位置
//返回值为连续的空格和换行后的第一个有效字符在字符串的位置
int DeleteNull(string str,int i);
//判断i当前所指的字符是否为一个分界符,是的话返回真,反之假
bool IsBoundary(string str,int i);
//判断i当前所指的字符是否为一个运算符,是的话返回真,反之假
bool IsOperation(string str,int i);
//此函数将一个pair数组输出到一个文件中
void OutFile(vector<pair<int,string> > v);
//此函数接受一个字符串数组,对它进行词法分析,返回一个pair型数组
vector<pair<int,string> > analyst(vector<string> vec);
//此函数判断传递的参数是否为关键字,是的话,返回真,反之返回假
bool IsKey(string str);
int main()
{
cout<<"###########################\n";
cout<<"###right: Giftedbird###\n";
cout<<"###########################\n";
string com1=" ";
string com2="\n";
string fileline=GetText();
int begin=0,end=0;
vector<string> array;
do
{
begin=DeleteNull(fileline,begin);
string nowString;
nowString=GetWord(fileline,begin,end);
if(end==-1)
break;
if(nowString.compare(com1)&&nowString.compare(com2))
array.push_back(nowString);
begin=end+1;
}while(true);
vector<pair<int,string> > mid_result;
mid_result=analyst(array);
OutFile(mid_result);
cout<<"**********************************************************************\n";
cout<<"***程序已完成词法分析,分析结果已经存储在文件"<<file_name<<"中!!!***\n";
cout<<"**********************************************************************\n";
system("pause");
return 0;
}
//提取文本文件中的信息
string GetText()
{
string file_name1;
cout<<"请输入源文件名(包括路径和后缀名):";
cin>>file_name1;
ifstream infile(file_name1.c_str(),ios::in);
if (!infile)
{
cerr<<"哦!无法打开文件 "<<file_name1.c_str()<<" !!!"<<endl;
exit(-1);
}
cout<<endl;
char f[1000];
infile.getline(f,1000,EOF);
infile.close();
return f;
}
//获得一个单词符号,从位置i开始查找。
//并且有一个引用参数j,用来返回这个单词最后一个字符在原字符串的位置。
string GetWord(string str,int i,int& j)
{
string no_use("(){} , ; \n+=*/-<>\"");
j=str.find_first_of(no_use,i);
if(j==-1)
return "";
if(i!=j)
j--;
return str.substr(i,j-i+1);
}
//这个函数用来除去字符串中连续的空格和换行
//第一个参数为目标字符串,第二个参数为开始位置
//返回值为连续的空格和换行后的第一个有效字符在字符串的位置
int DeleteNull(string str,int i)
{
for(;;i++)
if(str[i]!=' '&&str[i]!='\n')
return i;
}
//判断i当前所指的字符是否为一个分界符,是的话返回真,反之假
bool IsBoundary(string str,int i)
{
int t;
char arr[7]={',',';','{','}','(',')','\"'};
for (t=0;t<7;t++)
if(str[i]==arr[t])
return true;
return false;
}
//判断i当前所指的字符是否为一个运算符,是的话返回真,反之假
bool IsOperation(string str,int i)
{
int t;
char arr[7]={'+','-','*','/','=','<','>'};
for (t=0;t<7;t++)
if(str[i]==arr[t])
return true;
return false;
}
//此函数将一个个字符串数组输出到一个文件中
void OutFile(vector<pair<int,string> > v)
{
cout<<"请输入目标文件名(包括路径和后缀名):";
cin>>file_name;
ofstream outfile(file_name.c_str(),ios::out);
if (!outfile)
{
cerr<<"哦!无法打开文件 "<<file_name.c_str()<<" !!!"<<endl;
exit(-1);
}
cout<<endl;
int i;
outfile<<"###########################\n";
outfile<<"###right: Giftedbird###\n";
outfile<<"###########################\n\n";
for(i=0;i<v.size();i++)
outfile<<"<"<<v[i].first<<" , \""<<v[i].second<<"\">"<<endl;
outfile<<"\n\n*********************************\n";
outfile.close();
return;
}
//此函数接受一个字符串数组,对它进行词法分析,返回一个pair型数组
vector<pair<int,string> > analyst(vector<string> vec)
{
vector<pair<int,string> > temp;
int i;
for(i=0;i<vec.size();i++)
{
if(vec[i].size()==1)
{
if((vec[i]==">"||vec[i]=="<"||vec[i]=="!")&&vec[i+1]=="=")
{
string jk=vec[i];
jk.append(vec[++i],0,1);
pair<int,string> pp(4,jk);
temp.push_back(pp);
continue;
}
if((vec[i]=="+"&&vec[i+1]=="+")||(vec[i]=="-"&&vec[i+1]=="-"))
{
string jk=vec[i];
jk.append(vec[++i],0,1);
pair<int,string> pp(4,jk);
temp.push_back(pp);
continue;
}
if(IsBoundary(vec[i],0))
{
pair<int,string> pp(5,vec[i]);
temp.push_back(pp);
}
else if(IsOperation(vec[i],0))
{
pair<int,string> pp(4,vec[i]);
temp.push_back(pp);
}
else if(vec[i][0]<='9'&&vec[i][0]>='0')
{
pair<int,string> pp(3,vec[i]);
temp.push_back(pp);
}
else
{
pair<int,string> pp(2,vec[i]);
temp.push_back(pp);
}
}
else if(vec[i][0]<='9'&&vec[i][0]>='0')
{
pair<int,string> pp(3,vec[i]);
temp.push_back(pp);
}
else if(IsKey(vec[i]))
{
pair<int,string> pp(1,vec[i]);
temp.push_back(pp);
}
else
{
pair<int,string> pp(2,vec[i]);
temp.push_back(pp);
}
}
return temp;
}
//此函数判断传递的参数是否为关键字,是的话,返回真,反之返回假
bool IsKey(string str)
{
string p[16]={"char","double","int","long","double","float","for","while","do","break","continue","switch","short","case","return","if"};
vector<string> ppp(p,p+16);
int u;
for(u=0;u<ppp.size();u++)
if(!str.compare(ppp[u]))
return true;
return false;
}
//finished
㈩ 什么是PL/M程序
PL/M是Intel从8080微处理器开始为其系列产品开发的编程语言。 它很像PASCAL,是一种结构化语言,但它使用关键字去定义结构。 PL/M编译器好像汇编器一样可产生紧凑代码。PL/M总的来说是\"高 级汇编语言\",可详细控制着代码的生成。但对51系列,PL/M不支 持复杂的算术运算、浮点变量而无丰富的库函数支持。学习PL/M无 异于学习一种新语言。