合肥工业大学编译原理实验报告(完整代码版)
- 格式:pdf
- 大小:387.92 KB
- 文档页数:31
合工大汇编实验报告本文将围绕“合工大汇编实验报告”展开阐述,按照实验的步骤分为以下几个部分进行讲解。
第一部分:实验目的和实验环境本次实验的目的是让我们熟悉汇编语言的基本语法和指令,了解在计算机内部运行程序的原理。
实验环境为Windows系统下的汇编语言编写工具MASM。
第二部分:实验过程在实验过程中,我们首先需要学会使用MASM编写汇编程序,然后通过“debug”命令进行调试,最后在汇编器中运行程序,观察程序的执行情况。
具体操作过程如下:1. 编写汇编程序首先,我们需要编写一份汇编程序。
在这份程序中,我们可以通过汇编语言的基本语法和指令,实现一些简单的计算、输出等操作。
例如,下面是一份简单的汇编程序:; 求1+2+3+...+10的结果mov ax, 0 ; 将ax寄存器清零mov bx, 1 ; 将bx寄存器初始化为1mov cx, 10 ; 将cx寄存器初始化为10sum_loop: ; 循环计算add ax, bx ; 将bx寄存器的值加到ax寄存器中inc bx ; 将bx寄存器的值加1loop sum_loop ; cx寄存器自减1,如果cx不为0则跳转到sum_loop处继续循环2. 调试程序当我们编写好程序之后,我们需要通过“debug”命令来进行调试操作。
在这个过程中,我们需要逐步执行汇编程序中的指令,并且观察寄存器和内存的变化情况,以检查程序是否正确。
3. 运行程序在完成程序的调试之后,我们可以通过汇编器来运行这份程序。
在运行的过程中,我们需要观察程序在计算机内部的执行情况,包括计算结果和输出结果等。
第三部分:实验收获通过这次实验,我们对汇编语言的基本语法和指令有了更深入的了解。
同时,我们也了解了在计算机内部执行程序的原理和过程。
这对于我们深入理解计算机的工作原理以及编写更高效的程序都有着重要的意义。
总之,本次实验为我们提供了一个很好的机会,让我们更深入地了解计算机系统的工作原理,同时也提高了我们的编程能力和实际应用能力。
编译原理实验报告指导教师:一. 实验目的基本掌握计算机语言的词法分析程序的开发方法。
以及掌握计算机语言的语法分析程序设计与属性文法应用的实现方法。
锻炼自己的编程能力和逻辑思维能力,体会计算机编译器的奥妙之处二. 实验内容1.编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。
2.给定下列文法:S→id=E;S→if C then SS→while C do SC→E>EC→E<=E用递归子程序法设计并实现语法分析程序,按照生成顺序输出产生式3.在第四章上机题的基础上,补充以下的语义处理功能,形成一个将源程序翻译成三地址代码序列的翻译程序:将表达式、赋值语句翻译成三地址代码将If 条件语句、While 循环语句翻译成三地址代码三. 实验要求1.编制正规式以及正规文法,画出状态图;2.根据状态图,设计词法分析函数int scan( ),完成以下功能:1)从键盘读入数据,分析出一个单词。
2)返回单词种别(用整数表示),3)返回单词属性(不同的属性可以放在不同的全局变量中)。
3.编写测试程序,反复调用函数scan( ),输出单词种别和属性。
4.改写文法,构造语法分析程序,要求按照最左派生的顺序输出派生的产生式序列;5.改写语法分析程序,构造三地址代码生成程序。
6.处理的源程序存放在文件中,它可以包含多个语句;四.系统设计完成整个系统,实现本个实验的要求,需要两个比较大的模块:词法分析器和语法分析器。
词法分析器的功能是将输入的程序串分解成一个一个独立的单词,并且记录下每个单词的类型以及数值。
这里词法分析器的实现有两种方法:调用一次词法分析器,返回一个词的类型以及数值,以此类推;还有一种方法是条用一次词法分析器将程序串的所有单词都分解出来并保存到一个地方(比如线形表)以便将来使用。
我采用的是前者,因为这样只需要对整个程序访问一遍语法分析器的功能是将已经分解好的单词按照一定的规范(产生式)组合起来,由此来确定输入程序的意思。
编译原理实验报告一、实验目的本次编译原理实验的主要目的是通过实践加深对编译原理中词法分析、语法分析、语义分析和代码生成等关键环节的理解,并提高实际动手能力和问题解决能力。
二、实验环境本次实验使用的编程语言为 C/C++,开发工具为 Visual Studio 2019,操作系统为 Windows 10。
三、实验内容(一)词法分析器的设计与实现词法分析是编译过程的第一个阶段,其任务是从输入的源程序中识别出一个个具有独立意义的单词符号。
在本次实验中,我们使用有限自动机的理论来设计词法分析器。
首先,我们定义了单词的种类,包括关键字、标识符、常量、运算符和分隔符等。
然后,根据这些定义,构建了相应的状态转换图,并将其转换为程序代码。
在实现过程中,我们使用了字符扫描和状态转移的方法,逐步读取输入的字符,判断其所属的单词类型,并将其输出。
(二)语法分析器的设计与实现语法分析是编译过程的核心环节之一,其任务是在词法分析的基础上,根据给定的语法规则,判断输入的单词序列是否构成一个合法的句子。
在本次实验中,我们采用了自顶向下的递归下降分析法来实现语法分析器。
首先,我们根据给定的语法规则,编写了相应的递归函数。
每个函数对应一种语法结构,通过对输入单词的判断和递归调用,来确定语法的正确性。
在实现过程中,我们遇到了一些语法歧义的问题,通过仔细分析语法规则和调整函数的实现逻辑,最终解决了这些问题。
(三)语义分析与中间代码生成语义分析的任务是对语法分析所产生的语法树进行语义检查,并生成中间代码。
在本次实验中,我们使用了四元式作为中间代码的表示形式。
在语义分析过程中,我们检查了变量的定义和使用是否合法,类型是否匹配等问题。
同时,根据语法树的结构,生成相应的四元式中间代码。
(四)代码优化代码优化的目的是提高生成代码的质量和效率。
在本次实验中,我们实现了一些基本的代码优化算法,如常量折叠、公共子表达式消除等。
通过对中间代码进行分析和转换,减少了代码的冗余和计算量,提高了代码的执行效率。
宣城校区实验报告课程名称编译原理专业班级计算机0001班学生姓名及学号赵保飞 2015216768 指导教师李芒宏实验地点计算机中心楼第四机房2017 ~2018 学年第一学期《编译原理》课程实验报告实验名称词法分析设计姓名赵保飞系院专业计算机科学与技术班级计算机01班学号2015216768实验日期2017.10.18 指导教师李芒宏成绩一、实验目的和要求通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。
二、实验原理(1)实验数据结构说明K[]String数组-关键字表;s[]char数组—分界符;m[]char数组—算术运算符;r[]String数组—关系运算符;ArrayList型String数组ci—常数;ArrayList型String数组id—标识符(2)实验算法描述(3)算法流程图三、源程序代码和测试结果package lexicalAnalysis;import java.util.*;import java.io.*;public class lexicalAnalysis{static Stringk[]={"for","main","if","while","void","public","static","printf","scanf","asm","do","return","typedef","auto","double","break", "short","using","default","long"};//关键字static char s[]={',',';','(',')','[',']','{','}'};//2分界符static char m[]={'+','-','*','/'};//3算术运算符static String r[]={"<","<=","=",">",">=","<>"};//4关系运算符ArrayList<String>ci=new ArrayList<String>();//5常数ArrayList<String>id=new ArrayList<String>();//6标识符String tempToken="";//临时存放组成一个“词”单位串int pint,row=1,line=1;//当前指针指示,行数,列数char ch;//存放最新读入源程序字符String instring;//存放输入de源程序代码public static void main(String[]args)throws Exception{// TODO Auto-generated method stublexicalAnalysis one=new lexicalAnalysis();System.out.println("单词"+"\t二元序列"+"\t类型"+"\t位置(行,列)");one.readtext();}boolean isdigit(char c){//判断所读字符是否为数字,是则返回ture,否则返回falseif(c>=48&&c<=57)return true;elsereturn false;}boolean isletter(char c){//判断所读字符是否为字母,是则返回true,否则返回falseif((c>64&&c<91)||(c>96&&c<123))return true;elsereturn false;}boolean isline(char c){//判断字符c是否是下划线"_"if(c=='_')return true;elsereturn false;}boolean remove(){//用于在判断关系运算符时,判断是否是要再读一个字符char b=instring.charAt(pint+1);//string类charAt() 方法用于返回指定索引处的字符。
编译原理实验报告一、实验概述本次实验旨在设计并实现一个简单的词法分析器,即实现编译器的第一个阶段,词法分析。
词法分析器将一段源程序代码作为输入,将其划分为一个个的词法单元,并将其作为输出。
二、实验过程1.设计词法规则根据编程语言的规范和所需实现的功能,设计词法规则,以明确规定如何将源程序代码分解为一系列的词法单元。
2.实现词法分析器采用合适的编程语言,根据所设计的词法规则,实现词法分析器。
词法分析器的主要任务是读入源程序代码,并将其根据词法规则进行分解,生成对应的词法单元。
3.测试词法分析器设计测试用例,用于检验词法分析器的正确性和性能。
测试用例应包含各种情况下的源程序代码。
4.分析和修正错误根据测试过程中发现的问题,分析产生错误的原因,并进行修正。
重复测试和修正的过程,直到词法分析器能够正确处理所有测试用例。
三、实验结果我们设计了一个简单的词法分析器,并进行了测试。
测试用例涵盖了各种情况下的源程序代码,包括正确的代码和错误的代码。
经过测试,词法分析器能够正确处理所有的测试用例。
词法分析器将源程序代码分解为一系列的词法单元,每个词法单元包含了单词的种类和对应的值。
通过对词法单元的分析,可以进一步进行语法分析和语义分析,从而完成编译过程。
四、实验总结通过本次实验,我深入了解了编译原理的词法分析阶段。
词法分析是编译器的第一个重要阶段,它将源程序代码分解为一个个的词法单元,为后续的语法分析和语义分析提供基础。
在实现词法分析器的过程中,我学会了如何根据词法规则设计词法分析器的算法,并使用编程语言实现词法分析器。
通过测试和修正,我掌握了调试和错误修复的技巧。
本次实验的经验对我今后的编程工作有很大帮助。
编译原理是计算机科学与技术专业的核心课程之一,通过实践能够更好地理解和掌握其中的概念和技术。
我相信通过进一步的学习和实践,我能够在编译原理领域取得更大的成果。
编译原理实验报告一、实验目的编译原理是计算机科学中的重要学科,它涉及到将高级编程语言转换为计算机能够理解和执行的机器语言。
本次实验的目的是通过实际操作和编程实践,深入理解编译原理中的词法分析、语法分析、语义分析以及中间代码生成等关键环节,提高我们对编译过程的认识和编程能力。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
此外,还使用了一些相关的编译工具和调试工具,如 GDB 等。
三、实验内容(一)词法分析器的实现词法分析是编译过程的第一步,其任务是将输入的源程序分解为一个个单词符号。
在本次实验中,我们使用有限自动机的理论来设计和实现词法分析器。
首先,定义了各种单词符号的类别,如标识符、关键字、常量、运算符等。
然后,根据这些类别设计了相应的状态转换图,并将其转换为代码实现。
在实现过程中,使用了正则表达式来匹配输入字符串中的单词符号。
对于标识符和常量等需要进一步处理的单词符号,使用了相应的规则进行解析和转换。
(二)语法分析器的实现语法分析是编译过程的核心环节之一,其任务是根据给定的语法规则,分析输入的单词符号序列是否符合语法结构。
在本次实验中,我们使用了递归下降的语法分析方法。
首先,根据实验要求定义了语法规则,并将其转换为相应的递归函数。
在递归函数中,通过对输入单词符号的判断和处理,逐步分析语法结构。
为了处理语法错误,在分析过程中添加了错误检测和处理机制。
当遇到不符合语法规则的输入时,能够输出相应的错误信息,并尝试进行恢复。
(三)语义分析及中间代码生成语义分析的目的是对语法分析得到的语法树进行语义检查和语义处理,生成中间代码。
在本次实验中,我们使用了三地址码作为中间代码的表示形式。
在语义分析过程中,对变量的定义和使用、表达式的计算、控制流语句等进行了语义检查和处理。
对于符合语义规则的语法结构,生成相应的三地址码指令。
四、实验步骤(一)词法分析器的实现步骤1、定义单词符号的类别和对应的正则表达式。
编译原理实验报告实验⼀词法分析器的设计与实现 (1)1)实验⽬的 (1)2)实验内容 (1)3)实验要求 (1)4)实验原理 (1)5)实验步骤 (1)6)状态转化图及词法分析程序 (2)7)测试 (7)实验⼆语法分析器的设计与实现 (9)1)实验⽬的 (9)2)实验内容 (9)3)实验要求 (9)4)实验原理 (9)5)实验步骤 (9)6)语法分析程序 (10)7)测试 (16)编译原理实验报告专业:计算机科学与技术学⽣姓名:学号: 48完成时间:2020年11⽉25⽇实验⼀词法分析器的设计与实现1)实验⽬的①掌握正规式、状态转换图、C语⾔单词符号的划分及词法分析器的实现②掌握词法分析程序的作⽤和接⼝。
2)实验内容设计及实现C语⾔程序的词法分析器。
3)实验要求①对任给的⼀个C语⾔源程序,能够虑掉空格、回车换⾏符、tab键及注释。
②识别各类单词符号,如关键字、标识符、运算符、常数、界符,结果以⼆元式形式输出。
并构造符号表。
③输出有词法错误的单词及所在⾏号。
4)实验原理根据扫描到的单词符号的第⼀个字符的种类,分别转到相应的程序进⾏处理。
这些程序的功能就是识别以相应字符开头的各类单词符号。
5)实验步骤①根据C语⾔各类单词的正规式,构造能识别各类单词的状态转换图。
②根据状态转换图,构造识别各类单词的词法分析器。
6)状态转化图及词法分析程序#include ""#include ""#include ""FILE *fp;int id;void main(){char cbuffer;char alphaprocess(char buffer);char digitprocess(char buffer);char otherprocess(char buffer);if ((fp=fopen("","r"))==NULL) /*以只读⽅式打开⽂件"",NULL在⽂件中已被定义为0*/ printf("error");else{cbuffer=fgetc(fp); /*⽂件不为空则从⽂件中取字符*/while (cbuffer!=EOF) /*EOF⽂件结束标志*/{if(cbuffer==' '||cbuffer=='\n') /*掠过空格和回车符*/{cbuffer=fgetc(fp);id=4;}else if(isalpha(cbuffer))cbuffer=alphaprocess(cbuffer); /*检查cbuffer是否为字母,是则调⽤alphaprocess()函数*/ else if (isdigit(cbuffer))cbuffer=digitprocess(cbuffer); /*检查cbuffer是否为数字0~9,是则调⽤digitprocess()函数*/ else cbuffer=otherprocess(cbuffer); /*⾮上述两者则调⽤otherprocess()函数*/}}char alphaprocess(char buffer){int search(char searchchar[],int wordtype); /*函数声明*/int atype;int i=-1;char alphatp[20]; /*字符数组存储从⽂件中读取的字符*/while((isalpha(buffer))||(isdigit(buffer))||buffer=='_') /*标识符的组成成分*/{alphatp[++i]=buffer; /*将当前读取的字符存如数组*/buffer=fgetc(fp); /*读取下⼀个字符*/}alphatp[i+1]='\0'; /*字符串以'\0'作为结束标志*/atype=search(alphatp,1); /*调⽤函数,判断当前字符串是否为关键字*/if(atype!=0) /*是关键字则输出该关键字,编号为1,并输出该关键字在关键字表中的位⼦*/{printf("(%s, (1,%d))\n",alphatp,atype);id=1; /*关键字的ID为1*/}else{printf("(%s ,2)\n",alphatp); /*为标识符时,编号为2*/id=2; /*标识符的ID为2*/}return(buffer);}/*判断字符串是否为关键字*/int search(char searchchar[],int wordtype){char * key[32]={"auto","break","case","char","const","continue","default","do", "double","else","enum","extern","float","for","goto","if","int","long", "register","return","short","signed","sizeof","static","struct", "volatile","while","switch","typedef","union","unsigned","void"};/*设置数组指针存储c语⾔中的32个关键字*/int i;int p;switch (wordtype)case 1:for (i=0;i<=31;i++){if (strcmp(key[i],searchchar)==0) /*⽐较字符串,为关键字则定位该关键字的序号*/{ p=i+1; break; }else p=0;}return(p);}}char digitprocess(char buffer){int i=-1;char digittp[20];while ((isdigit(buffer))||buffer=='.'||buffer=='e'||buffer=='E')//考虑数字为⼩数和指数时的情况{digittp[++i]=buffer;buffer=fgetc(fp); /*同上*/}digittp[i+1]='\0';printf("(%s ,3)\n",digittp); /*输出该数字,编号为3*/ id=3; /*设置ID为3*/return(buffer);}char otherprocess(char buffer){int n=0;char ch[20];ch[0]=buffer;ch[1]='\0';if(ch[0]=='%'||ch[0]=='\\'){ buffer=fgetc(fp);ch[1]=buffer;ch[2]='\0';printf("(%s ,5)\n",ch);id=4;return(buffer);}if(ch[0]=='&'){buffer=fgetc(fp);if(buffer!='&')printf("(%s ,5)\n",ch);id=4;return(buffer);}if(buffer=='&'){ch[1]=buffer;ch[2]='\0';printf("(%s ,4)\n",ch);id=3;buffer=fgetc(fp);return(buffer);}}if(ch[0]==','||ch[0]==';'||ch[0]=='{'||ch[0]=='}'||ch[0]=='('||ch[0]==')') { printf("(%s ,5)\n",ch);buffer=fgetc(fp);id=4;return(buffer);}if(ch[0]=='*'||ch[0]=='/')printf("(%s ,4)\n",ch);buffer=fgetc(fp);id=4;return(buffer);}if(ch[0]=='='||ch[0]=='!'||ch[0]=='<'||ch[0]=='>'){if(buffer=='=') /*防⽌'==','!=','<=','>='符号的分离*/ {ch[1]=buffer;ch[2]='\0';printf("(%s ,4)\n",ch);}else{printf("(%s ,4)\n",ch);id=4;return(buffer);}buffer=fgetc(fp);id=4;return(buffer);if(ch[0]=='+'||ch[0]=='-'){if(id==4) /*如果'+','-'前ID为4的字符则可能为正负数或'++','--',否则为加减号*/ {for(int i=1;i<10;i++){buffer=fgetc(fp);if(buffer=='+'){ch[1]='+';ch[2]='\0';id=4;printf("(%s ,4)\n",ch);buffer=fgetc(fp);id=4;return(buffer);}if(buffer=='-'){ch[1]='-';ch[2]='\0';id=4;printf("(%s ,4)\n",ch);buffer=fgetc(fp);id=4;return(buffer);}if((buffer==',')||(buffer==';')||(buffer=='+')||(buffer=='-')||(buffer==')')) break; /*防⽌将+562;+562,+562+,+562-,+561)作为整体输出*/ ch[i]=buffer;ch[i+1]='\0';}printf("(%s ,3)\n",ch);id=3;//buffer=fgetc(fp);return(buffer);}ch[2]='\0';}printf("(%s ,wrong word!)\n",ch);buffer=fgetc(fp);id=4;return(buffer);}7)测试实验⼆语法分析器的设计与实现1)实验⽬的掌握⾃上⽽下语法分析⽅法、⾃下⽽上语法分析⽅法分析思路。
计算机与信息学院编译原理实验报告专业班级信息安全13-1班学生姓名及学号马骏 2013211869 课程教学班号任课教师李宏芒实验指导教师李宏芒实验地点实验楼机房2015 ~2016 学年第二学期实验1 词法分析设计一、实验目的通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用二、实验要求1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。
2、将标识符填写的相应符号表须提供给编译程序的以后各阶段使用。
3、根据测试数据进行测试。
测试实例应包括以下三个部分:全部合法的输入。
各种组合的非法输入。
由记号组成的句子。
4、词法分析程序设计要求输出形式:例:输入VC++语言的实例程序:If i=0 then n++;a﹤= 3b %);输出形式为:单词二元序列类型位置(行,列)(单词种别,单词属性)for (1,for ) 关键字(1,1)i ( 6,i ) 标识符(1,2)= ( 4,= ) 关系运算符(1,3)120 ( 5,0 ) 常数(1,4)then ( 1,then) 关键字(1,5)n (6,n ) 标识符(1,6)++ Error Error (1,7);( 2, ; ) 分界符(1,8)a (6,a ) 标识符(2,1)﹤= (4,<= ) 关系运算符(2,2)3b Error Error (2,4)% Error Error (2,4)) ( 2, ) ) 分界符(2,5);( 2, ; ) 分界符(2,6)三、实验内容用VC++/VB/JA V A 语言实现对 C 语言子集的源程序进行词法分析。
通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示;同时进行标识符登记符号表的管理。
编译原理实验报告一、实验目的本次实验的目的是了解编译原理的基本知识,并运用所学知识实现一个简单的词法分析器。
二、实验内容1.设计一个词法分析器,能够识别并输出源程序中的关键字、标识符、常数和运算符等。
2.设计并实现一个词法分析器的算法。
3.对编写的词法分析器进行测试。
三、实验过程1.设计词法分析器的算法在设计词法分析器的时候,需要先了解源程序的基本构成,了解关键字、标识符、常数和运算符等的特点,以及它们在源程序中的表示形式。
然后,根据这些特点,设计一个适合的算法来进行词法分析。
2.实现词法分析器根据设计好的算法,在编程语言中实现词法分析器。
在实现过程中,需要根据不同的词法单元,设计相应的正则表达式来进行匹配和识别。
3.测试词法分析器编写几个简单的测试用例,对词法分析器进行测试。
检查输出结果是否正确,并根据实际情况对词法分析器进行调试和优化。
四、实验结果经过测试,词法分析器能够正确识别并输出源程序中的关键字、标识符、常数和运算符等。
测试用例的输出结果与预期结果一致。
五、实验总结通过本次实验,我学习了编译原理的基本知识,掌握了词法分析器的设计和实现方法。
在实验过程中,我遇到了一些困难和问题,但通过仔细思考和查阅文献资料,最终成功地完成了实验任务。
这次实验不仅帮助我巩固了所学知识,还提高了我的编程能力和解决问题的能力。
通过实践,我深刻体会到了编译原理在软件开发中的重要性和作用,并对将来的学习和工作有了更好的规划和方向。
通过本次实验,我对编译原理的相关知识有了更深入的理解和掌握,对词法分析器的设计和实现方法有了更加清晰的认识。
同时,我还学会了如何进行实验报告的撰写,提高了我的文档写作能力。
通过本次实验,我不仅实现了实验的目标,还提高了自己的综合素质和能力。