编译原理 上机实验报告

合集下载

编译原理实验报告(C语言)

编译原理实验报告(C语言)

编译原理实验报告实验项目1:词法分析程序实验一、实验的目的与任务:编译原理是计算机类专业特别是计算机软件专业的一门重要专业课。

设置该课程的目的在于系统地向学生讲述编译系统的结构、工作流程及编译程序各组成部分的设计原理和实现方法,使学生通过学习既掌握编译理论和方法方面的基本知识,也具有设计、实现、分析和维护编译程序等方面的初步能力。

编译原理是一门理论性和实践性都比较强的课程。

进行上机实验的目的是使学生通过完成上机实验题目加深对课堂教学内容的理解。

同时培养学生实际动手能力。

编译实验由三个独立实验组成,按照由浅入深进行排列,希望通过本实验使学生更深学习并理解编译的主要过程和相关方法。

词法分析的目的是将输入的源程序进行划分,给出基本符号(token)的序列,并掠过注解和空格等分隔符号。

基本符号是与输入的语言定义的词法所规定的终结符。

本实验要求学生编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。

并依次输出各个单词的内部编码及单词符号自身值。

(遇到错误时可显示“Error”,然后跳过错误部分继续进行)二、题目分析1.这里采用C语言编写的源程序作为词法分析程序的输入数据,输入数据保存在“in.txt”记事本中,将分析结果存在“out.txt”记事本中。

词法分析器的源代码使用C语言编写。

2.下面就词法分析程序中的主要变量进行说明:主函数main():打开要分析的C语言源程序,若不能正确打开,则报错。

先从源程序中读入一个字符ch,然后进行如下处理:1、cp消耗掉空格,制表符,换行符后,cp数组复位,开始检测cp;2、数字检测,对照符号表输出,若匹配成功,则返回序号;3、字符串检测, 对照符号表输出,若匹配成功,则返回序号;4、基本保留字检测,对照符号表输出,若匹配成功,则返回序号;5、运算符检测,对照符号表输出,若匹配成功,则返回序号;注意这里碰到‘/’时,要判断后面是否跟着是注释语句。

编译原理上机实验

编译原理上机实验

实验1简单的词法分析子程序【实验目的】●理解词法分析在编译程序中的作用●初步了解和掌握词法分析程序的实现方法和技术【实验内容】1. 编写程序,输入一串字符,判断该字符串是否为合法标识符或合法整型常量。

2. 无符号数的算术四则运算中的各类单词的识别。

输入:由无符号数、+、-、*、/、(、)构成的算术表达式。

输出:对识别出的每一单词均单行输出。

如,输入:8*2.5-1.0e2则,输出:8*2.5-1.0e2描述无符号数的确定的、最小化的状态转换图如图1所示。

其中编号1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。

图1 文法G[<无符号数>]的状态转换图实验2词法分析程序设计【实验目的】●理解词法分析中的正规式和自动机●掌握词法分析程序的实现方法和技术【实验内容】某一高级程序设计语言的部分语言子集定义如下:(1)关键字:for if then else while do(所有关键字都是小写)(2)运算符和分隔符:+ - * / : = <><= <>>= == ; ( ) #(3)其他标识符(ID)和整型常数(NUM),通过以下正规式定义:ID=letter(letter|digit)*NUM=digit·digit*(4)空格由空白、制表符和换行符组成。

空格一般用来分隔ID、NUM、运算符、分隔符和关键字,词法分析阶段通常被忽略。

各种词法单元对应的词法记号如下:编写程序,实现词法分析功能。

输入:源程序输出:二元组(词法记号,属性值/其在符号表中的位置)构成的序列。

例如:输入源程序x=5;if (x>0)thenx=2*x+1/3;elsex=2/x;#(# 表示输入结束)经词法分析后输出如下序列:(10,x)(18,=)(11,5)(26,;)(2,if)(27,()…说明:关键字表的初值。

关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符,查关键字表。

编译原理实验报告(C语言)

编译原理实验报告(C语言)

else if(strcmp(word,"if")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',12,')'); else if(strcmp(word,"else")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',13,')'); else if(strcmp(word,"switch")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',14,')'); else if(strcmp(word,"case")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',15,')'); else if(strcmp(word,"for")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',16,')'); else if(strcmp(word,"do")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',17,')'); else if(strcmp(word,"while")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',18,')'); else if(strcmp(word,"goto")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',19,')'); else if(strcmp(word,"continue")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',20,')'); else if(strcmp(word,"break")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',21,')');

编译原理 实验报告

编译原理 实验报告

编译原理实验报告指导教师:一. 实验目的基本掌握计算机语言的词法分析程序的开发方法。

以及掌握计算机语言的语法分析程序设计与属性文法应用的实现方法。

锻炼自己的编程能力和逻辑思维能力,体会计算机编译器的奥妙之处二. 实验内容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。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

编译原理实验报告总结

编译原理实验报告总结

编译原理实验报告总结一、实验目的编译原理是计算机科学中的一门重要课程,通过实验可以更深入地理解编译过程的各个阶段,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等。

本次编译原理实验的目的主要有以下几点:1、加深对编译原理理论知识的理解和掌握,将抽象的概念通过实际操作转化为具体的实现。

2、培养实际动手能力和解决问题的能力,通过编写代码实现编译程序的各个模块,提高编程技能和调试能力。

3、熟悉编译程序的开发流程和工具,掌握相关编程语言和开发环境的使用。

4、培养团队合作精神和沟通能力,在实验过程中与小组成员共同探讨、解决问题,提高协作效率。

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

同时,使用了一些辅助工具,如调试工具、代码管理工具等,以提高开发效率和代码质量。

三、实验内容1、词法分析任务:使用正则表达式或有限自动机实现对输入源程序的词法分析,将源程序分解为一个个单词,并识别出单词的类型,如标识符、关键字、常量、运算符等。

实现方法:采用有限自动机的方法,设计状态转移图,根据输入字符的类型进行状态转移,最终确定单词的类型。

遇到的问题及解决方法:在处理一些边界情况时,如字符串中的转义字符,出现了识别错误。

通过仔细分析正则表达式和有限自动机的规则,对代码进行了相应的修改和完善,解决了问题。

2、语法分析任务:使用自顶向下或自底向上的语法分析方法,对词法分析得到的单词序列进行语法分析,构建语法树。

实现方法:选择了自顶向下的递归下降分析法,根据语法规则编写递归函数,逐个处理单词,构建语法树。

遇到的问题及解决方法:在处理复杂的语法结构时,出现了回溯和左递归的问题,导致分析效率低下。

通过消除左递归和提取公共因子,优化了语法分析算法,提高了分析效率。

3、语义分析任务:在语法分析的基础上,进行语义分析,检查语法正确的程序是否在语义上也是正确的,如类型匹配、变量未定义等。

《编译原理》词法分析实验报告模板-课程上机

《编译原理》词法分析实验报告模板-课程上机

实验报告课程名称编译原理实验项目设计与实现一个词法编译器班级姓名学号实验名称设计与实现一个词法实验地点实验时间编译器1.实验目的:结合讲授内容,设计与实现一个简单词法编译器,通过本实验加深对词法分析程序的功能及实现方法的理解。

设计与实现一个简单词法编译器。

具体内容是对输入的语句进行分析,分解出关键字3. 实验要求:(1)掌握和实现词法分析器的功能:输入源程序,输出单词符号(二元式表示)。

输入输出(2)单词符号的分类:关键字:是由程序语言定义的具有固定意义的标识符。

标识符:用来表示各种名字,如变量等。

常数:常数的类型有整型,实型等。

运算符:算术运算符,关系运算符,逻辑运算符。

界限符:逗号,分号等。

(3)实验步骤:1、确定词法分析器的接口关系;2、设计算法参考教材图2.5。

4. 实验准备: 1:pc 机一台; 2:VC++编译器词法分析器 源程序 (字符流)二元式 (单词流)1,分析问题输入源程序,输出单词符号(二元式表示)。

输入 输出2,算法步骤::将文件中每行读入的字符串存入数组buffer[100],不跳过空格; :利用构造函数传递数组,和每行的长度length ;:调用成员函数scan ,i=0, while(i<length)开始检测buffer 的字符;:if(isletter(),接收完成后比较是否为关键字,不是则将其存入标示符id[50][10]中 ; :else if(isdigit()),接收完成后存入cst[50][10]中;:else if 为界符,比较符,运算符,输出对应的二元编码;:接受完毕,输出id[50][10]--标示符,cst[50][10]--常数,列表; 3:程序代码#include<stdio.h> #include<stdlib.h> #include<string.h>#define _KEY_WORD_END "#"//结束标志 typedef struct {int typenum;//种别码 char* word;//单词 }WORD;char input[1001]; char token[100]="";int p_input;//输入缓冲区指针 int p_token;//单词缓冲区指针char *rwtab[]={"begin","if","then","while","do","end",_KEY_WORD_END};//关键字列表,可扩充 char ch;//获取一个字符char m_getchar()//在缓冲区获取一个字符 {ch = input[p_input]; p_input ++; return ch;}void getbc()//去除空白符号 {while(ch ==' '||ch == '\n') {词法分析器 源程序(字符流) 二元式(单词流)ch = input[p_input];p_input ++;}}int letter()//判断字符是不是字母{if(ch >='a'&&ch<='z' || ch>='A'&&ch<='Z')return 1;return 0;}int digit()//判断字符是不是数字{if(ch>='0'&&ch<='9')return 1;return 0;}void concat()//组装单词{token[p_token] = ch;p_token ++;token[p_token] = '\0';}void retract()//缓冲区回退一个字符{p_input --;}int reserve()//与关键字表对比,查看是否是关键字{int i =0;while(strcmp(rwtab[i],_KEY_WORD_END)){if(!strcmp(rwtab[i],token)){return i+1;}i ++;}return 10;}WORD* scaner()//获取一个单词,并判断它的特别码{WORD * myword = new WORD;myword->typenum = 10;p_token = 0;//单词指针初始化m_getchar();//获取一个字符getbc();//去除空白if(letter())//判断是否为字母{while(letter()||digit()){concat();//单词组装m_getchar();//获取字符}retract();myword->word = token;//存入输出结构体myword->typenum = reserve();//判断单词的特别码,并存入结构体return myword;}else if(digit()){while(digit()){concat();m_getchar();}retract();myword->word = token;//存入输出结构体myword->typenum = 11;return myword;}else switch(ch){case ':':m_getchar();if(ch == '='){myword->typenum = 18;myword->word = ":=";}else{retract();myword->typenum = 17;myword->word = ":";}return myword;case '+':myword->word = "+"; return myword;case '-':myword->typenum = 14; myword->word = "-"; return myword;case '*':myword->typenum = 15; myword->word = "*"; return myword;case '/':myword->typenum = 16; myword->word = "/"; return myword;case '<':m_getchar();if(ch == '='){myword->typenum = 22; myword->word ="<="; }else if(ch == '>'){myword->typenum = 21; myword->word ="<>"; }else{retract();myword->typenum = 20; myword->word = "<"; }return myword;case '>':m_getchar();if(ch == '='){myword->typenum = 24; myword->word =">="; }else{retract();myword->word = ">";}return myword;case '=':myword->typenum = 25;myword->word ="=";return myword;case ';':myword->typenum = 26;myword->word =";";return myword;case '(':myword->typenum = 27;myword->word ="(";return myword;case ')':myword->typenum = 28;myword->word =")";return myword;case '\0'://字符串结束标志myword->typenum = 1000;myword->word ="OVER";return myword;default://不符合的词法myword->typenum = -1;myword->word ="ERROR";return myword;}}int main(){WORD* oneword = new WORD;int over = 1;printf("Enter Y our words(end with #):\n");while(scanf("%[^#]s",input),strcmp(input,"end the program"))//读入源程序字符串到缓冲区{getchar();p_input = 0;//输入缓冲区指针初始化while(over !=1000)//单词不是\0{oneword =scaner();if(over<1000)//\0不用输出printf("(%d,%s)",over,oneword->word);}over=1;printf("(0,#)");printf("\nEnter Y our words(end with #):\n"); printf("结束程序,输入 end the program#\n "); }return 0;}5:程序运行结果6:校验试验结果正确。

编译原理实验报告

编译原理实验报告

编译原理实验报告《编译原理》实验教学⼤纲课程编号:课程名称:编译原理/Compiler Principles实验总学时数:8学时适应专业:计算机科学与技术、软件⼯程承担实验室:计算机科学与技术学院实验中⼼⼀、实验教学的⽬的和任务1.上机实习是对学⽣的⼀种全⾯综合训练,是与课堂听讲、⾃学和练习相辅相成的必不可少的⼀个教学环节。

通常,实习题中的问题⽐平时的练习题要复杂,也更接近实际。

编译原理这门课程安排的2次上机实验都属于⼀种设计类型的实验,每个实验的训练重点在于基本的编译技术和⽅法,⽽不强调⾯⾯俱到;实验的⽬的是旨在使学⽣进⼀步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容;培养学⽣编制算法的能⼒和编程解决实际问题的动⼿能⼒。

2.要求学⽣在上机前应认真做好各种准备⼯作,熟悉机器的操作系统和语⾔的集成环境,独⽴完成算法编制和程序代码的编写;上机时应随带有关的编译原理教材或参考书;要学会程序调试与纠错;每次实验后要交实验报告。

实验报告的内容应包括:(1)封⾯:实验题⽬、班级、学号、姓名、完成⽇期;(2)简要的需求分析与概要设计;(3)详细的算法描述;(4)程序清单与运⾏结果;(5)收获与体会。

实验成绩占编译原理课程结业成绩的10-20%。

⼆、实验项⽬及学时分配三、每项实验的内容和要求要求每个实验保证每个学⽣⼀台微机。

实验⼀(4学时):单词的词法分析程序设计。

1.问题描述:对于常⽤⾼级语⾔(如Pascal、C语⾔)的各类单词进⾏词法分析。

2.实验内容:完成对某⼀种常⽤⾼级语⾔(如Pascal、C语⾔、PL/0语⾔)的各类单词进⾏词法分析,即对源程序从左到右进⾏扫描,对组成源程序的字符串拼接成为单词;并把其转换成属性字输出。

3.实验要求:(1)选择常⽤⾼级程序设计语⾔(如 Pascal、C语⾔、PL/0语⾔)的源程序作为词法分析对象。

(2)根据教学要求和学⽣具体情况,从上列语⾔之⼀中选取它的⼀个适当⼤⼩的⼦集,可以选取⼀类典型单词,也可以尽可能使各种类型的单词都能兼顾到。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4
1
设计
必做
3.实验报告应及时上交给任课教师批改、评分。
五、考试(考核)方法与规定
实验指导教师检查学生上机的出勤情况、实验内容及实验报告,实验成绩占平时成绩的40%。
六、实验项目设置与内容
实验项目编号
实验名称
内容提要
实验学时
每组人1
词法分析程序设计
设计exl语言的词法分析程序,将所有标识符、常数、保留字和分割符等进行归类,并输出词法单元序列。
4
1
设计
必做
E05200102
语法分析程序设计
设计exl语言的语法分析程序,使用递归下降分析作为编制语法分析程序的依据,输出分析树和符号表。
4
1
设计
必做
E05200103
语义分析程序设计
设计exl语言的语义分析程序,完成类型检查和类型转换。
4
1
设计
必做
E05200104
中间代码生成程序设计
设计exl语言的中间代码生成程序,输出三地址代码序列。
三、实验方式与注意事项
本课程所有实验均需上机进行,每个实验都有明确的实验目的。具体要求如下:
1.学生按照实验要求,上机前做好上机实验预习,内容包括:实验的目的、内容、实验步骤。
2.上机实验时按实验要求完成每一个实验的内容。
3.课后认真书写实验报告。
四、实验报告
1.实验报告采用统一的实验报告纸。
2.实验报告书写规范,应包括:实验目的和要求、实验内容、实验步骤、实验纪录。
一、课程简介
本课程是计算机科学与技术专业的重要专业课。主要讲授编译技术的基本原理、编译程序的组成及编译程序的开发,让学生充分认识和了解程序设计语言编译程序的基本结构和各部分的功能,使学生掌握设计和构造程序语言编译系统的基本原理和技术。
二、实验目的与要求
编译原理是一门理论性和实践性都比较强的课程。上机实验的目的使学生掌握文法和语言的形式定义、单词的描述工具和词法单元的识别、理解中间代码的含义和形式、了解各种语句的翻译、了解代码生成的基本方法等内容,完成词法分析程序的设计、语义分析程序的设计和中间代码生成程序的设计。通过培养学生实际动手能力,使学生既掌握编译理论和方法方面的基本知识,也具有设计、实现、分析和维护编译程序等方面的初步能力。
相关文档
最新文档