合肥工业大学编译原理实验报告(完整代码版)
合工大汇编实验报告
合工大汇编实验报告本文将围绕“合工大汇编实验报告”展开阐述,按照实验的步骤分为以下几个部分进行讲解。
第一部分:实验目的和实验环境本次实验的目的是让我们熟悉汇编语言的基本语法和指令,了解在计算机内部运行程序的原理。
实验环境为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、定义单词符号的类别和对应的正则表达式。
Removed_合肥工业大学编译原理实验 LL(1)分析法
if(c==Vt[i])return i;//在表中,就返回位置 } return -1;//返回-1 表示不在表中 } void addfi(String s, int j){//求关于某一个产生式的 first 集 int v=vn(s.charAt(0));//v 为产生式左边的非终结符 int i; if(vt(s.charAt(j))!=-1){//产生式右边第一个为终结符
fi[v][vt(s.charAt(j))]=true;//就把 s.charAt(j)加入 s.charAt(0)的 first 集
}else{//产生式右边第一个为非终结符 if(!fi[vn(s.charAt(j))][Vt.length]){//如果 s.charAt(j)的
first 集没有求,先求 s.charAt(j)的 first 集 first(s.charAt(j));
int vn(char c){//返回 c 在非终结符表中的位置 int i; for(i=0;i<Vn.length;i++){ if(c==Vn[i])return i;//在表中,就返回位置 } return -1;//返回-1 表示不在表中
} int vt(char c){//返回 c 在终结符表中的位置
4、算法流程图
:50 45. 44. 43. by 42.41.— 4—0.— 3—9.—3—8.by37@.—— 36.35. —34—. ——33.312. 1.2.3.34.0.5.6—.—29.by28.by@27.26.—— 25. 24. 23. 22. by 21.20. — 1—9.by:18.by:17.— 1—6.— 1—5.—1—4.—— 13. 12. 111.0“. ”by: 9M.“OOOKN”b8y.:——7.——6.——5.——4.——3.——2.——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.测试词法分析器编写几个简单的测试用例,对词法分析器进行测试。
检查输出结果是否正确,并根据实际情况对词法分析器进行调试和优化。
四、实验结果经过测试,词法分析器能够正确识别并输出源程序中的关键字、标识符、常数和运算符等。
测试用例的输出结果与预期结果一致。
五、实验总结通过本次实验,我学习了编译原理的基本知识,掌握了词法分析器的设计和实现方法。
在实验过程中,我遇到了一些困难和问题,但通过仔细思考和查阅文献资料,最终成功地完成了实验任务。
这次实验不仅帮助我巩固了所学知识,还提高了我的编程能力和解决问题的能力。
通过实践,我深刻体会到了编译原理在软件开发中的重要性和作用,并对将来的学习和工作有了更好的规划和方向。
通过本次实验,我对编译原理的相关知识有了更深入的理解和掌握,对词法分析器的设计和实现方法有了更加清晰的认识。
同时,我还学会了如何进行实验报告的撰写,提高了我的文档写作能力。
通过本次实验,我不仅实现了实验的目标,还提高了自己的综合素质和能力。
递归下降分析程序的实现——合肥工业大学编译原理课程设计报告
课程设计报告设计题目17.递归下降分析程序的实现设计要求对文法 G:E→E+T|TT→T*F|FF→(E)|i构造出G的递归下降分析程序。
程序显示输出匹配过程(即自上而下生成语法分析树的步骤,输出各匹配产生式序号即可)。
设计思路(1)分析a) ∵E=>E+T=>E+T*F=>E+T*(E)即有E=>E+T*(E)存在左递归。
用直接改写法消除左递归,得到如下:E →TE’E’ →+TE’ | −TE’|εT →FT’T’ →*FT’ | /FT’|εF → (E) | ib) 对于以上改进的方法。
可得:对于E’:FIRST( E’ )=FIRST(+TE’)∪FIRST(-TE’)∪{ε}={+,−,ε} 对于T’:FIRST( T’ )=FIRST(*FT’)∪FIRST(/FT’)∪{ε}={*,∕,ε}而且:FIRST( E ) = FIRST( T ) = FIRST( F )=FIRST((E))∪FIRST(i)={(,i }由此得出各非终结符的FOLLOW集合如下:FOLLOW( E )= { ),#}FOLLOW(E’)= FOLLOW(E)={ ),#}FOLLOW( T )= FIRST(E’)\ε∪FOLLOW(E’)={+,−,),#}FOLLOW( T’ ) = FOLLOW( T ) ={+,−,),#}FOLLOW( F )=FIRST(T’)\ε∪FOLLOW(T’)={*,∕,+,−,),#}由以上FOLLOW集可以我们可以得出SELECT集如下:对ESELECT(E→TE’)=FIRST(TE’)=FIRST(T)={ (,i }对E’SELECT(E’→+TE’)={ + }SELECT(E’→−TE’)={ − }SELECT(E’→ε)={ε,),#}对TSELECT(T→FT’)={(,i}对T’SELECT(T’→*FT’)={ * }SELECT(T’→∕FT’)={ ∕ }SELECT(T’→ε)={ε,+,−,),#}对FSELECT(F→(E) )={ ( }SELECT(F→i)={ i }∴SELECT(E’→+TE’)∩SELECT(E’→−TE’)∩SELECT(E’→ε)=ΦSE LECT(T’→*FT’)∩SELECT(T’→∕FT’)∩SELECT(T’→ε)=ΦSELECT(F→(E) )∩SELECT(F→i)= Φ由上可知,有相同左部产生式的SELECT集合的交集为空,所以文法是LL (1)文法。
河工大版编译原理实验报告
编译原理实验报告学院:国际教育学院专业:中法计算机合作专业班级:中法计122姓名:徐彤坤学号:122930目录实验一词法分析程序实现 (3)实验设计: (3)实验步骤 (3)基本思路: (6)程序代码: (6)实验结果分析: (13)自我评鉴 (14)实验二语法分析程序实现 (15)实验设计: (15)实验步骤 (15)基本思路 (15)程序代码 (17)实验结果分析 (23)实验一词法分析程序实现实验设计:实验目的与要求通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符流形式的源程序转化为一个由各类单词符号组成的流的词法分析方法。
基本实验题目题目:试用手工编码方式构造识别以下给定单词的某一语言的词法分析程序。
语言中具有的单词包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符和四个算术运算符。
实验步骤单词的分类:构造上述语言中的各类单词符号及其分类码表。
表I 语言中的各类单词符号及其分类码表图I 识别表I所列语言中的部分单词的DFA及相关的语义过程图I中所出现的语义变量及语义函数的含义和功能说明如下:函数GETCHAR:每调用一次,就把扫描指示器当前所指示的源程序字符送入字符变量ch,然后把扫描指示器前推一个字符位置。
字符数组TOKEN:用来依次存放一个单词词文中的各个字符。
函数CAT:每调用一次,就把当前ch中的字符拼接于TOKEN中所存字符串的右边。
函数LOOKUP:每调用一次,就以TOKEN中的字符串查保留字表,若查到,就将相应关键字的类别码赋给整型变量c;否则将c置为零。
函数RETRACT:每调用一次,就把扫描指示器回退一个字符位置(即退回多读的那个字符)。
函数OUT:一般仅在进入终态时调用此函数,调用的形式为OUT(c,VAL)。
其中,实参c为相应单词的类别码或其助记符;实参VAL为TOKEN(即词文)或为空串。
合肥工业大学编译原理 LL自上而下文法分析
例如,程序描述以下语句:
E = E + T |T
T = T * F |F
F =(E)| 0 |1
在这种情况,我们可以很容易确定E,T和F是非终端,而符号“(”,“)”,“*”和“+”和数字“0”和“1”是在终端。
第一个非终端(第一衍生物)被认为是语法的公理。
4)分析表的结构
具有非递归语法以及“第一个”和“其后”的集合,你的程序现在可以建立预测分析表。
结果以表的形式显示在屏幕上。
图注释:Construction de la table d’analyse分析表的结构
table d’analyse分析表Affichage de la table d’analyse显示分析表
4、开发过程
1)字符要求:
你的程序必须能够根据以下字符来处理语法:
-终端字符:字母,数字,符号例如“+”,“—”,…;
-非终端字母表中的大写字母。
符号“=”,“|”和“#”(替换“ε”,因为它更容易输入到文本文件)被保留用于语法的描述中,因此不能被用作终端。
2)初始状态
您的程序通过读取一个文件中的“文本”格式开始。
结果被存储在数据结构,再次“你的选择。”
然后,这些集合被显示在屏幕上
图注释:Calcul des ensembles « premiers » et « suivants »计算“第一个”和“其后”的集合
Affichage des ensembles显示集合premiers第一个suivants其后
结果必须存储在内存中,是一个您所选择的数据结构。然后,使用一个函数再取出数据,存储在内存中并屏幕上显示(以你选择的格式)。
汇编语言实验报告含代码(合肥工业大学)
合肥工业大学实验报告课程:汇编语言程序设计专业班级:学号:姓名:实验一Debug程序的使用一.实验目的1、熟悉DEBUG程序中的命令,学会在DEBUG下调试运行汇编语言源程序。
2、掌握8086/8088的寻址方式及多字节数据的处理方法。
二.实验内容实验内容:1、利用DEBUG 程序中的“E”命令,将两个多字节数“12345678H”和“FEDCBA98H”分别送入起始地址为DS:0200H 和DS:0204H 两个单元中。
2 、分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:0200H 单元和DS:0204H 单元中的数据相加,并将运算结果存放在DS:0208H 单元中。
实验要求:本次实验的内容均在DEBUG 下完成,实现数据的装入、修改、显示;汇编语言程序段的编辑、汇编和反汇编;程序的运行和结果检查。
三.实验过程和程序1、启动DOS 操作系统2、运行 程序(若当前盘为C)C: >DEBUG ↙–;(“–”为DEBUG 提示符,仅当屏幕出现该提示符后,才可输入DEBUG命令)3、用“A”命令编辑和汇编源程序–A ↙186E :0100 MOV AX,[0200]↙186E :0103 MOV BX,[0202]↙186E :0107 ADD AX,[0204]↙186E :010B ADC BX,[0206]↙186E :010F MOV [0208],AX ↙186E :0112 MOV [020A],BX ↙186E :0116 ↙4、用“U ”命令反汇编验证源程序–U CS:0100 ↙186E :0100 A10002 MOV AX,[0200]186E :0103 8B1E0202 MOV BX,[0202]186E :0107 03060402 ADD AX,[0204]186E :010B 131E0602 ADC BX,[0206]186E :010F A30802 MOV [0208],AX186E :0112 891E0A02 MOV [020A],BX186E :0116–注意:检查源程序是否有错误,若有则返回到第3 步用“A 地址”命令进行修改,直到程序无错误。
编译原理实验报告
编译原理实验报告合工大编译原理实验报告,后面附代码,孩纸,只能参考不能抄袭哦,好好学习天天向上,编译原理实验报告合肥工业大学计算机科学与技术完成日期:20XX年.6.3实验一词法分析设计一、实验功能:合工大编译原理实验报告,后面附代码,孩纸,只能参考不能抄袭哦,好好学习天天向上,对输入的txt文件内的内容进行词法分析:由文件流输入test.txt中的内容,对文件中的各类字符进行词法分析打印出分析后的结果;二、程序结构描述:(源代码见附录)1、利用Key[]进行构造并存储关键字表;利用optr[]进行构造并存储运算符表;利用separator[]进行构造并存储分界符表;2、bool IsKey(string ss) {}判断是否是关键字函数若是关键字返回true,否则返回false;bool IsLetter(char c) {}判断当前字符是否字母,若是返回true,否则返回false;bool IsDigit(char c) {}判断当前字符是否是数字,若是返回true,否则返回false;bool IsOptr(string ss) {}判断当前字符是否是运算符,若是返回true,否则返回false;bool IsSeparator(string ss) {}判断当前字符是否是分界符,若是返回true,否则返回false;void analyse(ifstream in) {}分析函数构造;关系运算符通过switch来进行判断;三、实验结果合工大编译原理实验报告,后面附代码,孩纸,只能参考不能抄袭哦,好好学习天天向上,实验总结:词法分析的程序是自己亲手做的,在实现各个函数时花了不少功夫,1、要考虑到什么时候该退一字符,否则将会导致字符漏读甚至造成字符重复读取。
2、在实现行数和列数打印时要考虑到row++和line++应该放在什么位置上才可以,如当读取一个\n时line要增加一,而row需要归0处理,在读取某一字符串或字符后row需要加一;3、对于关系运算符用switch结构进行选择判断即可解决一个字符和两个字符的运算符之间的差异;4、将自己学过的知识应用到实践中是件不怎么容易的事情,只有亲身尝试将知识转化成程序才能避免眼高手低,对于知识的理解也必将更加深刻。
编译原理实验报告
编译原理实验报告编译原理实验报告一、引言编译原理是计算机科学中的重要课程之一,它研究的是如何将高级语言程序转化为机器语言程序的过程。
在本次实验中,我们将学习并实践编译原理中的一些基本概念和技术,包括词法分析、语法分析和语义分析等。
二、词法分析词法分析是编译过程中的第一步,它负责将源程序中的字符序列转化为有意义的词法单元。
在本次实验中,我们使用了Flex工具来生成词法分析器。
通过定义一系列正则表达式和对应的动作,我们可以将源程序中的字符序列识别为不同的词法单元,如标识符、关键字、运算符等。
三、语法分析语法分析是编译过程中的第二步,它负责将词法单元序列转化为抽象语法树。
在本次实验中,我们使用了Bison工具来生成语法分析器。
通过定义一系列文法规则和对应的动作,我们可以将词法单元序列转化为抽象语法树,并进行语法错误的检测和恢复。
四、语义分析语义分析是编译过程中的第三步,它负责对抽象语法树进行语义检查和语义动作的执行。
在本次实验中,我们通过自定义语义规则和对应的动作,对抽象语法树进行类型检查、符号表管理等操作。
同时,我们还实现了一些简单的语义动作,如计算表达式的值、生成中间代码等。
五、中间代码生成中间代码生成是编译过程中的一项重要任务,它负责将源程序转化为机器无关的中间表示形式。
在本次实验中,我们使用了三地址码作为中间表示形式。
通过对抽象语法树的遍历和一系列的转换规则,我们可以将源程序转化为等价的三地址码表示形式。
六、实验结果与分析通过对一些简单的测试程序的编译,我们验证了我们所实现的词法分析、语法分析、语义分析和中间代码生成的正确性。
同时,我们还进行了一些性能测试,对比了不同算法和数据结构在编译过程中的效率差异。
实验结果表明,我们所实现的编译器在处理大规模程序时具有较好的性能。
七、结论通过本次实验,我们深入了解了编译原理中的一些基本概念和技术,并通过实践加深了对编译过程的理解。
同时,我们也意识到编译器的设计和实现是一项复杂而有挑战性的任务,需要综合运用多种算法和数据结构。
编译原理中实验报告
实验名称:编译原理实验实验时间: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转换为中间代码。
在本实验中,我们选择了三地址代码作为中间代码的形式。
三地址代码是一种表示赋值、条件判断和循环等操作的方式,它使用三个操作数和两个操作符来表示一个操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int rowy=1;//识别输入行位置 int rowx=1;//识别输入列位置
int outkey=0;//打印控制 0 为数字后有字母 其他可以
void searcht(int i,string m)//根据已识别的首字母识别字符串
{
// cout<<"enter searcht!!"<<endl;
"<<"
标
识
符
("<<rowy<<","<<rowx<<")"<<endl;
k[kpointer]=m;
kpointer++;
} }
} if(i==1)//识别常数 { // cout<<" a number!!"<<endl;
for(x=0;x<max;x++) {
if(ci[x]==m) {
cout<<"(5,"<<x<<")"<<endl; break; } } if(x==max) {
//如果前面是数字或字母
{
}
else if(i>0)
{
sn=s.substr(x-i,i);
// cout<<sn<<"运算符 i="<<i<<endl;
cout<<sn<<" ";
outkey=1;
wordlook(sn[0],sn);
rowx++;
i=0;
}
cout<<s[x]<<" (2,"<<s[x]<<")
先创建 salaryfile.txt 文件 输入 If i=0 then n++; a<= 3b %);
六、核心代码 #include<iostream>
#include<string> #include<fstream> #include <sstream>
using namespace std;
else //字母开头的字符串
{
//
cout<<" true"<<endl;
wordlook(sn[0],sn);
rowx++;
}
}
}
Error
Error
} else {
if(x>0&&(s[x-1]>64&&s[x-1]<91)||(s[x-1]>96&&s[x-1]<123)||(s[x-1]>=48&& s[x-1]<=57))//遇到分界符运算符 如果前面是数字或字母
cout<<"(5,"<<m<<") 常数 ("<<rowy<<","<<rowx<<")"<<endl; ci[cipointer]=m; cipointer++; } } if(i==2)//识别 分界符 算数运算符 关系运算符 { // cout<<" a signal!!"<<endl; for(x=0;x<max;x++) { if(s[x]==m)
Error
(2,4)
)
( 2, ) )
分界符
(2,5)
;
( 2, ; )
分界符
(2,6)
三、 实验内容
用 VC++/VB/JAVA 语言实现对 C 语言子集的源程序进行词法分析。通过
输
入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编
码及单
词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示 ;
int x;
if(i==0)//首字符是字母识别关键字
{
//
cout<<" a word!!"<<endl;
for(x=0;x<max;x++)
{
if(id[x]==m)
{
cout<<"(1,"<<id[x]<<")"<<"
关
键
字
("<<rowy<<","<<rowx<<")"<<endl;
break;
各种组合的非法输入。
由记号组成的句子。
4、词法分析程序设计要求输出形式:
例:输入 VC++语言的实例程序:
If i=0 then n++;
a﹤= 3b %);
输出形式为:
单词
二元序列
类型
位置(行,列)
(单词种别,单词属性)
for
(1,for )
关键字
(1,1)
i
( 6,i )
标识符
(1,2)
=
( 4,= )
计算机与信息学院 编译原理 实验报告
专业班级 学生姓名及学号 课程教学班号 任课教师 实验指导教师 实验地点
信息安全 13-1 班 马骏 2013211869
李宏芒 李宏芒 实验楼机房
2015 ~2016 学年第 二 学期
实验 1 词法分析设计
一、 实验目的
通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设
wordlook(sn[0],sn); rowx++;
} }
i=0; }
string ll=s.substr(x,1);//判断是运算符还是分界符 wordlook(s[x],ll); if(fjf==0)//是运算符 {
i++;
if((s[x+1]>64&&s[x+1]<91)||(s[x+1]>96&&s[x+1]<123)||(s[x+1]>=48&&s[x+1] <=57))//如果后面是数字或字母
分界符
("<<rowy<<","<<rowx<<")"<<endl;
rowx++;
/* if(ll==";")
} }
{ rowy++; rowx=1;
} */
}
}; int main() {
int x; string instring;//读入一行 string sn;
/* getline(cin,sn);// string 带空格输入 cout<<sn<<endl; char t=sn[0]; if(t>=48&&t<=57) searcht(1,sn); else { if((t>64&&t<91)||(t>96&&t<123)) searcht(0,sn); else searcht(2,sn); }
四、实验步骤 1、根据流程图编写出各个模块的源程序代码上机调试。 2、 编制好源程序后,设计若干用例对系统进行全面的上机测试,并通过所设计 的词法分析程序;直至能够得到完全满意的结果。 3、书写实验报告 ;实验报告正文的内容:
功能描述:该程序具有什么功能? 程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;函数 之间的调用关系图。 详细的算法描述(程序总体执行流程图) 。 给出软件的测试方法和测试结果。 实验总结 (设计的特点、不足、收获与体会)。 五、实验截图
}
else sign=0; }
} i++; if(x==(s.length()-1)) { sn=s.substr(x-i+1,i);
if(i>0)
{
// cout<<sn<<" i="<<i<<endl;
cout<<sn<<" ";
if(sign==0)//数字后有字母的情况
cout<<"
("<<rowy<<","<<rowx<<")"<<endl;
计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和
清楚的
理解,并能正确地、熟练地运用
二、 实验要求
1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。
2、将标识符填写的相应符号表须提供给编译程序的以后各阶段使用。
3、根据测试数据进行测试。测试实例应包括以下三个部分:
全部合法的输入。
outkey=0;
}
fjf=0;
}
}
};
void wordlook(char t,string sn)//识别首字符,分类识别字符串 {