银行家算法实习报告

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

青岛农业大学

学生实习报告

实习名称:软件系统课程设计

实习时间: 2010 -- 2011 学年第 2学期专业班级:

姓名(学号):

同组成员:

指导老师:于仁师

2011 年 3 月 22 日

(一)编译原理部分

一、实习题目

将词法分析器设计成单独的程序或供语法分析器调用的子程序,功能包括:要求能够识别数字、标识符、关键字、运算符等。

二、设计思路及算法描述

词法分析程序的功能:

输入源程序,输出单词符号,如图所示:

源程序单词符号

处理过程:在扫描源程序字符串时,一旦识别出关键字、分隔符、标识符、无符号常数中之一,即以单词形式(各类单词均采用相同的结构,即二元式编码形式)输出。每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直至整个源程序全部扫描完毕,并形成相应的单词串形式的源程序。

本程序规定:

(1)关键字"begin","end","if","then","else","while","write","read",

"do", "call","const","char","until","procedure","repeat"

(2)运算符:"+","-","*","/","="

(3)界符:"{","}","[","]",";",",",".","(",")",":"

(4)其他标记如字符串,表示以字母开头的标识符。

(5)空格、回车、换行符跳过。

对于一段可能的输入代码,其结果在屏幕上显示如下:

( 1 , 无符号整数)

( begin , 关键字 )

( if , 关键字 )

( +, 运算符 )

( ; , 界符 )

( a , 普通标识符 )

关键字或标识符的判断:读入一串字符,将ASCII码在字母范围的字符存入数组中,将该数组与设置好的关键字比较,如果相等则输出是关键字,否则继续读入直至下一字符既非数字也非字母,输出为标识符;

数字的判断:若跟在字母后面则一起输出为标识符,否则输出为数字;

界符、运算符的判断:直接判断其ASCII码

运行过程为:

1.预处理:把源文件一个字符一个字符的读入词法分析程序设置的输入字符结构体数组中(输入缓冲区),读入过程要删除多余的空格;

2.源程序字符数组中获得单词, 编码为二元式.:二元式采用结构体数组存储, 把单词类型和词元记

录下来。

为了方便和适用起见,首先建立一个文本,进而在文本中进行pascal语言输入。输入完毕之后,就可以进行从文本中取字符,进而把它放在一个数组中。之后再数组中进行取字符,之前要定义一个数组,定义一个指针指向数组,为first。之后就用一个循环依次从数组中取字符,假如是字符就放在buf 中,first++;一次进行下去,期间要时刻与关键字指针数组进行比较如果相等就立马输出,并显示是关键字此时将buf置为初值,first重新指向首地址。

流程图

三、程序代码:

#include //其中

#include

using namespace std;

#define MAX 22

char ch =' ';

string key[15]={"begin","end","if","then","else","while","write","read", "do", "call","const","char","until","procedure","repeat"};

int Iskey(string c){ //关键字判断

int i;

for(i=0;i

if(key[i].compare(c)==0) return 1;

}

return 0;

}

int IsLetter(char c) { //判断是否为字母

if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A'))) return 1;

else return 0;

}

int IsDigit(char c){ //判断是否为数字

if(c>='0'&&c<='9') return 1;

else return 0;

}

void fenxi(FILE *fpin){

string arr="";

while((ch=fgetc(fpin))!=EOF) {

arr="";

if(ch==' '||ch=='\t'||ch=='\n'){}

else if(IsLetter(ch)){

while(IsLetter(ch)||IsDigit(ch)) {

if((ch<='Z')&&(ch>='A')) ch=ch+32;

arr=arr+ch;

ch=fgetc(fpin);

}

fseek(fpin,-1L,SEEK_CUR);

if (Iskey(arr)){cout<

else cout<

}

else if(IsDigit(ch)){

while(IsDigit(ch)||ch=='.'&&IsDigit(fgetc(fpin))){

arr=arr+ch;

ch=fgetc(fpin);

}

fseek(fpin,-1L,SEEK_CUR);

cout<

}

else switch(ch){

case'+':

case'-' :

case'*' :

case'=' :

case'/' :cout<

case'(' :

case')' :

case'[' :

case']' :

case';' :

case'.' :

case',' :

case'{' :

case'}' :cout<

case':' :{ch=fgetc(fpin);

if(ch=='=') cout<<":="<<"\t$运算符"<

else {cout<<"="<<"\t$运算符"<

fseek(fpin,-1L,SEEK_CUR);}

}break;

case'>' :{ch=fgetc(fpin);

if(ch=='=') cout<<">="<<"\t$运算符"<

if(ch=='>')cout<<">>"<<"\t$输入控制符"<

相关文档
最新文档