--表达式编译程序上机报告

合集下载

c程序上机试验报告

c程序上机试验报告

安徽建筑工业学院信息网络中心实验报告课程名称:程序设计基础—C程序实验指导教师:专业:班级:姓名:学号:201 至201 学年第学期实验1 C程序运行环境、数据类型、运算符和表达式一、实验目的1.掌握Turbo C集成环境的进入与退出、Turbo C集成环境各种窗口的切换,了解Turbo C集成环境的设置。

2.掌握C语言源程序的建立、编辑、修改、保存及编译和运行等操作。

3.学会使用C语言的基本运算符(主要是算术运算符、赋值运算符)及其表达式。

4.掌握C语言源程序的结构特点与书写规范。

二、实验要求1.根据题目要求,进行各种程序测试与验证,并记录结果。

2.上机调试程序。

按各个程序输入计算机,并进行编译和连接,如果在编译、连接中有错误信息,则要根据这些信息找到程序中的错误所在,然后修改程序,直至正确。

3.详细记录数据的输入、输出信息,按要求写出实验报告。

三、实验内容1.开机;进入Turbo C集成工作环境,了解Turbo C集成工作环境及其菜单的使用,输入如下C语言源程序,并以ex1.C存盘。

/*ex1.c*/#include <stdio.h>main(){printf("Hello!\n");printf("This is C program!\n");}试编译、连接、运行该程序,并按Alt+F5查看运行结果。

运行结果是:2.输入并调试运行以下程序,查看运行结果(由此结果可以了解到在实验用的微型机上,几种数据类型所占的字节数)。

main(){printf("char\t%d bytes\n",sizeof(char));printf("short\t%d bytes\n",sizeof(short));printf("int\t%d bytes\n",sizeof(int));printf("long\t%d bytes\n",sizeof(long));printf("float\t%d bytes\n",sizeof(float));printf("double\t%d bytes\n",sizeof(double));}运行结果是:3.输入并调试运行以下程序。

c语言上机报告

c语言上机报告

c语言上机报告
C语言上机报告
在大学计算机专业的学习中,C语言是一门基础而又重要的编程语言。

而上机实验则是检验学生掌握C语言编程能力的重要环节之一。

本篇报告将介绍我在上机实验中的学习经历和心得体会。

我学习了C语言的基础语法,如变量、数据类型、运算符、流程控制语句等。

通过实验,我掌握了变量的定义和使用,学会了各种数据类型的声明和赋值,以及常用运算符的使用方法。

此外,我也了解了if语句、switch语句、for循环、while循环等流程控制语句的使用方法。

我学习了C语言中的数组和指针。

通过实验,我深刻理解了数组的定义和使用,以及数组下标的含义。

同时,我也学会了指针的定义和使用,包括指针的初始化、指针的运算、指针和数组的关系等。

这对于理解C语言的高级特性十分重要。

接着,我学习了C语言中的函数和文件操作。

通过实验,我了解了函数的定义和调用方法,以及函数的传参和返回值的使用。

此外,我也学会了文件的打开、读写和关闭等基本操作,这为我以后的文件操作打下了基础。

我学习了C语言中的动态内存分配和结构体。

通过实验,我了解了
动态内存分配的基本概念和使用方法,以及动态内存分配和指针的关系。

同时,我也学会了结构体的定义和使用,包括结构体的声明、结构体变量的定义和初始化、结构体成员的访问等。

总的来说,通过上机实验,我对C语言的基础知识有了更深刻的理解和掌握,并且能够熟练运用这些知识进行编程。

同时,我也意识到了编程技能的重要性,希望在以后的学习中能够不断提升自己的编程能力。

C语言上机实验报告

C语言上机实验报告

中南大学C语言程序设计实验报告学生姓名学号专业班级指导教师学院信息科学与工程学院完成时间2014年10月~2014年12月一、目的要求1、熟悉C语言的表达式语句、空语句和复合语句。

2、熟悉函数调用语句,尤其是各输入输出函数调用语句。

3、熟悉顺序结构程序中语句的执行过程。

4、能设计简单的顺序结构程序。

二、上机内容1、完成《C语言程序设计上机指导与习题选解》的实验一~实验三;2、编程并调试程序:(1)从键盘输入一个三位数,输出该数的各位数字和。

如输入:358,输出:3+5+8=16。

#include<stdio.h>main(){int a,b,c,x,m;printf("input a number:");scanf("%d",&x);if(x>999||x<100){printf("error\n");}else{a=x/100;x=x%100;b=x/10;c=x%10;m=a+b+c;printf("%d+%d+%d=%d\n",a,b,c,m);}system("pause");}(2)从键盘输入实数x,根据公式y=sin(x)+e|x|计算出y值输出。

#include<stdio.h>#include<math.h>main(){int x;printf("input x:");scanf("%d",&x);printf("%f\n",sin(x)+exp(x));system("pause");}一、目的要求1、学会运用逻辑表达式或关系表达式等表达条件。

2、熟练掌握if语句和switch语句。

3、学会使用F8跟踪调试程序,针对输入测试数据,观察程序运行的输出结果。

编译实验报告(语法分析、词法分析)

编译实验报告(语法分析、词法分析)
search(digittp,3); //对该字符进行数字处理
printf("(3, %s)\n",digittp);










5、其他函数
char alphaprocess(char buffer)
char othertp [20];
othertp[0]=buffer;
othertp[1]='\0';
char *border[7]={",",";",".","(",")","{","}"}; //分格符
char *arithmetic[8]={"+","-","*","/","<",">","=","+="}; //运算符
////////////////////////////////////////////////////////////////////////////////////////
if (search(othertp,4)) do//判断字符是否是运算符
printf("(4, %s)\n",othertp);
buffer=fgetc(fp);
goto out;
if (search(othertp,5)) do //判断字符是否是分隔符
printf("(5, %s)\n",othertp);

编译原理实验报告1

编译原理实验报告1

03091337 李璐 03091339 宗婷婷一、上机题目:实现一个简单语言(CPL)的编译器(解释器)二、功能要求:接收以CPL编写的程序,对其进行词法分析、语法分析、语法制导翻译等,然后能够正确的执行程序。

三、试验目的1.加深编译原理基础知识的理解:词法分析、语法分析、语法制导翻译等2.加深相关基础知识的理解:数据结构、操作系统等3.提高编程能力4.锻炼独立思考和解决问题的能力四、题目说明1.数据类型:整型变量(常量),布尔变量(常量)取值范围{…, -2, -1, 0, 1, 2, …}, {true, false}2、运算表达式:简单的代数运算,布尔运算3、程序语句:赋值表达式,顺序语句,if-else语句,while语句五、环境配置1.安装Parser Generator、Visual C++;2.分别配置Parser Generator、Visual C++;3.使用Parser Generator创建一个工程编写l文件mylexer.l;编译mylexer.l,生成mylexer.h与mylexer.c;4.使用VC++创建Win32 Console Application工程并配置该项目;加入mylexer.h与mylexer.c,编译工程;执行标识符数字识别器;注意:每次修改l文件后,需要重新编译l文件,再重新编译VC工程六、设计思路及过程设计流程:词法分析LEX的此法分析部分主要利用有限状态机进行单词的识别,在分析该部分之前,首先应该对YACC的预定义文法进行解释。

在YACC中用%union扩充了yystype的内容,使其可以处理char型,int型,node型,其中Node即为定义的树形结点,其定义如下:typedef enum { TYPE_CONTENT, TYPE_INDEX, TYPE_OP } NodeEnum;/* 操作符 */typedef struct {int name; /* 操作符名称 */int num; /* 操作元个数 */struct NodeTag * node[1]; /* 操作元地址可扩展 */} OpNode;typedef struct NodeTag {NodeEnum type; /* 树结点类型 *//* Union 必须是最后一个成员 */union {int content; /* 内容 */int index; /* 索引 */OpNode op; /* 操作符对象 */};} Node;extern int Var[26];结点可以是三种类型(CONTENT,INDEX,OP)。

C语言程序设计上机实验报告(精选5篇)

C语言程序设计上机实验报告(精选5篇)

C语言程序设计上机实验报告(精选5篇)第一篇:C语言程序设计上机实验报告黔南民族师范学院 C语言程序设计上机实验报告系部:计算机科学系年级:2013 级班级:姓名:学号:实验时间:实验成绩:2013年月日实验三顺序结构程序的设计一实验名称:顺序结构程序的设计二.实验环境:windows XP系统,VC++6.0软件三.实验目的:四.实验内容:五.算法描述流程图六.源程序七.测试数据及运行结果八.实验心得实验成绩评分要求1、原创性发现抄袭或雷同成绩为0分2、正确性程序正确60分3、可读性格式清楚,有注释,变量命名规范20分4、健壮性对特殊测试数据有考虑有测试10分5、效率程序运行效率高10分第二篇:《c语言程序设计》上机实验报告要求《c语言程序设计》上机实验报告要求1.实验环境:软件系统:使用的软件环境硬件系统:机型说明2.实验目的:掌握如何编辑、编译、链接调试运行c程序3.实验内容:(1)掌握顺序结构程序设计.P26 ,p49,p62 3.2~3.7(2)掌握选择结构程序设计(if 和switch语句的用法)p4.2~(3)循环结构程序设计(while, dowhile,for语句的用法)。

(4)掌握数组的定义、输入和输出的方法,字符数组、字符串函数的使用。

(5)了解函数的定义,熟悉函数实参与形参的“值传递”方式,掌握函数的嵌套调用和递归调用方法。

(6)熟悉指针含义及其使用。

(7)熟悉结构体和共用体的使用。

(8)熟悉文件的使用。

4.实验要求:(1)输入编写的源程序,检查程序有无错误(语法和逻辑错误),有则改之。

(2)编译和连接,仔细分析编译信息,如有错误应找出原因并改正。

(3)运行程序,输入数据,分析结果。

5.实验结果:输出程序清单和运行结果。

(要求把原题内容,调试好的程序和其结果一并打印),6.实验体会分析运行结果,本次调试程序取得的经验(遇到的问题,解决的方法等)。

第三篇:C程序设计上机实验报告10C程序设计实验报告实验名称:指针与数组学时安排:2课时实验类别:上机操作型实验要求:1人1组 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄一、实验目的1.理解指针、地址和数组间的关系;2.掌握通过指针操作数组元素的方法;3.掌握数组名作为参数的编程方式。

编译原理上机报告

编译原理上机报告

编译原理上机报告⼀.实验⽬的通过设计并完成⼀个简单的”函数图形绘制程序”,使同学基本上学会编译技术中的词法分析器,语法分析器的构造⽅法,并初步掌握语法制导翻译技术,使同学对编译器的构造⽅法以及编译过程有清楚的感性认识..⼆.实验任务语⾔的⾮形式描述,语⾔的描述包括语法和语义两个部分,此处采⽤⾮形式化的描述,.上机实验包括词法分析和语法分析以及语义分析,分别实现戏词法分析器,语法分析器和图形绘制的设计编码与调试。

三.模块的划分和模块间关系此部分主要由三部分组成:词法分析,语法分析和语义分析。

1.词法分析词法分析器⾄少完成两个任务:〈1〉滤掉注释和⽆⽤成分。

〈2〉数别记号供语法分析器使⽤(1)与语法分析器的接⼝:名称:InitScanner 功能:初始化词法分析器参数:被分析的输⼊⽂件名返回值:成功/失败(1/0)名称:GetToken 功能:取得⼀个记号参数:⽆返回值:记号的种别名称:CloseScanner 功能:关闭词法分析器参数:⽆其框图如下:(2)记号的设计为了区分记号,把程序中所能出现的记号名,函数名,常量名,参数名,保留字都包含在⼀个数组中,数组中的成员都是CToken的对象。

其定义如下:2(3)与实现有关的问题A.字符输⼊缓冲区在设计的语⾔中,最多只预读⼀个字符,假设输⼊⽂件为InFile,,则Char=getc(InFile) //完成读字符ungetc(Char,InFile) //完成回退字符B.模式识别记号按如下⽅法分类:〈1〉标⽰符⼀个模式,包括保留字,函数名,T及Pi,E〈2〉常数字⾯量⼀个模式〈3〉其它符号每种⼀个模式C.词法分析器的调试词法分析器的主代码如下:#include"scanner.h"void main(int argc,char*argv[]){Token token;if(argc<2){printf("please input Source File!\n");return;}if(!InitScanner(argv[1])) //初始化词法分析器{printf("Open Source File Error!\n"); return;}printf("记号类型字符串常数值函数指针\n");printf("_________________________________________________________\n");while(1){token=GetToken(); //获得记号if(token.type!=NONTOKEN) //打印记号的内容printf("%4d,%12s,%12f,%12x\n",token.type,token.lexeme,token.value,token.FuncPtr);else break;};printf("___________________________________________________________\n");CloseScanner();}如有绘图语句如下:scale is(100, 100);for t from 0 to 2*pi step pi/300经词法分析器编译可得结果如下:2语法分析器词法分析与语法分析的区别之⼀是,词法分析是线性的,⽽语法分析是⾮线性的。

c语言上机实验报告

c语言上机实验报告

c语言上机实验报告C语言上机实验报告引言:C语言是一门广泛应用于计算机编程领域的高级编程语言。

通过学习C语言,我们可以了解计算机程序的基本原理和实现方法。

在本次实验中,我们将进行一系列的C语言上机实验,旨在提高我们的编程能力和解决问题的能力。

实验一:基本语法和数据类型在这个实验中,我们首先学习了C语言的基本语法和数据类型。

我们了解了变量的定义和使用,以及常用的数据类型,如整数、浮点数和字符。

通过编写简单的程序,我们掌握了C语言的基本语法和运算符的使用方法。

实验二:流程控制和循环结构在这个实验中,我们学习了C语言的流程控制和循环结构。

我们了解了条件语句(if-else语句)和循环语句(for循环和while循环)的使用方法。

通过编写程序,我们掌握了如何根据不同的条件执行不同的代码块,以及如何使用循环结构重复执行一段代码。

实验三:数组和字符串在这个实验中,我们学习了C语言中数组和字符串的使用方法。

我们了解了如何定义和初始化数组,以及如何使用下标访问数组元素。

我们还学习了字符串的定义和常用的字符串处理函数。

通过编写程序,我们掌握了如何使用数组和字符串解决实际问题。

实验四:函数和指针在这个实验中,我们学习了C语言中函数和指针的使用方法。

我们了解了如何定义和调用函数,以及如何传递参数和返回值。

我们还学习了指针的概念和使用方法,包括指针的定义、指针的运算和指针的传递。

通过编写程序,我们掌握了如何使用函数和指针提高程序的模块化和灵活性。

实验五:文件操作在这个实验中,我们学习了C语言中文件操作的使用方法。

我们了解了如何打开和关闭文件,以及如何读取和写入文件。

我们还学习了文件指针和文件位置指示器的概念和使用方法。

通过编写程序,我们掌握了如何读取和处理文件中的数据,以及如何将数据写入文件。

总结:通过这一系列的C语言上机实验,我们深入学习了C语言的基本知识和编程技巧。

我们掌握了C语言的基本语法和数据类型,了解了流程控制和循环结构的使用方法,掌握了数组和字符串的操作技巧,学会了函数和指针的使用方法,以及文件操作的基本知识。

C语言集中上机实验报告

C语言集中上机实验报告

C语言集中上机实验报告一、实验目的本次实验的目的是通过一系列的C语言上机实验,掌握C语言的基本语法和常用操作。

二、实验内容1. 实验1:Hello World程序2.实验2:变量和数据类型3.实验3:运算符和表达式4.实验4:条件语句和循环语句5.实验5:函数的定义和使用6.实验6:数组和指针的应用三、实验过程1. 实验1:Hello World程序在本实验中,通过编写一个简单的Hello World程序,来熟悉C语言的编译和运行过程。

首先,在C语言编译器(如Dev-C++)中新建一个C 文件,然后输入以下代码:#include <stdio.h>int mainprintf("Hello World!\n");return 0;接下来,点击编译运行按钮,即可在控制台中看到输出结果"Hello World!"。

2.实验2:变量和数据类型在本实验中,我们学习了C语言的变量和数据类型的定义和使用。

通过定义不同的变量和数据类型,来存储不同类型的数据。

例如,我们可以定义一个整型变量a和一个字符型变量b,来分别存储整数和字符。

#include <stdio.h>int mainint a = 10;char b = 'A';printf("a = %d\n", a);printf("b = %c\n", b);return 0;编译运行后,控制台会输出变量a和b的值。

3.实验3:运算符和表达式在本实验中,我们学习了C语言中常用的运算符和表达式。

通过使用不同的运算符,可以对变量进行计算和操作。

例如,我们可以定义两个整型变量a和b,并使用加法运算符对它们进行相加。

#include <stdio.h>int mainint a = 10;int b = 5;int sum = a + b;printf("sum = %d\n", sum);return 0;编译运行后,控制台会输出变量sum的值。

编译原理上机实验报告

编译原理上机实验报告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

上机实验报告

上机实验报告

编译原理报告----正规式转化为NFA班级:191131班学号:20131002284姓名:李豪强指导老师:刘远兴日期:2015/10/20前期准备摘要题目:正规表达式→NFA 问题实习时间:2015/10/12【问题描述】正规表达式→NFA问题的一种描述是:编写一个程序,输入一个正规表达式,输出与该文法等价的有限自动机。

【基本要求】①掌握有限自动机、正规表达式、正规文法之间的转换算法,有些可帮助掌握有限自动机的确定化与最小化,还有些可帮助理解整个词法分析器的构造过程。

②以班为单位,每个班内3-5人为一组,自由组合。

选一人为组长,要适当分工,要分工明确。

③需上交:源程序,实验报告。

实验报告要交电子档报告,重点写自己那部分的设计思路和实现方法。

分工:我们小组具体分工如下:陈渊:负责总体规划,以及系统整合李豪强:负责整个程序架构的设计及软件测试;蔡路:负责伪代码(核心算法)的实现;李涛,陈渊:负责输入输出处理及用户界面设计祝莹倩,樊润宇:数据结构的分析处理;1.需求分析(1)首先要获取用户需要转化的正规式;(2)然后判断用户输入的正确与否,并予以提示;(3)运用正规式转化NFA的算法思想进行词法分析(4)设置初始状态X,终态Y,过程态用数字表示:0 1 2 3………测试数据:abb输出结果应为:X X-a->0Y0 0-b->11 1-b->Y测试数据:(a|b)*abb输出结果应为:X X - ~ ->3Y0 0-a->11 1-b->22 2-b->Y3 3- ~ ->0 3-a->3 3-b->32.设计2.1总体设计2.1.1设计思想(1)数据结构*** 该部分由小组成员樊润宇和祝莹倩同学共同完成***2.2模块设计(重点)程序架构的设计:此次实验的要求是将一个输入的任意合法正规式转换为相应的不确定的有穷自动机(NFA),由教材上所提出的方法可知,在构造有穷自动机的时候,第一步应先将正规式分解为可以直接转换为NFA的正规式,然后将所有的状态经过条件连接得到最终的NFA。

编译原理 上机实验报告

编译原理 上机实验报告
一、课程简介
本课程是计算机科学与技术专业的重要专业课。主要讲授编译技术的基本原理、编译程序的组成及编译程序的开发,让学生充分认识和了解程序设计语言编译程序的基本结构和各部分的功能,使学生掌握设计和构造程序语言编译系统的基本原理和技术。
二、实验目的与要求
编译原理是一门理论性和实践性都比较强的课程。上机实验的目的使学生掌握文法和语言的形式定义、单词的描述工具和词法单元的识别、理解中间代码的含义和形式、了解各种语句的翻译、了解代码生成的基本方法等内容,完成词法分析程序的设计、语义分析程序的设计和中间代码生成程序的设计。通过培养学生实际动手能力,使学生既掌握编译理论和方法方面的基本知识,也具有设计、实现、分析和维护编译程序等方面的初步能力。
4
1
设计
必做
E05200102
语法分析程序设计
设计exl语言的语法分析程序,使用递归下降分析作为编制语法分析程序的依据,输出分析树和3
语义分析程序设计
设计exl语言的语义分析程序,完成类型检查和类型转换。
4
1
设计
必做
E05200104
中间代码生成程序设计
设计exl语言的中间代码生成程序,输出三地址代码序列。
4
1
设计
必做
三、实验方式与注意事项
本课程所有实验均需上机进行,每个实验都有明确的实验目的。具体要求如下:
1.学生按照实验要求,上机前做好上机实验预习,内容包括:实验的目的、内容、实验步骤。
2.上机实验时按实验要求完成每一个实验的内容。
3.课后认真书写实验报告。
四、实验报告
1.实验报告采用统一的实验报告纸。
2.实验报告书写规范,应包括:实验目的和要求、实验内容、实验步骤、实验纪录。

表达式编译程序上机报告

表达式编译程序上机报告

《编译原理》上机实验报告计算机科学与技术班---上机一成员:00813035—吴庆周00813003—祝金辉00813015—闫海滨00718100—特日格乐00813023—王仕华一、题目编写编译程序实现多行表达式的<表达式序列>的文法语言的编译执行二、设计和主要结构1词法分析词法分析子程序分析:词法分析子程序名为getsym,功能是从源程序中读出一个单词符号,把它的信息放入全局变量sym、id和num中,语法分析器需要单词时,直接从这三个变量中获得。

(注意!语法分析器每次用完这三个变量的值就立即调用getsym子程序获取新的单词供下一次使用。

而不是在需要新单词时才调用getsym过程。

)getsym过程通过反复调用getch子过程从源程序过获取字符,并把它们拼成单词。

getch过程中使用了行缓冲区技术以提高程序运行效率。

词法分析器的分析过程:调用getsym时,它通过getch过程从源程序中获得一个字符。

如果这个字符是字母,则继续获取字符或数字,最终可以拼成一个单词,查保留字表,如果查到为保留字,则把sym变量赋成相应的保留字类型值;如果没有查到,则这个单词应是一个用户自定义的标识符(可能是变量名、常量名或是过程的名字),把sym置为SYM_IDENTIFIER,把这个单词存入id变量。

查保留字表时使用了二分法查找以提高效率。

如果getch获得的字符是数字,则继续用getch获取数字,并把它们拼成一个整数,然后把sym置为number,并把拼成的数值放入num变量。

如果识别出其它合法的符号(比如:赋值号、大于号、小于等于号等),则把sym赋成相应的类型。

如果遇到不合法的字符,把sym置成SYM_NULL。

词法分析子程序要完成的工作有:1. 识别一般标识符,此标识符值(字符序列)赋给全局量id,而全局量sym赋值为SYM_IDENTIFIER。

2. 识别数字序列,当前值赋给全局量NUM,sym则置为SYM_NUMBER;3. 识别=,回车之类的特殊符号,全局量sym则分别被赋值为SYM_BECOMES,SYM_CONTINUE等。

c 上机实验报告

c  上机实验报告

c 上机实验报告C语言上机实验报告引言:计算机科学与技术专业的学生,无论是在理论课程还是实践环节,都需要学习和掌握C语言。

C语言作为一种广泛应用于系统编程和嵌入式开发的高级编程语言,具有灵活性和高效性,因此被广泛应用于各个领域。

本篇实验报告将介绍我在上机实验中所学习到的C语言知识和技巧。

实验一:基本语法和数据类型在第一次上机实验中,我们学习了C语言的基本语法和数据类型。

通过编写简单的程序,我们了解了C语言的程序结构,包括头文件引用、全局变量定义、函数声明和主函数等。

同时,我们还学习了C语言的基本数据类型,如整型、字符型、浮点型等,并掌握了它们的使用方法和注意事项。

实验二:控制语句和循环结构在第二次上机实验中,我们深入学习了C语言的控制语句和循环结构。

通过编写多个程序,我们掌握了条件语句(if-else语句和switch语句)和循环语句(for循环、while循环和do-while循环)的使用方法。

这些控制语句和循环结构可以帮助我们实现程序的流程控制和逻辑判断,提高程序的灵活性和可读性。

实验三:数组和字符串在第三次上机实验中,我们学习了C语言中数组和字符串的使用。

通过编写程序,我们了解了数组的定义和初始化、数组元素的访问和修改、多维数组的使用等。

同时,我们还学习了字符串的定义和初始化、字符串的输入和输出、字符串的比较和拼接等。

数组和字符串是C语言中非常重要的数据结构,熟练掌握它们的使用方法对于编写复杂的程序非常有帮助。

实验四:函数和指针在第四次上机实验中,我们学习了C语言中函数和指针的使用。

通过编写程序,我们了解了函数的定义和调用、函数的参数传递和返回值、递归函数的实现等。

同时,我们还学习了指针的定义和初始化、指针的引用和解引用、指针的运算和指针与数组的关系等。

函数和指针是C语言中非常重要的概念和工具,熟练掌握它们的使用方法对于编写高效和灵活的程序至关重要。

实验五:文件操作和结构体在第五次上机实验中,我们学习了C语言中文件操作和结构体的使用。

c上机实验报告

c上机实验报告

c上机实验报告C 上机实验报告一、实验目的本次 C 语言上机实验旨在通过实际操作,加深对 C 语言基本语法、数据类型、控制结构、函数等知识的理解和掌握,提高编程能力和解决实际问题的能力。

二、实验环境操作系统:Windows 10编程软件:Visual Studio 2019三、实验内容本次实验共包括以下几个部分:(一)基础语法练习1、变量与数据类型定义不同类型的变量,如整型(int)、浮点型(float、double)、字符型(char)等,并进行赋值和输出操作。

通过这个练习,熟悉了不同数据类型的存储方式和取值范围。

2、运算符与表达式学习和使用各种运算符,包括算术运算符(+、、、/、%)、关系运算符(>、<、==、!=、>=、<=)、逻辑运算符(&&、||、!)等。

编写表达式计算数值,并根据结果进行判断和输出。

3、控制结构(1)顺序结构编写简单的顺序执行程序,按照代码的书写顺序依次执行语句。

(2)选择结构使用ifelse 语句和switch 语句实现根据不同条件执行不同的代码块。

通过给定的条件判断,选择相应的执行路径。

(3)循环结构学习使用 for 循环、while 循环和 dowhile 循环,实现重复执行特定的代码段。

例如,计算 1 到 100 的累加和。

(二)数组与字符串1、数组定义一维数组和二维数组,对数组元素进行赋值、访问和操作。

实现数组的遍历、排序等常见算法。

2、字符串学习字符串的存储和操作,使用字符数组和字符串函数(如strlen、strcpy、strcmp 等)处理字符串。

(三)函数1、函数定义与调用定义自己的函数,实现特定的功能,并在主函数中调用这些函数。

通过函数的使用,提高代码的模块化和可重用性。

2、函数参数传递理解值传递和地址传递的区别,掌握如何通过函数参数传递数据,并在函数内部修改外部变量的值。

(四)指针1、指针的概念与基本操作学习指针的定义和使用,通过指针访问变量和数组元素。

编译原理上机报告

编译原理上机报告

《编译原理》课程实验指导书目录序言_______________________________________________________________ 2实验一设计实现简单语言的词法分析器_______________________________ 3实验二设计实现简单语言的语法分析器______________________________ 17序言编译原理实验环节,主要通过对编译器的两个重要模块-词法和语法模块编程调试实现,使学生能应用编译原理的基本理论和方法,学会用C/C++高级程序设计语言设计词法分析器和语法分析器,加深对编译原理理论的分析理解,巩固所学知识,培养和提高学生的动手实践能力。

实验一设计实现简单语言的词法分析器1、实验目的通过该实验,熟练应用编译原理关于词法分析的基本理论和方法;学会用C/C++高级程序设计语言设计一个词法分析器;加深对编译原理理论的分析理解,提高实际操作和解决具体问题的能力。

2、实验条件计算机上安装C/C++编译处理软件。

3、实验内容及要求对下述单词表定义的语言设计编制一个词法分析器。

单词符号及种别表和词法分析器功能及基本要求如下:(2)词法分析器功能及基本要求处理用户提交的符合上述词法的源代码序列,进行词法分析,并输出单词二元组。

4、主要参考步骤(1)画出识别上述语言单词的状态转换图(2)用C/C++语言编写词法分析程序(应考虑能被语法分析程序调用)(3)预处理,去除注释、多余空格、Tab字符、回车换行符等(4)设计若干用例,上机测试并通过所设计实现的词法分析器1.+++-123.456e-127*+45.99e+200++abc+-cnt++492.(+123.456+-456.789e-120)*m2+(a++456)*-c1233.++4+1.44.a+-149+49.7e+127+m1235.x=a++1.27e+186.--20+-124.987e+127+-xyzbegin if(x>=-1.27e-18) xyz=(x1+y1)* -124.987e+1277.--20+-124. e+111-137++569.246e+(123+ivar);x=1;if(x>1) y=1234; x=(123+abc); (本例应有出错信息)5、思考数字的正负号与运算符加减如何处理,识别数字的DFA怎样和运算符加减等融合在一起,进而指导词法分析器的程序编写。

编译原理上机报告

编译原理上机报告

编译原理上机报告编译原理上机报告组员:班级:⼀、上机题⽬:实现⼀个简单的语⾔(Core Programming Language,CPL)的编译器(解释器)(或者其他⾃⼰想完成的编译器)⼆、上机⽬的加深编译原理基础知识的理解:词法分析、语法分析、语法制导翻译等加深相关基础知识的理解:数据结构、操作系统等提⾼编程能⼒锻炼独⽴思考和解决问题的能⼒三、上机要求1、功能要求接收以CPL编写的程序,对其进⾏词法分析、语法分析、语法制导翻译等,然后能够正确的执⾏程序2、验收要求条件:1.完成CPL词法分析器;2.完成CPL语法分析器;3.完成CPL语法制导翻译;⽅法:1.演⽰程序的功能;2.解释程序的源代码;四,基本步骤1.分别配置Parser Generator、Visual C++;2.使⽤Parser Generator创建⼀个⼯程number编写l⽂件mylexer.l;编译mylexer.l,⽣成mylexer.h与mylexer.c;3.安装Parser Generator、Visual C++;4.使⽤VC++创建Win32 Console Application⼯程number配置该项⽬;加⼊mylexer.h与mylexer.c,编译⼯程;执⾏标识符数字识别器;注意:每次修改l⽂件后,需要重新编译l⽂件,再重新编译VC⼯程五、⼯具:编译器:Visual C++,EclipseLex与Yacc:Parser Generator(⽀持C/C++/Java,带实例)或者其他⾃⼰擅长的语⾔和环境六、相关介绍1、Core Programming Language(CPL)数据类型:整型变量(常量),布尔变量(常量)取值范围{…, -2, -1, 0, 1, 2, …}, {true, false}运算表达式:简单的代数运算,布尔运算程序语句:赋值表达式,顺序语句,if-else语句,while语句语⾔特点:简单、易处理如果加⼊浮点数及相应的除操作,那么该语⾔的表达能⼒相当于C, C++,JAVA 等便于关注语⾔实现的本质,⽽不受繁冗细节的⼲扰基本框架:CPL 程序CPLComplier执⾏结果词法分析器语法分析器语义⼦程序C/C++/Java 编译器CPL Compiler(1) ⼿⼯编写(2)⼯具⽣成词法l ⽂件C/C++编译器CPL C语法y ⽂件2、词法分析器⽣成器LexLex 是⼀个词法分析器⽣成器,接受正规式表⽰的词法规则,⽣成识别正规式所描述语⾔的源程序,不同版本的Lex ⽀持不同的⾼级语⾔,如C 、C++、Java 等。

编译原理上机实验报告

编译原理上机实验报告

编译技术上机实验题目实验一一、题目编制C语言子集的词法分析程序二、目的通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

三、要求1.根据具体情况,由同学们自己选取C语言的一个适当大小的子集(可取一类典型单词,也可以尽可能使各种类型的单词都兼顾到),如课本表2.1;在上机前一定要制出相应的表。

2.程序功能输入:字符串。

输出:二元式(种别编码,单词自身)构成的序列。

举例:输入:a=$;#输出:(6,a)(12,=)FOUND ERROR(13,;)#include <iostream>#include <string>using namespace std;string key[6] = {"begin", "if", "then", "while", "do", "end"}; //关键字bool isKey( string str, int &syn) //判断是否为关键字,若是传回相应关键码的种别名{int i;for(i=0; i<6; i++){if(str == key){syn = i + 1;return true;}}return false;}bool isLetter(char c) //是否为字母{if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))return true;else}bool isDigit(char c) //是否为数字{if(c >= '0' && c <= '9')return true;elsereturn false;}void analyse(FILE *fileP){int n;char c;string str = "";while((c = fgetc(fileP)) != EOF){if(c == ' ' || c == '\n' || c == '\t')continue;else if(isDigit(c)) //数字{while(isDigit(c)){str += c;c = fgetc(fileP);}fseek(fileP, -1, SEEK_CUR);cout << "(11, " << str << ")" << endl;str = "";}else if(isLetter(c)) //字母开头的{while(isDigit(c) || isLetter(c)){str += c;c = fgetc(fileP);}fseek(fileP, -1, SEEK_CUR);if(isKey(str, n))cout << "(" << n << ", " << str << ")" << endl; //关键码elsecout << "(10, " << "\'"<< str << "\'" << ")" << endl; //标志符str = "";}{switch(c){case '+':cout << "(13, +)" << endl;break;case '-':cout << "(14, -)" << endl;break;case '*':cout << "(15, *)" << endl;break;case '/':cout << "(16, /)" << endl;break;case ':':{if(c=fgetc(fileP) == '=')cout << "(18, :=)" << endl;else{cout << "(17,编译技术上机实验题目实验一一、题目编制C语言子集的词法分析程序二、目的通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

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

《编译原理》上机实验报告计算机科学与技术班---上机一成员:00813035—吴庆周00813003—祝金辉00813015—闫海滨00718100—特日格乐00813023—王仕华一、题目编写编译程序实现多行表达式的<表达式序列>的文法语言的编译执行二、设计和主要结构1词法分析词法分析子程序分析:词法分析子程序名为getsym,功能是从源程序中读出一个单词符号,把它的信息放入全局变量sym、id和num中,语法分析器需要单词时,直接从这三个变量中获得。

(注意!语法分析器每次用完这三个变量的值就立即调用getsym子程序获取新的单词供下一次使用。

而不是在需要新单词时才调用getsym过程。

)getsym过程通过反复调用getch子过程从源程序过获取字符,并把它们拼成单词。

getch过程中使用了行缓冲区技术以提高程序运行效率。

词法分析器的分析过程:调用getsym时,它通过getch过程从源程序中获得一个字符。

如果这个字符是字母,则继续获取字符或数字,最终可以拼成一个单词,查保留字表,如果查到为保留字,则把sym变量赋成相应的保留字类型值;如果没有查到,则这个单词应是一个用户自定义的标识符(可能是变量名、常量名或是过程的名字),把sym置为SYM_IDENTIFIER,把这个单词存入id变量。

查保留字表时使用了二分法查找以提高效率。

如果getch获得的字符是数字,则继续用getch获取数字,并把它们拼成一个整数,然后把sym置为number,并把拼成的数值放入num变量。

如果识别出其它合法的符号(比如:赋值号、大于号、小于等于号等),则把sym赋成相应的类型。

如果遇到不合法的字符,把sym置成SYM_NULL。

词法分析子程序要完成的工作有:1. 识别一般标识符,此标识符值(字符序列)赋给全局量id,而全局量sym赋值为SYM_IDENTIFIER。

2. 识别数字序列,当前值赋给全局量NUM,sym则置为SYM_NUMBER;3. 识别=,回车之类的特殊符号,全局量sym则分别被赋值为SYM_BECOMES,SYM_CONTINUE等。

4. 在该程序的实现中,我们将标准函数作为保留字使用,即创建四个保留字,分别是sin,cos,tan,exp相关过程(函数)有getsym(),getch(),其中getch()为获取单个字符的过程,除此之外,它还完成:1. 识别且跳过行结束符;2. 产生一份程序列表,输出相应行号或指令计数器的值。

2 语法分析语法分析子程序分析:语法分析子程序采用了自顶向下的递归子程序法,语法分析同时也根据程序的语意生成相应的代码,并提供了出错处理的机制。

语法分析主要由表达式处理过程(expression)、项处理过程(term)、因子处理过程(factor)构成。

这些过程在结构上构成一个嵌套的层次结构。

除此之外,还有出错报告过程(error)、代码生成过程(gen)、测试单词合法性及出错恢复过程(test)、登录名字表过程(enter)、查询名字表函数(position)以及列出类PCODE代码过程(listcode)作过语法分析的辅助过程。

我们采用递归下降的方法来设计编译器。

以下我们给出该语言的FIRST和FOLLOW 集合。

表达式、项、因子处理:根据PL/0语法可知,表达式应该是由正负号或无符号开头、由若干个项以加减号连接而成。

而项是由若干个因子以乘除号连接而成,因子则可能是一个标识符或一个数字,或是一个以括号括起来的子表达式。

根据这样的结构,构造出相应的过程,递归调用就完成了表达式的处理。

把项和因子独立开处理解决了加减号与乘除号的优先级问题。

在这几个过程的反复调用中,始终传递fsys变量的值,保证可以在出错的情况下跳过出错的符号,使分析表达式序列文法为:<表达式序列>-> <表达式> ↙<表达式序列> |<表达式>↙↙<表达式> -> [<变量>=] [+|-]<项>{(+|-)<项>}<项> -> <因子>{(* | /)<因子>}<因子> -> <无符号实数>|<变量>|<标准函数>‘(’<表达式>‘)’|‘(’ <表达式>‘)’<标准函数> -> sin | cos | tan | exp以下是我们给出对表达式序列文法的理解,则:1. 表达式序列为多个表达式的集合.2. 表达式由项组成,或者可以有多个项作加法运算构成3. 项是由因子或者因子作乘法运算构成4. 因子是无符号实数,变量,标准函数,亦或递归表达式的定义处理上叙过程的相关函数有:expression(), term(), factor(),expression_list()等。

3 语义分析4 代码生成 表达式序列编译程序不仅完成通常的词法分析、语法分析,而且还产生中间代码和“目标”代码。

最终我们要“运行”该目标码。

为了使我们的编译程序保持适当简单的水平,不致陷入与本课程无关的实际机器的特有性质的考虑中去,我们假想有台适合表达式序列程序运行的计算机,我们称之为表达式序列处理机。

表达式序列处理机顺序解释生成的目标代码,我们称之为解释程序。

注意:这里的假设与我们的编译概念并不矛盾,在本课程中我们写的只是一个示范性的编译程序,它的后端无法完整地实现,因而只能在一个解释性的环境下予以模拟。

从另一个角度上讲,把解释程序就看成是表达式序列机硬件,把解释执行看成是表达式序列的硬件执行,那么我们所做的工作:由表达式序列源语言程序到表达式序列机器指令的变换,就是一个完整的编译程序。

表达式序列处理机有两类存贮,目标代码放在一个固定的存贮数组code 中,而所需数据组织成一个栈形式存放。

表达式序列处理机的指令集根据表达式序列语言的要求而设计,它包括以下的指令:(1)LIT /* 将常数置于栈顶 */(2)LOD /* 将变量值置于栈顶 */(3)STO /* 将栈顶的值赋与某变量 */(4)INT /* 在数据栈中分配存贮空间 */(5)OPR /* 一组算术运算指令 */(注:对于 OPR 操作,0表示取反操作,1-4表示算术运算,5-8表示标准函数的操作)其中,图1-2 语法分析过程依赖关系 表2-1 表达式序列 处理机指令上表中,程序地址为目标数组code的下标,数据地址为变量在局部存贮中的相对地址。

表达式序列的编译程序为每一条表达式序列源程序的可执行语句生成后缀式目标代码。

如赋值语句X = Y op Z(op为某个运算符),将被翻译成下面的目标代码序列:f、a组装成一条目标指令并存放于code数组中,增加CX的值,CX表示下一条即将生成的目标指令的地址。

5 代码执行为了简单起见,我们假设有一个表达式序列处理机,它能够解释执行表达式序列编译程序所生成的目标代码。

这个表达式序列处理机有一个指令寄存器。

程序(目标代码)存贮称为code,由编译程序装入,在目标代码执行过程中保持不变,因此它可被看成是“只读”存贮器。

数据存贮S组织成为一个栈,所有的算术运算均对栈顶元和次栈顶元进行(一元运算仅作用于栈顶元),并用结果值代替原来的运算对象。

栈顶元的地址(下标)记在栈顶寄存器T中,指令寄存器I 包含着当前正在解释执行的指令,程序地址寄存器P指向下一条将取出的指令。

相关过程: interpret()。

interpret()则完成各种指令的执行工作。

6 错误诊断处理判断单词合法性与出错恢复过程分析:本过程有三个参数,s1、s2为两个符号集合,n为出错代码。

本过程的功能是:测试当前符号(即sym变量中的值)是否在s1集合中,如果不在,就通过调用出错报告过程输出出错代码n,并放弃当前符号,通过词法分析过程获取一下单词,直到这个单词出现在s1或s2集合中为止。

这个过程在实际使用中很灵活,主要有两个用法:在进入某个语法单位时,调用本过程,检查当前符号是否属于该语法单位的开始符号集合。

若不属于,则滤去开始符号和后继符号集合外的所有符号。

在语法单位分析结束时,调用本过程,检查当前符号是否属于调用该语法单位时应有的后继符号集合。

若不属于,则滤去后继符号和开始符号集合外的所有符号。

通过这样的机制,可以在源程序出现错误时,及时跳过出错的部分,保证语法分析可以继续下去。

一个编译程序,在多数情况下,所接受的源程序正文都是有错误的。

发现错误,并给出合适的诊断信息且继续编译下去从而发现更多的错误,对于编译程序而言是完全必要的。

本程序对错误的处理如下一旦发现非法结构,即跳过后面的输入正文,直到下一个可以正确地跟随当前正在分析的句子结构的符号为止。

这意味着每一分析程序需知道其当前活动结点的后继符号集合。

为了找到这个后继符号集合,我们给对应语法图的每一个分析过程提供一个显式参数,set,它指明可能的后继集合。

不过在任何条件下,如果都跳到输入正文中下一个这种后继符号出现的地方,未免太短视了。

程序中所含的错误可能只不过是漏掉了一个符号而己,由此而忽略去源程序的符号集合中,再凑加一些关键字,它们用于标记那些不容忽略的结构的开始符,因此,作为参数传递给分析过程的那些符号就不仅是后继符号了。

对于这样的符号集,我们采用这样的计算策略:先用一些明显的关键符号给它赋初值,然后随着分析的深入,逐步补充别的合法符号。

为了灵活起见,我们引入test子程序来实现所说的验证工作。

test过程有三个参数:1. 可允许的下一个符号集合S1,如果当前符号不在此集合中,当即得到一个错误号;2.另加的停止符号集合S2,有些符号的出现,虽然无疑是错的,但它们绝对不应被忽略而跳过;3.整数n,表示有关错误的诊断号:7 符号表管理为了组成一条指令,编译程序必须知道其操作码及其参数(数或地址)。

这些值是由编译程序本身联系到相应标识符上去的。

这种联系是在处理常数、变量和过程说明完成的。

为此,标识符表应包含每一标识符所联系的属性;如果标识符被说明为常数,其属性值为常数值;如果标识符被说明成变量,其属性就是由层次和修正量(偏移量)组成的地址;如果标识符被说明为过程,其属性就是过程的入口地址及层次。

常数的值由程序正文提供,编译的任务就是确定存放该值的地址。

我们选择顺序分配变量和代码的方法;每遇到一个变量说明,就将数据单元的下标加一(表达式序列机中,每个变量占一个存贮单元)。

开始编译一个过程时,要对数据单元的下标dx赋初值,表示新开辟一个数据区。

dx的初值为0。

相关过程:enter(),该函数用于向符号表添加新的符号,并确定标识符的有关属性。

相关文档
最新文档