编译实验报告

合集下载

编译技术实验报告词法(3篇)

编译技术实验报告词法(3篇)

第1篇一、实验目的本次实验旨在通过实践加深对编译技术中词法分析阶段的理解,掌握词法分析的基本原理和方法,能够实现一个简单的词法分析器,并对源代码进行初步的符号化处理。

二、实验环境1. 操作系统:Windows 102. 编程语言:Java3. 开发工具:Eclipse IDE4. 实验素材:实验提供的C语言源代码三、实验原理词法分析是编译过程中的第一个阶段,其主要任务是将源代码中的字符序列转换成一系列的词法单元(Token)。

词法单元是构成源程序的基本单位,如标识符、关键字、运算符等。

词法分析的基本原理如下:1. 字符流:从源代码中逐个读取字符,形成字符流。

2. 状态转换:根据字符流中的字符,在有限状态自动机(FSM)中转换状态。

3. 词法单元生成:当状态转换完成后,生成对应的词法单元。

4. 错误处理:在分析过程中,如果遇到无法识别的字符或状态,进行错误处理。

四、实验步骤1. 设计词法分析器:根据C语言的语法规则,设计有限状态自动机,定义状态转换图。

2. 实现状态转换函数:根据状态转换图,实现状态转换函数,用于将字符流转换为词法单元。

3. 实现词法单元生成函数:根据状态转换结果,生成对应的词法单元。

4. 测试词法分析器:使用实验提供的C语言源代码,测试词法分析器的正确性。

五、实验结果与分析1. 词法分析器设计:根据C语言的语法规则,设计了一个包含26个状态的状态转换图。

状态转换图包括以下状态:- 初始状态:用于开始分析。

- 标识符状态:用于分析标识符。

- 关键字状态:用于分析关键字。

- 运算符状态:用于分析运算符。

- 数字状态:用于分析数字。

- 字符串状态:用于分析字符串。

- 错误状态:用于处理非法字符。

2. 状态转换函数实现:根据状态转换图,实现了状态转换函数。

该函数用于将字符流转换为词法单元。

3. 词法单元生成函数实现:根据状态转换结果,实现了词法单元生成函数。

该函数用于生成对应的词法单元。

编译原理实验报告

编译原理实验报告

编译原理实验报告一、实验目的本次编译原理实验的主要目的是通过实践加深对编译原理中词法分析、语法分析、语义分析和代码生成等关键环节的理解,并提高实际动手能力和问题解决能力。

二、实验环境本次实验使用的编程语言为 C/C++,开发工具为 Visual Studio 2019,操作系统为 Windows 10。

三、实验内容(一)词法分析器的设计与实现词法分析是编译过程的第一个阶段,其任务是从输入的源程序中识别出一个个具有独立意义的单词符号。

在本次实验中,我们使用有限自动机的理论来设计词法分析器。

首先,我们定义了单词的种类,包括关键字、标识符、常量、运算符和分隔符等。

然后,根据这些定义,构建了相应的状态转换图,并将其转换为程序代码。

在实现过程中,我们使用了字符扫描和状态转移的方法,逐步读取输入的字符,判断其所属的单词类型,并将其输出。

(二)语法分析器的设计与实现语法分析是编译过程的核心环节之一,其任务是在词法分析的基础上,根据给定的语法规则,判断输入的单词序列是否构成一个合法的句子。

在本次实验中,我们采用了自顶向下的递归下降分析法来实现语法分析器。

首先,我们根据给定的语法规则,编写了相应的递归函数。

每个函数对应一种语法结构,通过对输入单词的判断和递归调用,来确定语法的正确性。

在实现过程中,我们遇到了一些语法歧义的问题,通过仔细分析语法规则和调整函数的实现逻辑,最终解决了这些问题。

(三)语义分析与中间代码生成语义分析的任务是对语法分析所产生的语法树进行语义检查,并生成中间代码。

在本次实验中,我们使用了四元式作为中间代码的表示形式。

在语义分析过程中,我们检查了变量的定义和使用是否合法,类型是否匹配等问题。

同时,根据语法树的结构,生成相应的四元式中间代码。

(四)代码优化代码优化的目的是提高生成代码的质量和效率。

在本次实验中,我们实现了一些基本的代码优化算法,如常量折叠、公共子表达式消除等。

通过对中间代码进行分析和转换,减少了代码的冗余和计算量,提高了代码的执行效率。

编译原理实验报告

编译原理实验报告

编译原理实验报告一、实验概述本次实验旨在设计并实现一个简单的词法分析器,即实现编译器的第一个阶段,词法分析。

词法分析器将一段源程序代码作为输入,将其划分为一个个的词法单元,并将其作为输出。

二、实验过程1.设计词法规则根据编程语言的规范和所需实现的功能,设计词法规则,以明确规定如何将源程序代码分解为一系列的词法单元。

2.实现词法分析器采用合适的编程语言,根据所设计的词法规则,实现词法分析器。

词法分析器的主要任务是读入源程序代码,并将其根据词法规则进行分解,生成对应的词法单元。

3.测试词法分析器设计测试用例,用于检验词法分析器的正确性和性能。

测试用例应包含各种情况下的源程序代码。

4.分析和修正错误根据测试过程中发现的问题,分析产生错误的原因,并进行修正。

重复测试和修正的过程,直到词法分析器能够正确处理所有测试用例。

三、实验结果我们设计了一个简单的词法分析器,并进行了测试。

测试用例涵盖了各种情况下的源程序代码,包括正确的代码和错误的代码。

经过测试,词法分析器能够正确处理所有的测试用例。

词法分析器将源程序代码分解为一系列的词法单元,每个词法单元包含了单词的种类和对应的值。

通过对词法单元的分析,可以进一步进行语法分析和语义分析,从而完成编译过程。

四、实验总结通过本次实验,我深入了解了编译原理的词法分析阶段。

词法分析是编译器的第一个重要阶段,它将源程序代码分解为一个个的词法单元,为后续的语法分析和语义分析提供基础。

在实现词法分析器的过程中,我学会了如何根据词法规则设计词法分析器的算法,并使用编程语言实现词法分析器。

通过测试和修正,我掌握了调试和错误修复的技巧。

本次实验的经验对我今后的编程工作有很大帮助。

编译原理是计算机科学与技术专业的核心课程之一,通过实践能够更好地理解和掌握其中的概念和技术。

我相信通过进一步的学习和实践,我能够在编译原理领域取得更大的成果。

编译原理实验报告

编译原理实验报告

编译原理实验报告一、实验目的编译原理是计算机科学中的重要学科,它涉及到将高级编程语言转换为计算机能够理解和执行的机器语言。

本次实验的目的是通过实际操作和编程实践,深入理解编译原理中的词法分析、语法分析、语义分析以及中间代码生成等关键环节,提高我们对编译过程的认识和编程能力。

二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。

此外,还使用了一些相关的编译工具和调试工具,如 GDB 等。

三、实验内容(一)词法分析器的实现词法分析是编译过程的第一步,其任务是将输入的源程序分解为一个个单词符号。

在本次实验中,我们使用有限自动机的理论来设计和实现词法分析器。

首先,定义了各种单词符号的类别,如标识符、关键字、常量、运算符等。

然后,根据这些类别设计了相应的状态转换图,并将其转换为代码实现。

在实现过程中,使用了正则表达式来匹配输入字符串中的单词符号。

对于标识符和常量等需要进一步处理的单词符号,使用了相应的规则进行解析和转换。

(二)语法分析器的实现语法分析是编译过程的核心环节之一,其任务是根据给定的语法规则,分析输入的单词符号序列是否符合语法结构。

在本次实验中,我们使用了递归下降的语法分析方法。

首先,根据实验要求定义了语法规则,并将其转换为相应的递归函数。

在递归函数中,通过对输入单词符号的判断和处理,逐步分析语法结构。

为了处理语法错误,在分析过程中添加了错误检测和处理机制。

当遇到不符合语法规则的输入时,能够输出相应的错误信息,并尝试进行恢复。

(三)语义分析及中间代码生成语义分析的目的是对语法分析得到的语法树进行语义检查和语义处理,生成中间代码。

在本次实验中,我们使用了三地址码作为中间代码的表示形式。

在语义分析过程中,对变量的定义和使用、表达式的计算、控制流语句等进行了语义检查和处理。

对于符合语义规则的语法结构,生成相应的三地址码指令。

四、实验步骤(一)词法分析器的实现步骤1、定义单词符号的类别和对应的正则表达式。

编译原理实验报告

编译原理实验报告

编译原理实验报告编译原理实验报告一、实验目的1. 了解编译器的基本原理和工作过程;2. 掌握编译器设计和实现的基本方法和技巧;3. 通过设计和实现一个简单的编译器,加深对编程语言和计算机系统的理解和认识。

二、实验原理编译器是将高级语言程序翻译成机器语言程序的一种软件工具。

它由编译程序、汇编程序、链接程序等几个阶段组成。

本次实验主要涉及到的是编译程序的设计和实现。

编译程序的基本原理是将高级语言程序转换为中间代码,再将中间代码转换为目标代码。

整个过程可以分为词法分析、语法分析、语义分析、代码生成和代码优化几个阶段。

三、实验内容本次实验的设计目标是实现一个简单的四则运算表达式的编译器。

1. 词法分析根据规定的语法规则,编写正则表达式将输入的字符串进行词法分析,将输入的四则运算表达式划分成若干个单词(Token),例如:运算符、操作数等。

2. 语法分析根据定义的语法规则,编写语法分析程序,将词法分析得到的Token序列还原成语法结构,构建抽象语法树(AST)。

3. 语义分析对AST进行遍历,进行语义分析,判断表达式是否符合语法规则,检查语义错误并给出相应的提示。

4. 代码生成根据AST生成目标代码,目标代码可以是汇编代码或者机器码。

四、实验过程和结果1. 首先,根据输入的表达式,进行词法分析。

根据所定义的正则表达式,将输入的字符串划分成Token序列。

例如:输入表达式“2+3”,经过词法分析得到的Token序列为["2", "+", "3"]。

2. 然后,根据语法规则,进行语法分析。

根据输入的Token序列,构建抽象语法树。

3. 接着,对抽象语法树进行语义分析。

检查表达式是否符合语法规则,给出相应的提示。

4. 最后,根据抽象语法树生成目标代码。

根据目标代码的要求,生成汇编代码或者机器码。

五、实验总结通过本次实验,我对编译器的工作原理有了更深入的认识,掌握了编译器设计和实现的基本方法和技巧。

编译实习报告

编译实习报告

编译实习报告篇一:篇一:编译原理实习报告实习报告【实习目的】1.了解编译器的工作原理2.掌握并加深本学期所学的编译原理的理论知识3.加强自己的动手能力【实习内容】1.编译并运行老师所给的编译器参考代码2.在第一步的基础上进一步改进编译器,增加输入输出功能【开发平台】window系统,free pascal编译器【实习过程】本次实习过程根据实习内容共分两大部分,第一部分,编译运行参考代码;第二部分,进一步改进编译器。

本人在上面的基础上又增加了第三部分的额外修改。

下面便总结这三部分的实习过程:一、增加读写语句前pl0编译程序由于最原始的pl0编译程序所用的pascal版本较老,有些和当前使用版本不兼容。

必须作相应修改,具体是:“object”和“procedure”为pascal的保留字,现分别改成“obj”和“proc”。

此外,原始程序中的“≠”、“≤”和“≥”,不能用ascii 码表示出来,现将其替换成“”、“=”。

作为一个编译程序,支持批量处理和永久保存是其应具备的基本功能。

为此,本程序加入了文件读写功能,即从文件读入pl0源程序,在将中间代码和运行结果写入文件。

由于源程序和原始差别很小,为节省篇幅,不将其打印出来。

二、增加读写语句前pl0调试程序下面是增加读写语句前的pl0程序,包含了乘、除法和寻找两个自然数的最大公因数的过程和主过程,很好的说明了增加读写语句前的pl0语言的使用方法。

constvarx,y,z,q,r; procedure multiply; var a,b; a:=x; begin m=7,n=85;procedure divide; var end; b:=y; z:=0; while b>0 do begin end if odd b then z:=z+a; a:=2*a; b:=b/2;w;beginr:=x;q:=0;w:=y;while wy dobegin q:=2*q; w:=w/2;if wg dobeginif f0 do 13begin13 if odd b then z:=z+a; 20 a:=2*a;24 b:=b/2; 28end28 end;2 int 0 53 lod 1 34 sto 0 35 lod 1 46 sto 0 47 lit 0 08 sto 1 59 lod 0 410 lit 0 011 opr 01212 jpc 02913 lod 0 414 opr 0 615 jpc 02016 lod 1 517 lod 0 318 opr 0 219 sto 1 520 lit 0 221 lod 0 322 opr 0 423 sto 0 324 lod 0 425 lit 0 226 opr 0 527 sto 0 428 jmp 0 929 opr 0 03030 procedure divide;30 var31w;31 begin32r:=x;34q:=0;36w:=y;38while wy do51begin q:=2*q; w:=w/2;59 if w篇二:编译原理实习报告实习报告【实习目的】1.了解编译器的工作原理2.掌握并加深本学期所学的编译原理的理论知识3.加强自己的动手能力【实习内容】1.编译并运行老师所给的编译器参考代码2.在第一步的基础上进一步改进编译器,增加输入输出功能【开发平台】Window系统,Free Pascal编译器【实习过程】本次实习过程根据实习内容共分两大部分,第一部分,编译运行参考代码;第二部分。

编译方法实验报告(中间代码生成器)

编译方法实验报告(中间代码生成器)

编译方法实验报告2011年10月一、实验目的熟悉算术表达式的语法分析与中间代码生成原理。

二、实验内容(1)设计语法制导翻译生成表达式的四元式的算法;(2)编写代码并上机调试运行通过。

输入——算术表达式;输出——语法分析结果;相应的四元式序列。

(3)设计LL(1)分析法或LR(0)分析法的属性翻译文法, 并根据这些属性翻译文法, 使用扩展的语法分析器实现语法制导翻译。

三、实验原理及基本步骤●算术表达式文法:G(E): E ( E ω0 T | TT →T ω1 F | FF → i | (E)●文法变换:G’(E) E →T {ω0 T}T →F {ω1 F}F → i | (E)●属性翻译文法:E →T {ω0“push(SYN, w)” T “QUAT”}T →F {ω1“push(SYN, w)” F “QUAT”}F →i “push(SEM, entry(w))” | (E)其中:push(SYN, w) —当前单词w入算符栈SYN;push(SEM, entry(w)) —当前w在符号表中的入口值压入语义栈SEM;QUAT —生成四元式函数i. T = newtemp;ii. QT[j] =( SYN[k], SEM[s-1], SEM[s], T);j++;iii. pop( SYN, _ ); pop( SEM, _ ); pop( SEM, _ );push( SEM, T );●递归下降子程序:数据结构: SYN —算符栈;SEM —语义栈;四、数据结构设计使用递归的结构进行四元式的设计, 同时, 运用堆栈结构将四元式的输出序列打印出来while ( exp[i]=='+' || exp[i]=='-'){syn[++i_syn]=exp[i]; //push(SYN,w)i++; //read(w)T();quat();}while ( exp[i]=='*' || exp[i]=='/'){syn[++i_syn]=exp[i]; //push(SYN,w)i++; //read(w)F();quat();}void quat(){strcpy(qt[j],"(, , , )"); //QT[j]:=(SYN[k],SEM[s-1],SEM[s],temp);qt[j][1]=syn[i_syn];qt[j][3]=sem[i_sem-1];qt[j][5]=sem[i_sem];qt[j][7]=temp;j++;i_syn--; //pop(SYN);i_sem--; //pop(SEM);i_sem--; //pop(SEM);sem[++i_sem]=temp; //push(SEM,temp);temp++;}五、关键代码分析(带注释)及运行结果#include <iostream>#include "string.h"#include "stdio.h"using namespace std;char syn[10]; //文法符号栈int i_syn;char sem[10]; //运算对象栈int i_sem;char exp[50]; //算术表达式区int i;char qt[30][15]; //四元式区int j=0;char temp='q'; //临时变量, 取值为r--zint E();int T();int F();void quat(); //生成四元式函数int main(int argc, char* argv[]){printf("please input your expression:");scanf("%s",exp); //输入四元式i=0; //read(w)E();if (exp[i]=='\0')for (i=0;i<j;i++) //输出四元式序列printf("%s\n",qt[i]);elseprintf("err");return 0;}int E(){T();while ( exp[i]=='+' || exp[i]=='-'){syn[++i_syn]=exp[i]; //push(SYN,w)i++; //read(w)T();quat();}return 1;}int T(){F();while ( exp[i]=='*' || exp[i]=='/'){syn[++i_syn]=exp[i]; //push(SYN,w)i++; //read(w)F();quat();}return 1;}int F(){if ( exp[i]=='('){i++; //read(w)E();if ( exp[i]!=')'){printf("err");return 0;}}else if ((exp[i]>='a' && exp[i]<='p')||(exp[i]>='0' && exp[i]<='9')){ sem[++i_sem]=exp[i]; } //push(SEM,w) else{printf("err");return 0;}i++; //read(w)return 1;}void quat(){strcpy(qt[j],"( , , , )"); //QT[j]:=(SYN[k],SEM[s-1],SEM[s],temp);qt[j][1]=syn[i_syn];qt[j][3]=sem[i_sem-1];qt[j][5]=sem[i_sem];qt[j][7]=temp;j++;i_syn--; //pop(SYN);i_sem--; //pop(SEM);i_sem--; //pop(SEM);sem[++i_sem]=temp; //push(SEM,temp);temp++;}六、总结与分析我们知道, 定义一种语言除了要求定义语法外, 还要求定义语义, 即对语言的各种语法单位赋予具体的意义。

编译实习报告

编译实习报告

编译实习报告一、实习背景随着计算机技术的不断发展,编译技术在软件开发和计算机科学领域中起着至关重要的作用。

为了更好地了解编译原理在实际应用中的具体实现,提高自己的实际动手能力,我参加了为期三个月的编译实习项目。

在实习期间,我深入学习了编译原理的基本知识,并参与了编译器的开发与优化过程。

二、实习内容1. 编译原理学习在实习的第一阶段,我系统地学习了编译原理的基本知识,包括文法、语法分析、中间代码生成、代码优化和目标代码生成等。

通过学习,我掌握了编译器的基本组成部分及其工作原理,为后续的实践操作打下了坚实的基础。

2. 编译器开发在实习的第二阶段,我参与了编译器的开发过程。

首先,我使用C语言编写了一个简单的编译器前端,实现了源代码的词法分析和语法分析。

在此基础上,我进一步实现了中间代码的生成和代码优化模块。

最后,我完成了目标代码的生成和运行。

整个过程中,我深刻体会到了编译原理在实际应用中的重要性。

3. 编译器优化在实习的第三阶段,我主要负责编译器的优化工作。

通过对中间代码的分析和调整,我实现了常数折叠、死代码消除和循环优化等优化策略。

经过优化,编译器生成的目标代码在运行效率和内存占用方面都有了显著的提升。

三、实习收获1. 知识运用通过实习,我将所学的编译原理知识运用到了实际项目中,提高了自己的实际动手能力。

同时,实习过程中遇到的问题也促使我不断深入学习相关知识,提高了自己的理论水平。

2. 团队协作在实习过程中,我与团队成员密切配合,共同解决问题。

这使我更加明白了团队协作的重要性,也锻炼了我的沟通与协作能力。

3. 工程实践实习过程中,我独立完成了编译器的开发与优化任务,掌握了工程实践的基本方法。

这对我今后从事软件开发工作具有很大的帮助。

四、实习总结通过这次编译实习,我对编译原理有了更深入的了解,并在实际项目中积累了宝贵的经验。

同时,实习过程中的挑战和困难也让我明白了自身存在的不足,为我今后的学习和工作指明了方向。

操作系统编译实验报告

操作系统编译实验报告

一、实验目的1. 了解操作系统的基本组成和编译过程;2. 掌握使用GCC编译器编译操作系统的基本步骤;3. 熟悉操作系统的启动过程;4. 培养动手实践能力和团队合作精神。

二、实验环境1. 操作系统:Linux2. 编译器:GCC3. 实验平台:虚拟机三、实验内容1. 操作系统基本组成2. 编译器使用3. 操作系统启动过程四、实验步骤1. 操作系统基本组成操作系统主要由以下几个部分组成:(1)引导程序(Bootloader):负责加载操作系统内核;(2)内核(Kernel):操作系统核心,负责管理计算机硬件资源;(3)系统调用接口(System Call Interface):用户程序与内核之间的接口;(4)用户程序(User Programs):提供用户与计算机交互的平台。

2. 编译器使用(1)安装GCC编译器:在Linux系统中,通常可以通过包管理器安装GCC编译器。

以Debian/Ubuntu为例,可以使用以下命令安装:sudo apt-get install build-essential(2)编写源代码:编写操作系统内核的源代码,保存为C语言文件,例如kernel.c。

(3)编译源代码:使用GCC编译器将源代码编译成可执行文件。

以kernel.c为例,编译命令如下:gcc -o kernel kernel.c3. 操作系统启动过程(1)引导程序:当计算机启动时,引导程序首先被加载到内存中。

引导程序负责查找操作系统内核的位置,并将其加载到内存中。

(2)内核初始化:内核被加载到内存后,开始执行初始化过程。

初始化过程包括内存管理、设备驱动程序加载等。

(3)系统调用接口:内核初始化完成后,系统调用接口被建立。

用户程序可以通过系统调用与内核进行交互。

(4)用户程序运行:用户程序被加载到内存中,开始执行。

用户程序可以通过系统调用请求内核提供的服务。

五、实验结果与分析1. 编译成功使用GCC编译器成功编译了操作系统内核源代码,生成了可执行文件。

编译链接执行实验报告(3篇)

编译链接执行实验报告(3篇)

第1篇一、实验目的1. 理解编译、链接和执行的基本概念和过程。

2. 掌握使用编译器、链接器和执行器完成程序编译、链接和执行的基本操作。

3. 学习调试程序,解决编译、链接和执行过程中出现的问题。

二、实验环境1. 操作系统:Windows 102. 编译器:Microsoft Visual Studio 20193. 链接器:Microsoft Visual Studio 20194. 执行器:Windows 10自带三、实验内容1. 编译程序2. 链接程序3. 执行程序4. 调试程序四、实验步骤1. 编译程序(1)创建一个名为“HelloWorld.c”的源文件,内容如下:```cinclude <stdio.h>int main() {printf("Hello, World!\n");return 0;}```(2)打开Microsoft Visual Studio 2019,创建一个控制台应用程序项目。

(3)将“HelloWorld.c”文件添加到项目中。

(4)在项目属性中设置编译器选项,选择C/C++ -> General -> Additional Include Directories,添加源文件所在的目录。

(5)点击“生成”按钮,编译程序。

2. 链接程序(1)在Microsoft Visual Studio 2019中,点击“生成”按钮,生成可执行文件。

(2)查看生成的可执行文件,路径通常在项目目录下的“Debug”或“Release”文件夹中。

3. 执行程序(1)双击生成的可执行文件,或在命令行中运行。

(2)查看输出结果,应为“Hello, World!”。

4. 调试程序(1)在Microsoft Visual Studio 2019中,点击“调试”按钮。

(2)程序进入调试模式,可以设置断点、观察变量等。

(3)运行程序,观察程序执行过程,分析问题原因。

实验报告编译实验

实验报告编译实验

一、实验目的1. 理解编译原理的基本概念和过程。

2. 掌握编译器的基本组成和编译流程。

3. 学会使用编译器对源代码进行编译,并分析编译结果。

二、实验环境1. 操作系统:Windows 102. 编译器:GCC (GNU Compiler Collection)3. 开发工具:Visual Studio Code三、实验内容1. 编译器的基本组成和编译流程2. 编译器的使用3. 编译结果分析四、实验步骤1. 编译器的基本组成和编译流程(1)词法分析:将源代码分解成一个个的单词,如标识符、关键字、运算符等。

(2)语法分析:将单词序列转换成语法树,验证源代码是否符合语法规则。

(3)语义分析:检查语法树,确保源代码在语义上是正确的。

(4)中间代码生成:将语法树转换成中间代码,如三地址代码。

(5)代码优化:对中间代码进行优化,提高程序运行效率。

(6)目标代码生成:将优化后的中间代码转换成目标代码,如汇编代码。

(7)代码生成:将目标代码转换成可执行文件。

2. 编译器的使用(1)编写源代码:使用Visual Studio Code编写C语言源代码。

(2)编译源代码:在命令行中输入gcc -o 程序名源文件名.c,编译源代码。

(3)运行程序:在命令行中输入程序名,运行编译后的程序。

3. 编译结果分析(1)词法分析:编译器将源代码中的单词进行分解,如以下代码:```cint main() {int a = 1;return a;}```编译器将分解为以下单词:- int- main- (- )- {- int- a- =- 1- ;- return- a- ;- }- }(2)语法分析:编译器将单词序列转换成语法树,验证源代码是否符合语法规则。

(3)语义分析:编译器检查语法树,确保源代码在语义上是正确的。

(4)中间代码生成:编译器将语法树转换成中间代码,如以下三地址代码:```t1 = 1a = t1t2 = areturn t2```(5)代码优化:编译器对中间代码进行优化,如以下优化后的三地址代码:```a = 1return a```(6)目标代码生成:编译器将优化后的中间代码转换成汇编代码。

编译原理上机实验报告

编译原理上机实验报告

编译原理上机实验报告一、实验目的本次实验旨在通过实践的方式理解和掌握编译原理中的一些重要概念和技术,包括词法分析、语法分析和语义分析等。

通过实验的操作,了解和体验编译器的工作过程,深入理解编译原理的相关理论知识。

二、实验环境本次实验使用了Java语言作为编程语言,使用Eclipse作为开发环境,实验所需的相关工具和库已经提前配置完成。

三、实验内容本次实验主要分为三个部分,分别是词法分析、语法分析和语义分析。

1.词法分析词法分析是编译器的第一个阶段,也是最基础的阶段。

在本次实验中,我们首先需要实现一个词法分析器,该分析器可以将源代码分割成一个个的词法单元,将其存储到一个词法单元表中。

我们首先需要定义一些词法单元的模式,比如关键字、标识符、常量等。

然后,我们使用正则表达式和有限自动机的思想来实现一个可以识别各种模式的词法分析器。

2.语法分析语法分析是编译器的第二个阶段,其目的是将词法单元表中的内容按照语法规则进行分析,生成一个语法树。

在本次实验中,我们需要实现一个递归下降的语法分析器。

我们首先需要定义一些语法规则,然后根据这些规则逐条实现相应的语法分析函数。

最终,我们可以通过递归调用这些函数,将源代码转换成语法树的形式。

3.语义分析语义分析是编译器的第三个阶段,其目的是对语法树进行进一步的检查和处理。

在本次实验中,我们需要实现一个简单的语义分析器。

我们可以在语法分析的基础上,增加一些语义规则,然后对生成的语法树进行检查。

比如,我们可以检查变量的定义和使用是否一致,是否存在未定义的变量等。

最终,我们可以通过语义分析器发现和纠正一些潜在的错误。

四、实验总结通过本次实验,我深入学习了编译原理的相关知识,并通过实践中加深了对这些知识的理解和掌握。

实验中,我了解到了词法分析、语法分析和语义分析在编译器设计中的重要性,也学会了如何使用相关工具和技术来实现这些功能。

通过实验,我发现编译原理是一门非常有趣且实用的课程,它既涉及到理论知识,又需要实践操作。

编译原理实验报告小结

编译原理实验报告小结

一、实验背景编译原理是计算机科学的一个重要分支,主要研究如何将高级语言源代码转换为计算机可以执行的机器代码。

本实验旨在通过实践操作,加深对编译原理基本概念和算法的理解,提高编程能力和解决问题的能力。

二、实验目的1. 理解编译原理的基本概念和流程;2. 掌握词法分析和语法分析的基本方法;3. 熟悉编译过程中的中间代码生成和代码优化;4. 培养编程能力和团队协作精神。

三、实验内容1. 词法分析词法分析是编译过程的第一步,其主要任务是将源代码中的字符序列转换成一个个有意义的符号(单词)。

本实验中,我们实现了词法分析器,能够识别出标识符、关键字、运算符、常量等单词。

2. 语法分析语法分析是编译过程的核心,其主要任务是将词法分析器生成的单词序列按照一定的语法规则进行组织,形成语法树。

本实验中,我们实现了递归下降解析法,对表达式、赋值语句、函数定义等语法结构进行了分析。

3. 中间代码生成中间代码生成是编译过程中的一个重要环节,其主要任务是将语法树转换为一种抽象的、与具体机器无关的中间代码。

本实验中,我们实现了三地址代码生成,将语法树转换为三地址代码。

4. 代码优化代码优化是编译过程中的一个关键步骤,其主要任务是在保证程序正确性的前提下,提高程序的性能。

本实验中,我们实现了简单的代码优化,如常数传播、变量替换等。

四、实验结果与分析1. 实验结果通过实验,我们成功实现了词法分析、语法分析、中间代码生成和代码优化等功能。

以一个简单的C语言程序为例,我们能够将其转换为三地址代码,并进行简单的优化。

2. 实验分析(1)词法分析:本实验中,我们通过定义状态转换表和动作表,实现了对C语言源代码的词法分析。

实验结果表明,词法分析器能够准确地识别出标识符、关键字、运算符、常量等单词。

(2)语法分析:递归下降解析法是一种较为直观的语法分析方法。

本实验中,我们实现了递归下降解析法,对表达式、赋值语句、函数定义等语法结构进行了分析。

编译系统设计实验报告

编译系统设计实验报告

实验名称:编译系统设计实验时间:2023年X月X日实验地点:XX大学计算机学院实验室实验人数:XX人实验指导老师:XX教授一、实验目的1. 理解编译系统的基本概念和原理。

2. 掌握编译器各个阶段的设计和实现方法。

3. 提高编程能力和系统设计能力。

二、实验内容本次实验主要分为以下几个阶段:1. 词法分析阶段:将源代码中的字符序列转换为一个个词法符号。

2. 语法分析阶段:根据词法符号生成抽象语法树(AST)。

3. 语义分析阶段:对AST进行语义检查,确保程序的语义正确性。

4. 中间代码生成阶段:将AST转换为中间代码。

5. 代码优化阶段:对中间代码进行优化,提高程序运行效率。

6. 目标代码生成阶段:将优化后的中间代码转换为特定机器语言的目标代码。

7. 符号表管理阶段:在整个编译过程中,对符号进行管理。

三、实验步骤1. 设计词法分析器(1)定义词法符号集合:根据源代码的特点,定义词法符号集合,如标识符、关键字、运算符等。

(2)编写词法分析器代码:使用正则表达式或有限状态自动机实现词法分析器。

2. 设计语法分析器(1)定义语法规则:根据源代码的语法规则,定义语法规则。

(2)编写语法分析器代码:使用递归下降分析法或LL(1)分析算法实现语法分析器。

3. 设计语义分析器(1)定义语义规则:根据源代码的语义要求,定义语义规则。

(2)编写语义分析器代码:对AST进行遍历,检查语义正确性。

4. 设计中间代码生成器(1)定义中间代码格式:根据源代码的特点,定义中间代码格式。

(2)编写中间代码生成器代码:将AST转换为中间代码。

5. 设计代码优化器(1)选择优化策略:根据中间代码的特点,选择合适的优化策略。

(2)编写代码优化器代码:对中间代码进行优化。

6. 设计目标代码生成器(1)定义目标代码格式:根据目标机器的特点,定义目标代码格式。

(2)编写目标代码生成器代码:将优化后的中间代码转换为目标代码。

7. 设计符号表管理器(1)定义符号表结构:根据源代码的特点,定义符号表结构。

编译实习报告

编译实习报告

篇一:编译原理实习报告实习报告【实习目的】1.了解编译器的工作原理2.掌握并加深本学期所学的编译原理的理论知识3.加强自己的动手能力【实习内容】1.编译并运行老师所给的编译器参考代码2.在第一步的基础上进一步改进编译器,增加输入输出功能【开发平台】window系统,free pascal编译器【实习过程】本次实习过程根据实习内容共分两大部分,第一部分,编译运行参考代码;第二部分,进一步改进编译器。

本人在上面的基础上又增加了第三部分的额外修改。

下面便总结这三部分的实习过程:一、增加读写语句前pl0编译程序由于最原始的pl0编译程序所用的pascal版本较老,有些和当前使用版本不兼容,必须作相应修改,具体是:“object”和“procedure”为pascal的保留字,现分别改成“obj”和“proc”。

此外,原始程序中的“≠”、“≤”和“≥”,不能用ascii码表示出来,现将其替换成“&lt;&gt;”、“&lt;=”和“&gt;=”。

作为一个编译程序,支持批量处理和永久保存是其应具备的基本功能。

为此,本程序加入了文件读写功能,即从文件读入pl0源程序,在将中间代码和运行结果写入文件。

由于源程序和原始差别很小,为节省篇幅,不将其打印出来。

二、增加读写语句前pl0调试程序下面是增加读写语句前的pl0程序,包含了乘、除法和寻找两个自然数的最大公因数的过程和主过程,很好的说明了增加读写语句前的pl0语言的使用方法。

constvarx,y,z,q,r; procedure multiply; var a,b; a:=x; begin m=7,n=85;procedure divide; var end; b:=y; z:=0; while b&gt;0 do begin end if odd b then z:=z+a; a:=2*a; b:=b/2;w;beginr:=x;q:=0;w:=y;while w&lt;=r do w:=2*w;while w&gt;y dobegin q:=2*q; w:=w/2;if w&lt;=r thenbeginr:=r-w;q:=q+1endendend;procedure gcd;varf,g;beginf:=x;g:=y;while f&lt;&gt;g dobeginif f&lt;g then g:=g-f;if g&lt;f then f:=f-g;end;z:=fend;beginx:=m;y:=n;call multiply;y:=3;call divide;x:=84;y:=36;call gcd;end.三、增加读写语句前pl0编译程序生成的中间代码下面所给清单是用(一)中增加读写语句前pl0编译程序对(二)中的pl0程序编译生成的中间代码。

编译原理中实验报告

编译原理中实验报告

实验名称:编译原理实验实验时间:2023年X月X日实验地点:实验室实验指导老师:XXX一、实验目的1. 理解编译原理的基本概念和流程。

2. 掌握词法分析和语法分析的基本方法。

3. 学习编译器生成中间代码和目标代码的过程。

4. 培养编程能力和问题解决能力。

二、实验内容本次实验主要包括以下内容:1. 词法分析:编写一个简单的词法分析器,将源代码输入转换为抽象语法树(AST)。

2. 语法分析:实现一个简单的递归下降解析器,对词法分析器输出的AST进行语法分析。

3. 中间代码生成:根据AST生成三地址代码(Three-Address Code)。

4. 代码优化:对生成的三地址代码进行优化。

5. 目标代码生成:将优化后的三地址代码转换为机器代码。

三、实验步骤1. 设计词法分析器首先,我们需要设计一个能够识别源代码中各种单词的词法分析器。

在本实验中,我们定义了以下几种单词:- 关键字:如if、else、while、int、float等。

- 标识符:由字母、数字和下划线组成,不能以数字开头。

- 常量:包括整型常量和浮点型常量。

- 运算符:如+、-、、/、==、<=等。

- 分隔符:如(、)、;、,等。

根据以上定义,我们可以编写一个词法分析器,它将输入的源代码字符串逐个字符地读取,并根据定义的规则识别出相应的单词。

2. 语法分析词法分析器生成的AST是一个树形结构,其中每个节点代表源代码中的一个单词或符号。

为了进一步分析AST的结构,我们需要实现一个递归下降解析器,它能够根据语法规则对AST进行解析。

在本实验中,我们以一个简单的算术表达式为例,实现了一个递归下降解析器。

解析器从AST的根节点开始,按照语法规则递归地解析每个子节点,直到整个表达式被解析完毕。

3. 中间代码生成在完成语法分析后,我们需要将AST转换为中间代码。

在本实验中,我们选择了三地址代码作为中间代码的形式。

三地址代码是一种表示赋值、条件判断和循环等操作的方式,它使用三个操作数和两个操作符来表示一个操作。

论文编译实习报告

论文编译实习报告

随着我国经济的快速发展,对外交流与合作日益增多,论文编译工作在学术交流、文化传播等领域发挥着重要作用。

为了提高自身的编译能力,我于XX年XX月至XX年XX月在XX出版社进行了为期一个月的论文编译实习。

二、实习内容1. 编译实践在实习期间,我主要负责对英文论文进行编译。

具体工作包括:(1)阅读论文原文,了解论文的研究背景、研究目的、研究方法、研究结果等。

(2)根据论文内容,对专业术语进行翻译,确保翻译的准确性。

(3)调整论文结构,使其符合中文写作规范。

(4)对翻译后的论文进行校对,确保无语法错误和错别字。

2. 编译技巧学习在实习过程中,我积极向经验丰富的编译员请教,学习了一些编译技巧:(1)了解并掌握常用的翻译软件和工具,提高翻译效率。

(2)注重培养自己的语言表达能力,提高翻译质量。

(3)关注学术动态,了解相关领域的最新研究成果,提高翻译的准确性。

三、实习收获1. 编译能力得到提高通过实习,我对论文编译工作有了更深入的了解,掌握了编译的基本技巧和方法。

在编译实践中,我不断提高自己的翻译水平,使编译质量得到了显著提升。

2. 学术素养得到提升在编译过程中,我不断学习专业知识,了解相关领域的最新研究成果。

这使我具备了较高的学术素养,为今后的学术研究奠定了基础。

3. 团队协作能力得到锻炼在实习过程中,我与同事相互学习、共同进步,锻炼了自己的团队协作能力。

通过这次论文编译实习,我深刻认识到论文编译工作的重要性。

在今后的学习和工作中,我将继续努力提高自己的编译能力,为学术交流和文化传播贡献自己的力量。

以下是我在实习期间的一些体会:1. 编译工作需要严谨的态度和扎实的专业知识。

2. 编译过程中,要注意与原文作者的沟通,确保翻译的准确性。

3. 提高自己的语言表达能力,有利于提高翻译质量。

4. 团队协作是完成编译任务的关键。

总之,这次实习让我受益匪浅,为我今后的职业发展奠定了基础。

在今后的学习和工作中,我将继续努力,不断提高自己的综合素质。

编译原理熟悉实验报告

编译原理熟悉实验报告

一、实验目的1. 理解编译原理的基本概念和流程;2. 掌握编译器的各个阶段及其实现方法;3. 熟悉编译器各个阶段中使用的算法和数据结构;4. 培养编程能力和问题解决能力。

二、实验内容1. 词法分析;2. 语法分析;3. 语义分析;4. 代码生成;5. 符号表;6. 中间代码生成。

三、实验步骤1. 词法分析(1)设计词法分析器:首先需要确定源程序中的词法单元,如标识符、关键字、运算符等。

然后,编写代码实现词法分析器,对源程序进行扫描,将词法单元转换成词法符号。

(2)实现词法分析器:使用C语言或Java等编程语言实现词法分析器,完成词法单元的识别和转换。

2. 语法分析(1)设计语法分析器:根据源程序的语言规范,设计语法分析器,实现语法规则的定义和匹配。

(2)实现语法分析器:使用递归下降分析法、LL(1)分析法、LR(1)分析法等实现语法分析器,对词法分析器输出的词法符号序列进行语法分析。

3. 语义分析(1)设计语义分析器:根据源程序的语言规范,设计语义分析器,实现语义规则的检查和类型检查。

(2)实现语义分析器:使用C语言或Java等编程语言实现语义分析器,完成语义规则的检查和类型检查。

4. 代码生成(1)设计代码生成器:根据源程序的语言规范,设计代码生成器,将抽象语法树转换成目标代码。

(2)实现代码生成器:使用C语言或Java等编程语言实现代码生成器,完成抽象语法树到目标代码的转换。

5. 符号表(1)设计符号表:在编译过程中,需要记录变量、函数等信息,设计符号表实现这些信息的存储和管理。

(2)实现符号表:使用C语言或Java等编程语言实现符号表,完成变量、函数等信息的存储和管理。

6. 中间代码生成(1)设计中间代码生成器:根据源程序的语言规范,设计中间代码生成器,将抽象语法树转换成中间代码。

(2)实现中间代码生成器:使用C语言或Java等编程语言实现中间代码生成器,完成抽象语法树到中间代码的转换。

四、实验结果与分析1. 词法分析器能够正确识别源程序中的词法单元,并将它们转换成词法符号。

编译学原理实验报告

编译学原理实验报告

一、实验目的1. 理解编译原理的基本概念和编译过程。

2. 掌握编译器各个阶段的功能和实现方法。

3. 通过实际操作,加深对编译原理的理解和应用。

二、实验环境1. 操作系统:Windows 102. 编译器:C++编译器3. 开发环境:Visual Studio三、实验内容1. 词法分析2. 语法分析3. 语义分析4. 中间代码生成5. 代码优化6. 目标代码生成四、实验步骤1. 词法分析(1)设计词法分析器:根据实验要求,设计一个词法分析器,能够将源代码中的字符序列转换成一个个词法符号。

(2)实现词法分析器:使用C++编写词法分析器代码,实现字符序列到词法符号的转换。

(3)测试词法分析器:编写测试用例,验证词法分析器的正确性。

2. 语法分析(1)设计语法分析器:根据实验要求,设计一个语法分析器,能够识别源代码中的语法结构。

(2)实现语法分析器:使用C++编写语法分析器代码,实现语法结构的识别。

(3)测试语法分析器:编写测试用例,验证语法分析器的正确性。

3. 语义分析(1)设计语义分析器:根据实验要求,设计一个语义分析器,能够对源代码中的语义进行验证。

(2)实现语义分析器:使用C++编写语义分析器代码,实现语义验证。

(3)测试语义分析器:编写测试用例,验证语义分析器的正确性。

4. 中间代码生成(1)设计中间代码生成器:根据实验要求,设计一个中间代码生成器,能够将源代码转换成中间代码。

(2)实现中间代码生成器:使用C++编写中间代码生成器代码,实现源代码到中间代码的转换。

(3)测试中间代码生成器:编写测试用例,验证中间代码生成器的正确性。

5. 代码优化(1)设计代码优化器:根据实验要求,设计一个代码优化器,能够对中间代码进行优化。

(2)实现代码优化器:使用C++编写代码优化器代码,实现中间代码的优化。

(3)测试代码优化器:编写测试用例,验证代码优化器的正确性。

6. 目标代码生成(1)设计目标代码生成器:根据实验要求,设计一个目标代码生成器,能够将优化后的中间代码转换成目标代码。

编译软件实验报告

编译软件实验报告

一、实验目的本次实验旨在通过编译软件的学习和实践,使学生掌握编译软件的基本原理和实现方法,提高学生编程能力和软件设计能力。

通过本次实验,学生应能够:1. 理解编译软件的基本概念和作用;2. 掌握编译软件的基本结构和工作流程;3. 学会使用编译软件进行程序编译;4. 了解编译软件的优化方法和性能评估;5. 培养团队合作精神和实践创新能力。

二、实验环境1. 操作系统:Windows 102. 编译软件:GCC(GNU Compiler Collection)3. 编程语言:C/C++4. 开发工具:Visual Studio Code三、实验内容1. 编译软件的基本概念和作用编译软件是将高级语言程序转换为机器语言程序的软件。

它主要包括词法分析、语法分析、语义分析、代码生成和优化等阶段。

编译软件的作用是将程序员编写的高级语言程序转换为计算机能够理解和执行的机器语言程序,从而实现程序的执行。

2. 编译软件的基本结构和工作流程编译软件的基本结构包括词法分析器、语法分析器、语义分析器、中间代码生成器、代码优化器和目标代码生成器等模块。

工作流程如下:(1)词法分析:将源代码中的字符序列转换为单词序列;(2)语法分析:根据语法规则对单词序列进行语法分析,生成抽象语法树(AST);(3)语义分析:对AST进行语义检查,确定变量的作用域、类型等;(4)中间代码生成:将AST转换为中间代码;(5)代码优化:对中间代码进行优化,提高程序执行效率;(6)目标代码生成:将优化后的中间代码转换为机器语言程序。

3. 编译软件的使用(1)编写C/C++程序:使用Visual Studio Code编写C/C++程序,保存为`.c`或`.cpp`文件。

(2)编译程序:在命令行中使用GCC编译器编译程序。

例如,编译名为`main.c`的程序,可以使用以下命令:```gcc -o main main.c```编译成功后,会在当前目录下生成名为`main`的可执行文件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

cout<<"w="<<w<<endl; cout<<"j="<<j<<endl; cout<<"p="<<p<<endl; cout<<"e="<<e<<endl;
CJ2=w*pow((double)10,e*p-j); cout<<"CJ2="<<CJ2<<endl;//输出 }
void error(){//程序中错误处理程序 cout<<"\nError! Try again.."<<endl;//重新输入数据 cin>>data; p=0;w=0;j=0; //所有全局变量重新初始化 e=1;i=0;d=0; }
四 实验结果截图如下:
五 实验心得:
实验二 逆波兰式的生成程序 一 实验目的 1 培养学生初步掌握编译原理实验的技能 2 验证所学的理论,巩固所学的知识并加深理解。 3 对学生进行实验研究的基本训练 二 实验内容以及要求 1内容: 掌握语法分析的基本思想,并用高级语言编写逆波兰式的生成 程序。 2 要求:利用逆波兰生成算法编写程序,并将键盘上输入的算术表达式 转化为逆波兰式。 3 逆波兰式的涉及到的运算符的优先级如下。
printf("* !Press 1 to exit else goon *\n");
printf("*****************************************\n");
nbl_loop: i=j=t=top=0;
printf("Input a string please :");
开始 输入运算符优先关系 从左往右扫描中缀表达式
输入串为空 运算符
栈是否为空 比较当前运算符于栈顶运算符的优先级
当前运算符优先级高 当前运算符的是‘)’ 退栈输出
栈为空 结束
退栈输出
输出 入栈 入栈 栈顶为‘(’ 退栈 栈为空
退栈输出
Error N Y N Y Y Y Y Y N N Y N
N N N Y
cout<<"please input your data:"<<endl; cin>>data; deal();//函数主体 print();// 计算 CJ2 system("pause"); return 0; } void check(char c) //判断首字母是否是数字 { is_digit=isdigit(c); while(is_digit!=true){//首字母不是数字时 cout<<"\nError! Try again.."<<endl;//重新输入 cin>>data; check(data[0]);
void check(char c);void integer(char c); void point(char c);void index(char c); void s_next();void z_next(); void print();void error();void deal(); int main(){
int temp=i; if(isdigit(c)!=0)//是数值字符时
integer(c); else
{ error(); deal();/ } j=i-temp;//记录十进制小数位数 } void index(char c){//用来处理指数部分 if(c=='-') {e=-1;i++;}//是'-'号时 else {if(c=='+') i++;//是'+' 号时 else { if(isdigit(c)==false) //非数值字符时 { error();deal(); }
实验一 无符号数的此法分析程序 一 实验目的 1 培养学生初步掌握编译原理实验的技能 2 验证所学的理论,巩固所学的知识并加深理解。 3 对学生进行实验研究的基本训练 二 实验内容及要求 1 内容:掌握词法分析 的基本思想,并用高级语言编写无符号数的此法分析程序。 2 要求:从键盘输入一串字符(包括字母,数字等),最后以“:”结 束,编写程序识别出其中的无符号数。 3 无符号数的文法规则可定义如下: <无符号数>------<无符号实数>|<无符号整数> <无符号实数>------<无符号整数>.<数字串>[E<比例因子>]|<无符号整数 >E<比例因子> <比例因子>------<有符号整数> <有符号整数>------[+|-]<无符号整数> <无符号整数>------<数字串> <数字串>------<数字>{<数字>} <数字>----0,1,2,….9 4无符号程序的流程如下:
void deal(){ check(data[0]);//判断首字母是否是数字 integer(data[i]);//处理识别符的整数部分 if(data[i]=='.') { point(data[++i]);//用来处理小数部分 if(data[i]=='e'||data[i]=='E')//如果是e或E时 index(data[++i]);//用来处理指数部分 else if(data[i]!='\0') { error(); deal();} else s_next();// 确定实型 } else { if(data[i]=='e'||data[i]=='E')//如果是e或E时 {index(data[++i]);//用来处理指数部分 //CJ1="整型"; } else if(data[i]!='\0'){ //非结束标志 error(); deal(); } else z_next();} }
Y Y N N N Y Y Y Y Y Y Y Y N N N N
N N N
三 试验程序如下
#include<iostream> #include<cctype> #include<cstring> #include<cmath> using namespace std; int w=0; //尾数累加器 int p=0; //指数累加器 int j=0; //十进制小数位数计数器 int e=1; //为正时为1,为负时为-1 int i=0; //用来标志元素位置 int d=0; //用来表示每个数值型元素对应的数值 char data[40];//存放输入的识别符 bool is_digit; //标志是否是数字 string CJ1;//确定是整形还是实型 double CJ2;//记数值 函数声明
三 实验程序
#include <stdio.h>
#include<string.h>
#define max 64
int main(int argc, char* argv[])
{
char str[max],nbl[max],stack[max],ch;
int i,j,t,top;
printf("*****************************************\n");
goto nbl_loop;
}
四 实验结果截图如下:
五实验心得
scanf("%s",str);
strcat(str,"#");//添加串结束标记
while(str[i]!='#')
{ ch=str[i];
if(ch=='1')
//退出程序
{return 0;}
else if(ch>='a'&& ch<='z')//是字母
{ nbl[t]=ch; t++; }
else if(ch=='(')//左括号入栈
goto nbl_end;}
i++;
}
while(top!=0)
{ nbl[t]=stack[top]; t++; top--; }
printf("Output as NBL form :");
for(j=0;j<t;j++)
printf("%c",nbl[j]);
printf("\n");
nbl_end:
出错 是’-’否
取下一字符 取下一字符
-1=>e
数值=>d p*10+d=>p
是’E’否
是’+’否
数字否 取下一字符 数字否
退一字符 ‘实形’=>CJ1 数值=>d w*10+d=>w
出口
取下一字符 数值=>d w*10+d=>w j+1=>j 取下一字符 数字否 数字否 ‘整形’=>CJ1 数字否 是’.’否 是’E’否
{ top++; stack[top]=ch; }
相关文档
最新文档