山东理工大学编译原理词法分析实验报告

山东理工大学编译原理词法分析实验报告
山东理工大学编译原理词法分析实验报告

实验报告

——词法分析程序设计

【实验项目】

1、了解词法分析的主要任务。

2、熟悉编译程序的编制。

【实验要求】

1、构造一个小语言的文法;

2、设计单词的输出形式,单词的种类和值的表示方法;

3、编写词法分析程序cffx.c;

4、生成并输出单词符号表。

【实验内容】

根据某文法,构造一个基本词法分析程序。找出该语言的关键字、标识符、整数以及其他一些特殊符号,给出单词表(内容包括单词种类和值),构造符号表(内容包括name、kind、value和address等)。

【实验步骤】

1.类C语言子集的文法

G[<程序>]:

<程序>→<分程序>

<分程序>→<程序首部>{<程序体>}

<程序首部>→program<标识符>:

<程序体>→<语句序列>

<语句序列>→<语句序列>;<语句>|<语句>

<标识符>→<字母>|<标识符><字母>|<标识符><数字>

<语句>→<定义语句>|<输入语句>|<复合语句>|<输出语句>

<类型>→int|double|llint|lldouble

<定义表>→<标识符>|<标识符>,<定义表>

<定义语句>→<类型><定义表>

<输入语句>→scanf(<类型>,<标识符>)

<复合语句>→<赋值语句>|<循环语句>|<条件语句>

<输出语句>→printf(<类型>,<标识符>)

<赋值语句>→<标识符>=<表达式>

<循环语句>→|

→for(<表达式>;<表达式>;<表达式>){<语句>|<表达式>}→while(<表达式>){<语句>|<表达式>}

<条件语句>→if(<表达式>){<语句>|<表达式>}else{<语句>|<表达式>}

<表达式>→<因式><运算符><因式>|<因式><运算符>;

<运算符>→=|==|#|<|<=|>|>=|++|--|+|-|*|/|%

<因式>→(<表达式>)|<标识符>|<数字>|<数字><数字>

<字母>→a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z

<数字>→0|1|2|3|4|5|6|7|8|9

2.单词分类

1、keyword(关键字):program|int|double|llint|lldouble|scanf |printf|for|while|if|else

2、identification(标识符):a|b|c|……

3、digit(数据):0|1|2|3|4|……

4、operatorsign(运算符):=|==|#|<|<=|>|>=|++|--|+|-|*|/|%

5、boundarysign(界符):{}|()|:|;|,

3.词法分析源程序

/**********************头文件**********************/

#include

#include

#include

#include

/*********************全局变量*********************/

char word[20];/*暂存单词*/

char test[500],*p;

int count=1;

char

Keyword[11][10]={"program","int","double","llint","lldouble","scanf","printf","for","while","if" ,"else"};//关键字数组

char Operatorsign[14][10]={"=","==","#","<","<=",">",">=","++","--","+","-","*","/","%"};//运算符数组

/*****************函数1:关键字、标识符识别****************/

char alpha()

{

int i=0,j=0;/*j=0是标识符,j=1是关键字*/

char*opp;

while(isalnum(*p))/*检查是字母还是数字,如果是字母返回1,是数字返回2*/

{

word[i]=*p;

p++;i++;

}

opp=word;

for(i=0;i<11;i++)/*把字母与关键字表核对,如果是关键字就设置j=1*/

{

if(!(strcmp(opp,Keyword[i])))/*比较两个字符串*/

{

printf("%d Keyword%s\n",count,opp);/*识别关键字*/

j=1;

}

}

if(j==0)printf("%d Identification%s\n",count,opp);/*识别标识符*/

p--;/*回退多读进的字符*/

return0;

}

/*****************函数2:数据识别******************/

char digit()

{

int i=0;

while(isdigit(*p))/*如果是数字,返回1,否则返回0*/

{

word[i]=*p;

i++;p++;

}

printf("%d Digit%s\n",count,word);

p--;/*回退多读进的字符*/

return0;

}

/*****************函数3:运算符识别******************/

char operatorsign()

{

int i=0;

char*opp;

while(!isalnum(*p))/*检查是否是符号*/

{

if(*p=='{'||*p=='}'||*p=='('||*p==')'||*p==':'||*p==';'||*p==',')break;

word[i]=*p;

p++;i++;

}

opp=word;

for(i=0;i<14;i++)/*把符号与运算符核对*/

{

if(!(strcmp(opp,Operatorsign[i])))/*比较两个字符串*/

{

printf("%d Operatorsign%s\n",count,opp);/*识别运算符*/

}

}

p--;/*回退多读进的字符*/

return0;

}

/*********************主函数***********************/

int main()

{

int i,k=0;

memset(test,0,500);/*把test所指内存区域的前500个字节设置成字符0*/

strcpy(test,"program a:\n{\n int i=10,j=0;\n if(i>=1)\n{\n j=i+2;\n}\n else\n{\n j++;\n}\n}\n");

printf("The test program is:\n");

puts(test);

p=test;

while(*p!='\0')/*检查源程序是否结束*/

{

memset(word,0,20);

while(*p==''||*p=='\n'||*p=='\t')p++;/*检查是否是空白字符,如果是直接跳过*/

if(isalpha(*p))/*识别关键字或标识符*/

{

alpha();

}

if(isdigit(*p))/*识别整数*/

{

digit();

}

if(*p=='{'||*p=='}'||*p=='('||*p==')'||*p==':'||*p==';'||*p==',')/*识别界符*/

{

printf("%d Boundarysign%c\n",count,*p);

}

if(*p=='='||*p=='#'||*p=='<'||*p=='>'||*p=='+'||*p=='-'||*p=='*'||*p=='/'||*p=='%')/*识别运算符*/

{

operatorsign();

}

count=count+1;/*准备识别下一个单词*/

p++;

}

getch();

return0;

}

4.程序运行结果

5.流程图

6.状态转换图

【实验分析】

通过本次实验,我更加清晰透彻的了解词法分析程序的工作原理,也对编译原理这门课程有了进一步的理解与体会。最重要的是,从这次实验中,我的动手实践能力得到了极大的提高,更加熟练的掌握了Microsoft Office的运用,也更加熟练了的掌握了Visio的使用方法,当时,实验也促使我进一步加深巩固了对各种编程软件的运用。

实验过程不仅让我体验到了成长,更让我体会到了不足,我尤其意识到我对状态转换图的理解还不够深刻,也意识到我的编程能力还有待提高。

弦振动实验报告

弦振动的研究 一、实验目的 1、观察固定均匀弦振动共振干涉形成驻波时的波形,加深驻波的认识。 2、了解固定弦振动固有频率与弦线的线密ρ、弦长L和弦的张力Τ的关系, 并进行测量。 三、 波,沿X轴负方向传播的波为反射波,取它们振动位相始终相同的点作坐标原点“O”,且在X=0处,振动质点向上达最大位移时开始计时,则它们的波动方程

分别为: Y1=Acos2π(ft-x/ λ) Y2=Acos[2π (ft+x/λ)+ π] 式中A为简谐波的振幅,f为频率,λ为波长,X为弦线上质点的坐标位置。两波叠加后的合成波为驻波,其方程为: Y1+Y2=2Acos[2π(x/ λ)+π/2]Acos2πft ① 由此可见,入射波与反射波合成后,弦上各点都在以同一频率作简谐振动,它们的振幅为|2A cos[2π(x/ λ)+π/2] |,与时间无关t,只与质点的位置x有关。 由于波节处振幅为零,即:|cos[2π(x/ λ)+π/2] |=0 2π(x/ λ)+π/2=(2k+1) π/ 2 ( k=0. 2. 3. … ) 可得波节的位置为: x=kλ /2 ② 而相邻两波节之间的距离为: x k+1-x k =(k+1)λ/2-kλ / 2=λ / 2 ③ 又因为波腹处的质点振幅为最大,即|cos[2π(x/ λ)+π/2] | =1 2π(x/ λ)+π/2 =kπ( k=0. 1. 2. 3. ) 可得波腹的位置为: x=(2k-1)λ/4 ④ 这样相邻的波腹间的距离也是半个波长。因此,在驻波实验中,只要测得相邻两波节或相邻两波腹间的距离,就能确定该波的波长。 在本实验中,由于固定弦的两端是由劈尖支撑的,故两端点称为波节,所以,只有当弦线的两个固定端之间的距离(弦长)等于半波长的整数倍时,才能形成驻波,这就是均匀弦振动产生驻波的条件,其数学表达式为: L=nλ/ 2 ( n=1. 2. 3. … ) 由此可得沿弦线传播的横波波长为: λ=2L / n ⑤ 式中n为弦线上驻波的段数,即半波数。 根据波速、频率及波长的普遍关系式:V=λf,将⑤式代入可得弦线上横波的

编译原理实验--词法分析器

编译原理实验--词法分析器 实验一词法分析器设计 【实验目的】 1(熟悉词法分析的基本原理,词法分析的过程以及词法分析中要注意的问题。 2(复习高级语言,进一步加强用高级语言来解决实际问题的能力。 3(通过完成词法分析程序,了解词法分析的过程。 【实验内容】 用C语言编写一个PL/0词法分析器,为语法语义分析提供单词,使之能把输入的字符 串形式的源程序分割成一个个单词符号传递给语法语义分析,并把分析结果(基本字, 运算符,标识符,常数以及界符)输出。 【实验流程图】

【实验步骤】 1(提取pl/0文件中基本字的源代码 while((ch=fgetc(stream))!='.') { int k=-1; char a[SIZE]; int s=0; while(ch>='a' && ch<='z'||ch>='A' && ch<='Z') { if(ch>='A' && ch<='Z') ch+=32; a[++k]=(char)ch; ch=fgetc(stream); } for(int m=0;m<=12&&k!=-1;m++) for(int n=0;n<=k;n++) {

if(a[n]==wsym[m][n]) ++s; else s=0; if(s==(strlen(wsym[m]))) {printf("%s\t",wsym[m]);m=14;n=k+1;} } 2(提取pl/0文件中标识符的源代码 while((ch=fgetc(stream))!='.') { int k=-1; char a[SIZE]=" "; int s=0; while(ch>='a' && ch<='z'||ch>='A' && ch<='Z') { if(ch>='A' && ch<='Z') ch+=32; a[++k]=(char)ch; ch=fgetc(stream); } for(int m=0;m<=12&&k!=-1;m++) for(int n=0;n<=k;n++) { if(a[n]==wsym[m][n]) ++s; else s=0; if(s==(strlen(wsym[m]))) {m=14;n=k+1;} } if(m==13) for(m=0;a[m]!=NULL;m++) printf("%c ",a[m]);

编译原理实验报告实验一编写词法分析程序

编译原理实验报告实验名称:实验一编写词法分析程序 实验类型:验证型实验 指导教师:何中胜 专业班级:13软件四 姓名:丁越 学号: 电子邮箱: 实验地点:秋白楼B720 实验成绩: 日期:2016年3 月18 日

一、实验目的 通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析 程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的实践能力。通过本实验,应达到以下目标: 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、实验过程 以编写PASCAL子集的词法分析程序为例 1.理论部分 (1)主程序设计考虑 主程序的说明部分为各种表格和变量安排空间。 数组 k为关键字表,每个数组元素存放一个关键字。采用定长的方式,较短的关键字 后面补空格。 P数组存放分界符。为了简单起见,分界符、算术运算符和关系运算符都放在 p表中 (编程时,还应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。 id和ci数组分别存放标识符和常数。 instring数组为输入源程序的单词缓存。 outtoken记录为输出内部表示缓存。 还有一些为造表填表设置的变量。 主程序开始后,先以人工方式输入关键字,造 k表;再输入分界符等造p表。 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上 送来的一个单词;调用词法分析过程;输出每个单词的内部码。 ⑵词法分析过程考虑 将词法分析程序设计成独立一遍扫描源程序的结构。其流程图见图1-1。 图1-1 该过程取名为 lexical,它根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号:以字符 k表示关键字;i表示标识符;c表示常数;p表示分界符;s表示运算符(编程时类号分别为 1,2,3,4,5)。 对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有 该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id中,将常数 变为二进制形式存入数组中 ci中,并记录其在表中的位置。 lexical过程中嵌有两个小过程:一个名为getchar,其功能为从instring中按顺序取出一个字符,并将其指针pint加1;另一个名为error,当出现错误时,调用这个过程, 输出错误编号。 2.实践部分

编译原理实验词法分析实验报告

编译技术实验报告 实验题目:词法分析 学院:信息学院 专业:计算机科学与技术学号: 姓名:

一、实验目的 (1)理解词法分析的功能; (2)理解词法分析的实现方法; 二、实验内容 PL0的文法如下 …< >?为非终结符。 …::=? 该符号的左部由右部定义,可读作“定义为”。 …|? 表示…或?,为左部可由多个右部定义。 …{ }? 表示花括号内的语法成分可以重复。在不加上下界时可重复0到任意次 数,有上下界时可重复次数的限制。 …[ ]? 表示方括号内的成分为任选项。 …( )? 表示圆括号内的成分优先。 上述符号为“元符号”,文法用上述符号作为文法符号时需要用引号…?括起。 〈程序〉∷=〈分程序〉. 〈分程序〉∷= [〈变量说明部分〉][〈过程说明部分〉]〈语句〉 〈变量说明部分〉∷=V AR〈标识符〉{,〈标识符〉}:INTEGER; 〈无符号整数〉∷=〈数字〉{〈数字〉} 〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉} 〈过程说明部分〉∷=〈过程首部〉〈分程序〉{;〈过程说明部分〉}; 〈过程首部〉∷=PROCEDURE〈标识符〉; 〈语句〉∷=〈赋值语句〉|〈条件语句〉|〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉 〈赋值语句〉∷=〈标识符〉∶=〈表达式〉 〈复合语句〉∷=BEGIN〈语句〉{;〈语句〉}END 〈条件〉∷=〈表达式〉〈关系运算符〉〈表达式〉 〈表达式〉∷=〈项〉{〈加法运算符〉〈项〉} 〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉} 〈因子〉∷=〈标识符〉|〈无符号整数〉|'('〈表达式〉')' 〈加法运算符〉∷=+|- 〈乘法运算符〉∷=* 〈关系运算符〉∷=<>|=|<|<=|>|>= 〈条件语句〉∷=IF〈条件〉THEN〈语句〉 〈字母〉∷=a|b|…|X|Y|Z 〈数字〉∷=0|1|2|…|8|9 实现PL0的词法分析

实验1-3-《编译原理》词法分析程序设计方案

实验1-3 《编译原理》S语言词法分析程序设计方案 一、实验目的 了解词法分析程序的两种设计方法之一:根据状态转换图直接编程的方式; 二、实验内容 1.根据状态转换图直接编程 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件 (3)删除注释、空格和无用符号 (4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。 (5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。 标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址 注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。 常量表结构:常量名,常量值 三、实验要求 1.能对任何S语言源程序进行分析 在运行词法分析程序时,应该用问答形式输入要被分析的S源语言程序的文件名,然后对该程序完成词法分析任务。 2.能检查并处理某些词法分析错误 词法分析程序能给出的错误信息包括:总的出错个数,每个错误所在的行号,错误的编号及错误信息。 本实验要求处理以下两种错误(编号分别为1,2): 1:非法字符:单词表中不存在的字符处理为非法字符,处理方式是删除该字符,给出错误信息,“某某字符非法”。 2:源程序文件结束而注释未结束。注释格式为:/* …… */ 四、保留字和特殊符号表

编译原理实验词法分析语法分析

本代码只供学习参考: 词法分析源代码: #include #include #include using namespace std; string key[8]={"do","end","for","if","printf","scanf","then","while"}; string optr[4]={"+","-","*","/"}; string separator[6]={",",";","{","}","(",")"}; char ch; //判断是否为保留字 bool IsKey(string ss) { int i; for(i=0;i<8;i++) if(!strcmp(key[i].c_str(),ss.c_str())) return true; return false; } //字母判断函数 bool IsLetter(char c) { if(((c>='a')&&(c<='z'))||((c>='A')&&(c<='Z'))) return true; return false; } //数字判断函数 bool IsDigit(char c) { if(c>='0'&&c<='9') return true; return false; } //运算符判断函数 bool IsOptr(string ss) { int i; for(i=0;i<4;i++) if(!strcmp(optr[i].c_str(),ss.c_str())) return true ; return false; } //分界符判断函数 bool IsSeparator(string ss) { int i; for(i=0;i<6;i++) if(!strcmp(separator[i].c_str(),ss.c_str()))

信息工程专业介绍

信息工程专业介绍: 1.专业简介:信息技术是衡量一个国家现代化水平的重要标志,我国把信息技术列为21世纪发展战略计划的首位。信息工程是一门研究信息的产生、获取、传输、存储和显示技术的学科。信息工程专业培养在信息工程,重点是光电信息工程领域具有宽厚的理论基础、扎实的专业知识和熟练的实验技能的高级信息工程科技人才。毕业生将在光电信号的采集、传输、处理、存储和显示的科学研究、工程设计、技术开发和企业管理中展示才华。 2.主修课程:光电信息物理基础、光电子学、信号与系统、通信原理、图像处理、传感器原理技术、光电检测技术、自动控制理论、光纤通信、计算机通讯网络、工程光学、微机原理、计算机软件技术基础、计算机网络技术、计算机辅助设计、数字与模拟电子技术基础、电路基础以及有关数理基础和工程基础方面的课程。 3.毕业去向:本专业历年输送了大量优秀毕业生攻读硕士、博士学位。除此之外,主要为科研单位、高等院校、电信部门、信息产业部门、企事业单位及有关公司录用,从事光电信息工程与技术、通信工程与技术、光电信号检测、处理及控制技术等领域的研究、设计、开发应用和管理等工作。 电子信息工程专业 业务培养目标: 业务培养目标:本专业培养具备电子技术和信息系统的基础知识,能从事各类电子设备和信息系统的研究、设计、制造、应用和开发的高等工程技术人才。 业务培养要求:本专业是一个电子和信息工程方面的较宽口径专业。本专业学生主要学习信号的获取与处理、电厂设备信息系统等方面的专业知识,受到电子与信息工程实践的基本训练,具备设计、开发、应用和集成电子设备和信息系统的基本能力。 电子信息工程已经涵盖很广的范围。电话交换局里怎样处理各种电话信号,手机是怎样传递我们的声音甚至图象,我们周围的网络怎么样传递数据,甚至信息化时代军队的信息传递中如何保密等知识。我们通过一些基础知识的学习认识这些东西,并能够进行维护和更先进的技术和新产品的开发。 你首先要有扎实的数学知识,要学习许多电路知识,电子技术,信号与系统,计算机控制原理,信号与系统,通信原理等基本课程。自己还要动手设计、连接一些电路以及结合计算机的实验。譬如自己连接传感器的电路,用计算机自己设置小的通信系统,还会参观一些大的公司的电子和信息处理设备,对整体进行了解,理解手机信号、有线电视是如何传输的等,并能有机会在老师指导下参与大的工程的设计。 随着计算机和互联网日益深入到社会生活的多个层面,社会需求量相当大。现在是一个热门专业。 毕业后干什么——从事电子设备和信息系统的设计、应用开发以及技术管理等 随着社会信息化的深入,各行业大都需要本专业人才,而且薪金很高。可成为: 电子工程师——设计开发一些电子,通信器件,起薪一般2000元——6000元/月; 项目主管—策划一些大的系统,经验、知识要求很高,起薪一般4000元/月以上; 还可以继续进修成为教师,进行科研项目等 专业是个好专业:适用面比较宽,和计算机、通信、电子都有交叉;但是这行偏电,因此动手能力很重要;另外,最好能是本科,现在专科找工作太难了!当然大虾除外 本专业对数学和英语要求不低,学起来比较郁闷要拿高薪,英语是必需的; 吃技术这碗饭,动手能力和数学是基本功当然,也不要求你成为数学家,只要能看懂公式就可以了,比如微积分和概率统计公式,至少知道是在说些什么而线性代数要求就高一些,因为任何书在讲一个算法时,最后都会把算法化为矩阵计算(这样就能编程实现了,而现代的电子工程相当一部分工作都是编程) 对于动手能力,低年级最好能焊接装配一些小电路,加强对模拟、数字、高频电路(这三门可是电子线路的核心)的感性认识;工具吗就找最便宜的吧!电烙铁、万用表是必需的,如果有钱可以买个二手示波器电路图吗,无线电杂志上经常刊登,无线电爱好者的入门书对实际操作很有好处

编译原理实验报告2词法分析程序的设计

实验2 词法分析程序的设计 一、实验目的 掌握计算机语言的词法分析程序的开发方法。 二、实验内容 编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。 三、实验要求 1、根据以下的正规式,编制正规文法,画出状态图; 标识符<字母>(<字母>|<数字字符>)* 十进制整数0 | ((1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*) 八进制整数0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* 十六进制整数0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* 运算符和界符+ - * / > < = ( ) ; 关键字if then else while do 2、根据状态图,设计词法分析函数int scan( ),完成以下功能: 1)从文本文件中读入测试源代码,根据状态转换图,分析出一个单词, 2)以二元式形式输出单词<单词种类,单词属性> 其中单词种类用整数表示: 0:标识符 1:十进制整数 2:八进制整数 3:十六进制整数 运算符和界符,关键字采用一字一符,不编码 其中单词属性表示如下: 标识符,整数由于采用一类一符,属性用单词表示 运算符和界符,关键字采用一字一符,属性为空 3、编写测试程序,反复调用函数scan( ),输出单词种别和属性。 四、实验环境 PC微机 DOS操作系统或Windows 操作系统 Turbo C 程序集成环境或Visual C++ 程序集成环境 五、实验步骤 1、根据正规式,画出状态转换图;

编译原理实验报告(词法分析器语法分析器)

编译原理实验报告

实验一 一、实验名称:词法分析器的设计 二、实验目的:1,词法分析器能够识别简单语言的单词符号 2,识别出并输出简单语言的基本字.标示符.无符号整数.运算符.和界符。 三、实验要求:给出一个简单语言单词符号的种别编码词法分析器 四、实验原理: 1、词法分析程序的算法思想 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 2、程序流程图 (1 (2)扫描子程序

3

五、实验内容: 1、实验分析 编写程序时,先定义几个全局变量a[]、token[](均为字符串数组),c,s( char型),i,j,k(int型),a[]用来存放输入的字符串,token[]另一个则用来帮助识别单词符号,s用来表示正在分析的字符。字符串输入之后,逐个分析输入字符,判断其是否‘#’,若是表示字符串输入分析完毕,结束分析程序,若否则通过int digit(char c)、int letter(char c)判断其是数字,字符还是算术符,分别为用以判断数字或字符的情况,算术符的判断可以在switch语句中进行,还要通过函数int lookup(char token[])来判断标识符和保留字。 2 实验词法分析器源程序: #include #include #include int i,j,k; char c,s,a[20],token[20]={'0'}; int letter(char s){ if((s>=97)&&(s<=122)) return(1); else return(0); } int digit(char s){ if((s>=48)&&(s<=57)) return(1); else return(0); } void get(){ s=a[i]; i=i+1; } void retract(){ i=i-1; } int lookup(char token[20]){ if(strcmp(token,"while")==0) return(1); else if(strcmp(token,"if")==0) return(2); else if(strcmp(token,"else")==0) return(3); else if(strcmp(token,"switch")==0) return(4); else if(strcmp(token,"case")==0) return(5); else return(0); } void main() { printf("please input string :\n"); i=0; do{i=i+1; scanf("%c",&a[i]);

山东理工 拖拉机构造复习题资料

复习题 拖拉机汽车学(上册) 第一章内燃机基本构造与原理 1.发动机、内燃机、外燃机的概念 2.内燃机的各种分类方法:汽缸数分:单缸内燃机、多缸内燃机 3.内燃机的总体构成:两大机构、五大系统,每个机构系统的功能 4.内燃机的基本术语:上止点、下止点、活塞行程。燃烧室容积、汽缸工作容积、汽缸总 容积、压缩比、内燃机排量 5.单缸四行程柴油机的工作原理、单缸四行程汽油机的工作原理 6.四行程柴油机与四行程汽油机的不同 第二章机体组与曲柄连杆机构 1. 机体组的组成及功用 2. 曲柄连杆机构的组成:活塞组、连杆组、曲轴飞轮组 曲柄连杆机构的功能 3. 活塞的组成,功能,能够标出活塞结构图上各个部分的名称及其各个部分的功能 4. 矩形气环的泵油作用及其危害 5. 连杆组从组成及其功能 6. 曲轴飞轮组的组成及其各部分的功能 第三章内燃机换气系统 1. 换气系统的构成及功用 2. 配气机构的功用及类型 3. 配气机构的组成:气门组、气门传动组 4. 气门间隙与配气相位的概念、气门叠开角概念,进排气门为什么应提前打开和延迟关闭?气门间隙的功用、气门间隙过大或过小对内燃机性能有什么影响? 第四章柴油机燃油供给系统 1. 柴油机燃油供给系统组成:主要部件:喷油泵、喷油器、调速器 辅助装置:柴油箱、输油泵、柴油滤清器、高低压油管 2. 柴油机供给系统功用 3. 柴油机燃烧室的分类,直喷式燃烧室的组成。 4. 分隔式燃烧室组成。 5.喷油器的功用,孔式喷油器和轴针式喷油器的特点 6. 喷油泵的功用,柱塞式喷油泵的工作原理及组成(图)。

功能 机械式调速器:组成转速感应元件调整供油拉杆位置的执行机构 单程式调速器的工作原理:—————————————— 第五章汽油机燃油供给系统 1. 功用: 便与一定数量的空气混合形成可燃混合气。 组成:可燃混合气配气装置油箱汽油滤清器汽油泵油水分离器油管燃油表 2.化油器的基本构造。实用化油器主要包括哪些装置。 基本构造:包括浮子室、喷管、喉管、节气门四个主要部分 实用化油器:除了上述基本构成外部分外,为了满足汽油机各种工况对混合气成分的不同要求,设有一系列自动调配混合气浓度上的装置,主要包括主供油装置、大负荷加浓装置、启动装置、怠速装置、加速装置。 第六章内燃机润滑系统第七章内燃机冷却系统 1. 润滑系统的主要功用、内燃机常用的几种润滑方式 功用:润滑清洗冷却密封防锈液压缓冲 润滑方式:压力润滑飞溅润滑油雾润滑定期润滑 2.润滑系统的构成及其各部分的功能 润滑系统主要由储油装置、泵油装置、滤清装置、检示装置、安全装置和散热装置等组成。储油装置:油底壳及其放油螺塞,其容量除了要满足润滑系统工作时的最大循环油量的要求,还应考虑机油自然散热的要求。 泵油装置:主要有机油泵、油管和集滤器等。机油泵通过油管将油底壳中的机油吸入,加压并送入滤清装置,使机油在内燃机内循环流动。 滤清装置:包括集滤器和机油滤清器。用来滤除机油中的各种杂质,保证润滑油的清洁。检示装置:包括机油压力表和机油温度表、机油标尺等。用来指示润滑系统的工作状况。安全装置:包括限压阀、回油阀和旁通阀。 散热装置:包括机油散热器及油管、转换开关等。用于对机油进行强制冷却,以保持机油在适宜的温度范围内工作。 3.润滑油路中的限压阀、回油阀和旁通阀的作用,齿轮式机油泵的工作原理 限压阀:安装在机油泵的出油道上,用来限制系统的高压力,保证机油泵压力既要克服滤清器及管路、油道的阻力,满足机体主油道内机油压力的要求,防止系统压力过高而使油管破裂。密封件损坏,以及机油泵过载。 回油阀:安装在主油道中,防止主油道压力过高。当主油道压力超过限定值时,回油阀开启,使多余机油流回油底壳。 旁通阀:安装在机油滤清器上并与滤芯并联。当机油滤清器被杂质堵塞、油路不畅时,在滤清器的前后油路间产生压力差。当压力差达到一定数值时,旁通阀开启,使机油不经过滤清

编译原理词法分析实验报告

词法分析器实验报告 一、实验目的 选择一种编程语言实现简单的词法分析程序,设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 二、实验要求 待分析的简单的词法 (1)关键字: begin if then while do end 所有的关键字都是小写。 (2)运算符和界符 : = + - * / < <= <> > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义: ID = letter (letter | digit)* NUM = digit digit* (4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。 各种单词符号对应的种别码: 表各种单词符号对应的种别码 词法分析程序的功能: 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。 例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列: (1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)…… 三、词法分析程序的算法思想: 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根

据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 主程序示意图: 主程序示意图如图3-1所示。其中初始包括以下两个方面: ⑴关键字表的初值。 关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下: Char *rwtab[6] = {“begin”, “if”, “then”, “while”, “do”, “end”,}; 图3-1 (2)程序中需要用到的主要变量为syn,token和sum 扫描子程序的算法思想: 首先设置3个变量:①token用来存放构成单词符号的字符串;②sum用来整型单词;③syn 用来存放单词符号的种别码。扫描子程序主要部分流程如图3-2所示。

编译原理实验 词法分析&语法分析程序

编译原理实验 词 法 分 析 程 序

实验一:词法分析程序 1、实验目的 从左至右逐个字符的对源程序进行扫描,产生一个个单词符号,把字符串形式的源程序改造成单词符号形式的中间程序。 2、实验内容 表C语言子集的单词符号及内码值 单词符号种别编码助记符内码值 while 1 while -- if 2 if -- else 3 else -- switch 4 switch -- case 5 case -- 标识符 6 id id在符号表中的位置 常数7 num num在常数表中的位置 + 8 + -- - 9 - -- * 10 * -- <= 11 relop LE < 11 relop LT == 11 relop LQ = 12 = -- ; 13 ; -- 输入源程序如下 if a==1 a=a+1; else a=a+2; 输出对应的单词符号形式的中间程序 3、实验过程 实验上机程序如下: #include "stdio.h" #include "string.h" int i,j,k; char s ,a[20],token[20]; int letter() { if((s>=97)&&(s<=122))return 1; else return 0; } int Digit() {if((s>=48)&&(s<=57))return 1;

else return 0; } void get() { s=a[i]; i=i+1; } void retract() {i=i-1;} int lookup() { if(strcmp(token, "while")==0) return 1; else if(strcmp(token, "if")==0) return 2; else if(strcmp(token,"else")==0) return 3; else if(strcmp(token,"switch")==0) return 4; else if(strcmp(token,"case")==0) return 5; else return 0; } void main() { printf("please input you source program,end('#'):\n"); i=0; do { i=i+1; scanf("%c",&a[i]); }while(a[i]!='#'); i=1; memset(token,0,sizeof(char)*10); j=0; get(); while(s!='#') { if(s==' '||s==10||s==13) get(); else { switch(s)

数据结构课程设计-银行业务模拟系统

山东理工大学计算机学院课程设计 (数据结构) 班级计升1001班 姓名 学号1022051029 指导教师 二○一一年一月二十日

课程设计任务书及成绩评定 课题名称银行业务模拟系统 Ⅰ、题目的目的和要求: 1、设计目的 巩固和加深对数据结构的理解,通过上机实验、调试程序,加深对课本知识的理解,最终使学生能够熟练应用数据结构的知识写程序。 (1)通过本课程的学习,能熟练掌握几种基本数据结构的基本操作。 (2)能针对给定题目,选择相应的数据结构,分析并设计算法,进而给出问题的正确求解过程并编写代码实现。 2、设计题目要求: 1. 客户业务分为两种:第一种是申请从银行得到一笔资金,即取款或借款;第二种是向银行投入一笔资金,即存款或还款。 2. 银行有两个服务窗口,相应地有两个队列。客户到达银行后先排第一个队。处理每个客户业务时,如果属于第一种,且申请额超出银行现存资金总额而得不到满足时,则立即排入第二个队等候,直至满足时才离开银行,否则业务处理完后立即离开银行。 3. 每接待完一个第二种业务的客户,则顺序检查和处理第二个队列中的客户,对能满足的申请者予以满足,不能满足者重新排到第二个队列的队尾。 4.假设检查不需要时间,在此检查过程中,一旦银行资金总额少于或等于刚才第一个队列中最后一个客户(第二种业务)被接待之前的数额,或者本次已将第二个队列检查或处理了一遍,就停止检查(因为此时已不可能还有满足者),转而继续接待第一个队列的客户。 5. 任何时刻都只开一个窗口,营业时间结束时所有客户立即离开银行。通过模拟方法求出客户在银行内逗留的平均时间。

Ⅱ、设计进度及完成情况 Ⅲ、主要参考文献及资料 [1] 严蔚敏数据结构(C语言版)清华大学出版社 1999 [2] 严蔚敏数据结构题集(C语言版)清华大学出版社 1999 [3] 谭浩强 C语言程序设计清华大学出版社 [4] 与所用编程环境相配套的C语言或C++相关的资料

东南大学编译原理词法分析器实验报告

词法分析设计 1. 实验目的 通过本实验的编程实践,了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。 2. 实验内容 用C++语言实现对C++语言子集的源程序进行词法分析。通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示;同时进行标识符登记符号表的管理。 3. 实验原理 本次实验采用NFA->DFA->DFA0的过程: 对待分析的简单的词法(关键词/id/num/运算符/空白符等)先分别建立自己的FA,然后将他们用产生式连接起来并设置一个唯一的开始符,终结符不合并。 待分析的简单的词法 (1)关键字: "asm","auto","bool","break","case","catch","char","class","

const","const_cast"等 (2)界符(查表) ";",",","(",")","[","]","{","}" (3)运算符 "*","/","%","+","-","<<","=",">>","&","^","|","++","--"," +=","-=","*=","/=","%=","&=","^=","|=" relop: (4)其他单词是标识符(ID)和整型常数(SUM),通过正规式定义。 id/keywords: digit: (5)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。

大学物理实验报告复摆法测重力加速度

山东理工大学物理实验报告 实验名称: 复摆法侧重力加速度 姓名:李 明 学号:05 1612 时间代码:110278 实验序号:19 院系: 车辆工程系 专业: 车辆工程 级.班: 2 教师签名: 仪器与用具:复摆、秒表。复摆,一块有刻度的匀质钢板,板面上从中心向两侧对称的开一些悬孔。 另有一固定刀刃架用以悬挂钢板。调节刀刃水平螺丝,调节刀刃水平。 实验目的:①了解复摆小角摆动周期与回转轴到复摆重心距离的关系。②测量重力加速度。 实验报告内容(原理预习、操作步骤、数据处理、误差分析、思考题解答) [实验原理] 一个围绕定轴摆动的刚体就是复摆。当复摆的摆动角θ很小时,复摆的振动可视为角谐振动。根据转动定律有 22dt d J J mgb θ βθ-=-= 即 02 2=+θθJ m gb dt d 可知其振动角频率 J mgb = ω 角谐振动的周期为 mgb J T π 2= (3.3.10) 式中J 为复摆对回转轴的转动惯量;m 为复摆的质量;b 为复摆重心至回转轴的距离;g 为重力加速度。如果用Jc 表示复摆对过质心轴的转动惯量,根据平行轴定理有 2mb Jc J += (3.3.11) 将式(3.3.11)代入式(3.3.10)得 mgb mb Jc T 2 2+=π (3.3.12) 以b 为横坐标,T 为纵坐标,根据实验测得b 、T 数据,绘制以质心为原点的T-b 图线,如图3.3.3所示。左边一条曲线为复摆倒挂时的b T '-'曲线。过T 轴上1T T =点作b 轴的平行线交两条曲线于点A 、B 、C 、D 。则与这4''''

设1b A O =',2b B O =',1 b C O '=',2b D O '=',则有 1 2112 1 122b m g b m Jc m gb m b Jc T ''+=+=ππ 或 2 22 22 2122b m g b m Jc m gb m b Jc T ''+=+=ππ 消去Jc ,得 g b b g b b T 2 2 11122'+='+=ππ (3.3.13) 将式(3.3.13)与单摆周期公式相比较 ,可知与复摆周期相同的单摆的摆长 1 1b b l '+=或 22b b l '+=,故称1 1b b '+(或22b b '+)为复摆的等值摆长。因此只要测得正悬和倒悬的T-b 曲线,即可通过作b 轴的平行线,求出周期T 及与之相应的1 1b b '+或22b b '+,再由式(3.3.13)求重力加速度g 值。 [实验内容] (1) 将复摆一端第一个悬孔装在摆架的刀刃上,调解调节螺丝,使刀刃水平,摆体竖直。 (2) 在摆角很小时(θ

编译原理实验-词法分析器的设计与实现.docx

南华大学 计算机科学与技术学院实验报告 (2018~2019学年度第二学期) 课程名称编译原理 实验名称词法分析器的设计与 实现 姓名学号 专业班级 地点教师

1.实验目的及要求 实验目的 加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。 实验要求 1.对单词的构词规则有明确的定义; 2.编写的分析程序能够正确识别源程序中的单词符号; 3.识别出的单词以<种别码,值>的形式保存在符号表中,正确设计和维护 符号表; 4.对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误 提示,保证顺利完成整个源程序的词法分析; 2.实验步骤 1.词法分析规则 <标识符>::=<字母>|<标识符><字母>|<标识符><数字> <常数>::=<数字>|<数字序列><数字> <数字序列>::=<数字序列><数字>|<数字>|<.> <字母>::=a|b|c|……|x|y|z <数字>::=0|1|2|3|4|5|6|7|8|9 <运算符>::=<关系运算符>|<算术运算符>|<逻辑运算符>|<位运算符>|<赋值运算符> <算数运算符>::=+|-|*|/|...|-- <关系运算符>::=<|>|!=|>=|<=|== <逻辑运算符>::=&&| || |! <位运算符>::=&| | |! <赋值运算符>::==|+=|-=|/=|*= <分界符>::=,|;|(|)|{|}|:| // |/**/ <保留字>::=main|if|else|while|do|for|...|void

数据结构期末试题

山东理工大学《数据结构》试卷纸 (A)卷 10--11学年第一学期班级:姓名:班内序号:…………………………………装……………………………订…………………………线………….……………………………… 适用专业计算机科学与技术考核性质考试闭卷命题教师张先伟 肖爱梅 考试时间100分钟 题号一二三四五六总分得分 评阅人 复核人

所有题目答案请写在答题纸上,写在试卷纸上不得分! 一、填空(每空1分,共20分) 1、深度为k的完全二叉树至少有________个结点,具有10个叶结点的二叉树中有个度为2的结点。 2k-1 n2=9 2、设数组a[1..5,1..8]的基地址为200,每个元素占2个存储单元,若以行序为主序顺序存储,则元素 a[4,6]的存储地址为200+(3*8+5)*2_________。 3、数据结构中评价算法的两个重要指标是________和________。 4、顺序存储结构是通过________表示元素之间的关系的;链式存储结构是通过________表示元素之间的关 系的。 5、要在一个单链表中p所指结点之后插入一个子链表,子链表第一个结点的地址为s,子链表最后一个结 点的地址为t, 则应执行操作:和。 t->next=p->next; P->next=s 6、设有向图G的存储结构用邻接矩阵A来表示,则A中第i行中所有非零元素个数之和等于顶点i的___ 出度_____,第i列中所有非零元素个数之和等于顶点i的__入度________。 7、对于表长为n的顺序存储的线性表,访问结点的时间复杂度为 O(1) ,删除结点的时间复杂度为 O(n) 。 8、将一棵有100个结点的完全二叉树从根这一层开始,每一层从左到右依次对结点进行编号,根结点编号 为1,则编号最大的非叶结点的编号为:。 9、己知有序表为(12,18,24,35,47,50,62,83,90,115,134),当用折半查找法查找100时,需____3__ 次才能确定不成功。 10、Dijkstra最短路径算法从源点到其余各顶点的最短路径的路径长度按________次序依次产生。 11、如果T2是由树T1转换而来的二叉树,那么 T1中结点的后序遍历就是T2中结点的中序遍历。 12、广义表A= (d)则Head(Tail(Head(Tail(Tail(A)))))的值为 d。 13、设无向连通图的顶点个数为n,则该图最少有 n-1 条边,最多有 n(n-1)/2 条边。 二、选择(每题2分,共20分) 1、若需在O(nlog2n)的时间内完成对数组的排序,且要求排序是稳定的,则可选择的排序方法是。 A.快速排序 B.堆排序 C.归并排序 D.直接插入排序 2、有五个元素按5,4,3,2,1 的顺序进栈,问下列哪一个不是合法的出栈序列?。 A. 3 2 1 5 4 B. 4 5 3 1 2 C. 3 4 5 2 1 D. 2 3 4 1 5 3、无向图G=(V,E),其中:V={a,b,c,d,e,f},E={(a,b),(a,e),(a,c),(b,e),(c,f),(f,d),(e,d)},对该 图进行深度优先遍历,得到的顶点序列正确的是。 A.a,b,e,c,d,f B.a,c,f,e,b,d C.a,e,b,c,f,d D.a,e,d,f,c,b 4、链表不具有的特点是。 A.插入、删除不需要移动元素B.可随机访问任一元素 C.不必事先估计存储空间D.所需空间与线性表长度成正比 共 3页第1 页 山东理工大学《数据结构》试卷纸 (A)卷 10--11学年第一学期班级:姓名:学号:…………………………………装……………………………订…………………………线………….………………………………

编译原理词法分析程序实验报告记录

编译原理词法分析程序实验报告记录

————————————————————————————————作者:————————————————————————————————日期:

编译原理实验报告 实验名称:编写词法分析程序实验类型:设计性实验 指导教师:***** 专业班级:软件工程1401 姓名:**** 学号:********** 实验地点:东六E座301 实验成绩:_________________ 日期:2016 年5 月8 日

实验一 编写词法分析程序 一、实验目的 1.通过设计、调试词法分析程序,掌握词法分析程序的设计工具(有穷自 动机),进一步理解自动机理论 2.掌握正则文法和正则表达式转换成有穷自动机的方法及有穷自动机实现 的方法 3.确定词法分析程序的输出形式及标识符与关键字的区分方法 4.加深对理论知识的理解 二、实验设计 1.设计原理: 对源程序代码从头到尾扫描,将符合词法语言规则的单词输出,包括:标识符、保留字、无符号整数、分界符、运算符、注释分离;判断程序的词法是否正确 TEST语言的词法规则如下: 1)、标识符:字母打头,后接任意字母或数字。 2)、保留字:标识符的子集,包括:if,else,for,while,do, int,write,read。 3)、无符号整数:由数字组成,但最高位不能为0,允许一位的0。 4)、分界符:(、)、;、{、} 5)、运算符:+、-、*、/、=、<、>、>=、<=、!=、== 6)、注释符:/* */ 2.设计方法: 1)用正则表达式或正则文法描述程序设计语言的词法规则,通常采用 正则表达式;一个正则表达式对应一条词法规则 2)为每个正则表达式构造一个NFA,用来识别正则表达式描述的单词 将每一个NFA合并、化简得到最简的DFA 3)将多个NFA合并为一个NFA 4)将NFA转换成等价的DFA。 5)最小化DFA 6)确定单词的输出形式。 7)化简后的DFA+单词输出形式?构造词法分析程序 3.设计过程:

相关文档
最新文档