编译原理实验报告2

  • 格式:doc
  • 大小:148.50 KB
  • 文档页数:17

下载文档原格式

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

学生学号实验课成绩

武汉理工大学

学生实验报告书

实验课程名称编译原理

开课学院计算机科学与技术学院

指导老师姓名饶文碧

学生姓名

学生专业班级

—学年第学期

实验课程名称:编译原理

实验项目名称单词的词法分析实验成绩

实验者专业班级组别

同组者实验日期

第一部分:实验分析与设计(可加页)

一、实验内容描述(问题域描述)

完成对某一种常用高级语言(如Pascal、C语言、PL/0语言)的各类单词进行词法分析,即对源程序从左到右进行扫描,对组成源程序的字符串拼接成为单词;并把其转换成属性字输出。

实验要求:

(1)选择常用高级程序设计语言(如 Pascal、C语言、PL/0语言)的源程序作为词法分析对象。

(2)根据教学要求和学生具体情况,从上列语言之一中选取它的一个适当大小的子集,可以选取一类典型单词,也可以尽可能使各种类型的单词都能兼顾到。其基本要求是:对源程序从左到右进行扫描,对组成源程序的字符串拼接成为单词,并把其转换成属性字输出。

二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)

#include

#include

#include

#include

char *table[7]={" ","main","int","if","then","else","return"},TOKEN[20],ch;

//定义关键字

int lookup(char *TOKEN){ //关键字匹配函数

int m,i;

for(i=1;i<6;i++){

if((m=strcmp(TOKEN,table[i]))==0)

return(i);

}

return(0);

}

void out(int c,char *TOKEN){ //输出函数

printf("(%d,%s)\n",c,TOKEN);

}

void scanner(FILE *fp){ //扫描函数

char TOKEN[20]={'\0'};

char ch;

int i,c;

ch=fgetc(fp); //获取字符指针fp并自动指向下一个字符 if(isalpha(ch)){ //判断该字符是否是字母

TOKEN[0]=ch;

ch=fgetc(fp);

i=1;

while(isalnum(ch)){ //判断该字符是否是字母或数字

TOKEN[i]=ch;

i++;

ch=fgetc(fp);

}

TOKEN[i]='\0';

fseek(fp,-1,1); //回退一个字符

c=lookup(TOKEN);

if(c==0)

out(6,TOKEN); //输出标识符

else out(c,TOKEN); //输出关键字

}

else

if(isdigit(ch)){ //判断是否是数字

TOKEN[0]=ch;

ch=fgetc(fp);

i=1;

while(isdigit(ch)){

TOKEN[i]=ch;

i++;

ch=fgetc(fp);

}

TOKEN[i]='\0';

fseek(fp,-1,1);

out(7,TOKEN);

}

else

{

TOKEN[0]=ch;

switch(ch){

case'{':out(17,TOKEN);

break;

case'}':out(18,TOKEN);

break;

case',':out(14,TOKEN);

break;

case';':out(15,TOKEN);

break;

case'<':ch=fgetc(fp);

TOKEN[1]=ch;

if(ch=='='){

out(9,TOKEN);

}

else if(ch=='>'){

out(11,TOKEN);

}

else {

fseek(fp,-1,1);

out(8,TOKEN);

}

break;

case'=':out(10,TOKEN);

break;

case'>':ch=fgetc(fp);

TOKEN[1]=ch;

if(ch=='=') out(13,TOKEN); else {

fseek(fp,-1,1);

out(12,TOKEN);

}

break;

default:printf("error!\n");

break;

}

}

}

void main()

{ FILE *fp;

if((fp=fopen("D:\\ZHT.txt","r"))==NULL){

//读取文件内容,并返回文件指针,该指针指向文件的第一个字符 fprintf(stderr,"error opening.\n");

exit(1);

}

do{

ch=fgetc(fp);

if(ch=='#') //文件以#结尾作为扫描结束条件

break;

if(ch==' ') //如果是空格,自动跳到下个字符

scanner(fp);

else{

fseek(fp,-1,1); //如果不是空格,则回退一个字符并扫描 scanner(fp);

}