编译原理实验报告(C语言)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理实验报告 实验项目 1:词法分析程序实验
一、实验的目的与任务:
编译原理是计算机类专业特别是计算机软件专业的一门重要专业课。设置该课程的目的在于系统地向 学生讲述编译系统的结构、工作流程及编译程序各组成部分的设计原理和实现方法,使学生通过学习既掌 握编译理论和方法方面的基本知识,也具有设计、实现、分析和维护编译程序等方面的初步能力。编译原 理是一门理论性和实践性都比较强的课程。进行上机实验的目的是使学生通过完成上机实验题目加深对课 堂教学内容的理解。同时培养学生实际动手能力。 编译实验由三个独立实验组成,按照由浅入深进行排列,希望通过本实验使学生更深学习并理解编译 的主要过程和相关方法。 词法分析的目的是将输入的源程序进行划分,给出基本符号(token)的序列,并掠过注解和空格等 分隔符号。基本符号是与输入的语言定义的词法所规定的终结符。 本实验要求学生编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本 保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 (遇 到错误时可显示“Error” ,然后跳过错误部分继续进行)
extern register static
9 10 11
continue break default
20 21 22
常数 自定义字符
28 29
运算符 ‘+' ‘-’ ‘*’ ‘/' ‘<' ‘<=’ ‘>’ ‘>=’ ‘=’ ‘!=' 其他运算符 31 32 33 34 35 36 37 38 39 40 27
二、题目分析
1.这里采用 C 语言编写的源程序作为词法分析程序的输入数据,输入数据保存在“in.txt”记事本中,将分 析结果存在“out.txt”记事本中。词法分析器的源代码使用 C 语言编写。 2. 下面就词法分析程序中的主要变量进行说明: 主函数 main(): 打开要分析的 C 语言源程序,若不能正确打开,则报错。 先从源程序中读入一个字符 ch,然后进行如下处理: 1、cp 消耗掉空格,制表符,换行符后,cp 数组复位,开始检测 cp; 2、数字检测,对照符号表输出,若匹配成功,则返回序号; 3、字符串检测, 对照符号表输出,若匹配成功,则返回序号; 4、基本保留字检测,对照符号表输出,若匹配成功,则返回序号; 5、运算符检测,对照符号表输出,若匹配成功,则返回序号;注意这里碰到‘/’时,要判断后面是 否跟着是注释语句。是则跳过,不是则输出运算符。 6、分隔符(界符)检测,对照符号表输出,若匹配成功,则返回序号; 7、排错处理; 结束。 3.以下给定一个 C 语言的符号表的设计和结构: C 语言基本保留 字表 main void int float double char struct const 1 2 3 4 5 6 7 8 if else switch case for do while goto 12 13 14 15 16 17 18 19 sizeof return 23 24
ห้องสมุดไป่ตู้
分隔符 ; : , { } [ ] ( ) 41 42 43 44 45 46 47 48 49
4.程序源代码(C 语言)
#include <stdio.h> #define MAX 500 main() { FILE *in,*out; char word[MAX]; char cp; int i; if((in=fopen("in.txt","r"))==NULL) { printf("不能打开文档 in.txt,请检查根目录下是否存在该文档\n"); exit(0); } else { printf("成功打开文档 in.txt\n"); } if((out=fopen("out.txt","w"))==NULL) { printf("不能打开文档 out.txt,请检查根目录下是否存在该文档\n"); exit(0); /*存储标识符*/ /*标识符的最大长度*/
word[i]='\0'; fprintf(out,"%s%c%s%c%s\n","error: ",'"',word,'"',"不是合法的标识符"); } continue; } /*字符串检测*/ if((cp>='a'&&cp<='z')||(cp>='A'&&cp<='Z')||cp=='_') { while((cp>='a'&&cp<='z')||(cp>='0'&&cp<='9')||(cp>='A'&&cp<='Z')||cp=='_') { word[i++]=cp; cp=fgetc(in); }
/*存储当前读入字符*/
} else { printf("成功打开文档 out.txt\n"); } cp=fgetc(in); while(cp!=EOF) { /*消耗掉空格,制表符,换行符*/ while(cp==' '||cp=='\t'||cp=='\n') { cp=fgetc(in); } /*cp 数组复位*/ i=0; /*数字检测*/ if(cp>='0'&&cp<='9') { word[i++]=cp; cp=fgetc(in); while(cp>='0'&&cp<='9') { word[i++]=cp; cp=fgetc(in); } if(cp==' '||cp=='\t'||cp=='\n'||cp=='='||cp=='+'||cp=='-'||cp=='*'||cp=='/'||cp=='>'||cp=='<'||cp=='!'||cp==';'||cp==':'||cp==','||cp=='{ '||cp=='}'||cp=='['||cp==']'||cp=='('||cp==')') { word[i]='\0'; fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',28,')'); } else { while(cp!=' '&&cp!='\t'&&cp!='\n'&&cp!='='&&cp!='+'&&cp!='-'&&cp!='*'&&cp!='/'&&cp!='>'&&cp!='<'&&cp!='!'&&cp! =';'&&cp!=':'&&cp!=','&&cp!='{'&&cp!='}'&&cp!='['&&cp!=']'&&cp!='('&&cp!=')') { word[i++]=cp; cp=fgetc(in); }
一、实验的目的与任务:
编译原理是计算机类专业特别是计算机软件专业的一门重要专业课。设置该课程的目的在于系统地向 学生讲述编译系统的结构、工作流程及编译程序各组成部分的设计原理和实现方法,使学生通过学习既掌 握编译理论和方法方面的基本知识,也具有设计、实现、分析和维护编译程序等方面的初步能力。编译原 理是一门理论性和实践性都比较强的课程。进行上机实验的目的是使学生通过完成上机实验题目加深对课 堂教学内容的理解。同时培养学生实际动手能力。 编译实验由三个独立实验组成,按照由浅入深进行排列,希望通过本实验使学生更深学习并理解编译 的主要过程和相关方法。 词法分析的目的是将输入的源程序进行划分,给出基本符号(token)的序列,并掠过注解和空格等 分隔符号。基本符号是与输入的语言定义的词法所规定的终结符。 本实验要求学生编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本 保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 (遇 到错误时可显示“Error” ,然后跳过错误部分继续进行)
extern register static
9 10 11
continue break default
20 21 22
常数 自定义字符
28 29
运算符 ‘+' ‘-’ ‘*’ ‘/' ‘<' ‘<=’ ‘>’ ‘>=’ ‘=’ ‘!=' 其他运算符 31 32 33 34 35 36 37 38 39 40 27
二、题目分析
1.这里采用 C 语言编写的源程序作为词法分析程序的输入数据,输入数据保存在“in.txt”记事本中,将分 析结果存在“out.txt”记事本中。词法分析器的源代码使用 C 语言编写。 2. 下面就词法分析程序中的主要变量进行说明: 主函数 main(): 打开要分析的 C 语言源程序,若不能正确打开,则报错。 先从源程序中读入一个字符 ch,然后进行如下处理: 1、cp 消耗掉空格,制表符,换行符后,cp 数组复位,开始检测 cp; 2、数字检测,对照符号表输出,若匹配成功,则返回序号; 3、字符串检测, 对照符号表输出,若匹配成功,则返回序号; 4、基本保留字检测,对照符号表输出,若匹配成功,则返回序号; 5、运算符检测,对照符号表输出,若匹配成功,则返回序号;注意这里碰到‘/’时,要判断后面是 否跟着是注释语句。是则跳过,不是则输出运算符。 6、分隔符(界符)检测,对照符号表输出,若匹配成功,则返回序号; 7、排错处理; 结束。 3.以下给定一个 C 语言的符号表的设计和结构: C 语言基本保留 字表 main void int float double char struct const 1 2 3 4 5 6 7 8 if else switch case for do while goto 12 13 14 15 16 17 18 19 sizeof return 23 24
ห้องสมุดไป่ตู้
分隔符 ; : , { } [ ] ( ) 41 42 43 44 45 46 47 48 49
4.程序源代码(C 语言)
#include <stdio.h> #define MAX 500 main() { FILE *in,*out; char word[MAX]; char cp; int i; if((in=fopen("in.txt","r"))==NULL) { printf("不能打开文档 in.txt,请检查根目录下是否存在该文档\n"); exit(0); } else { printf("成功打开文档 in.txt\n"); } if((out=fopen("out.txt","w"))==NULL) { printf("不能打开文档 out.txt,请检查根目录下是否存在该文档\n"); exit(0); /*存储标识符*/ /*标识符的最大长度*/
word[i]='\0'; fprintf(out,"%s%c%s%c%s\n","error: ",'"',word,'"',"不是合法的标识符"); } continue; } /*字符串检测*/ if((cp>='a'&&cp<='z')||(cp>='A'&&cp<='Z')||cp=='_') { while((cp>='a'&&cp<='z')||(cp>='0'&&cp<='9')||(cp>='A'&&cp<='Z')||cp=='_') { word[i++]=cp; cp=fgetc(in); }
/*存储当前读入字符*/
} else { printf("成功打开文档 out.txt\n"); } cp=fgetc(in); while(cp!=EOF) { /*消耗掉空格,制表符,换行符*/ while(cp==' '||cp=='\t'||cp=='\n') { cp=fgetc(in); } /*cp 数组复位*/ i=0; /*数字检测*/ if(cp>='0'&&cp<='9') { word[i++]=cp; cp=fgetc(in); while(cp>='0'&&cp<='9') { word[i++]=cp; cp=fgetc(in); } if(cp==' '||cp=='\t'||cp=='\n'||cp=='='||cp=='+'||cp=='-'||cp=='*'||cp=='/'||cp=='>'||cp=='<'||cp=='!'||cp==';'||cp==':'||cp==','||cp=='{ '||cp=='}'||cp=='['||cp==']'||cp=='('||cp==')') { word[i]='\0'; fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',28,')'); } else { while(cp!=' '&&cp!='\t'&&cp!='\n'&&cp!='='&&cp!='+'&&cp!='-'&&cp!='*'&&cp!='/'&&cp!='>'&&cp!='<'&&cp!='!'&&cp! =';'&&cp!=':'&&cp!=','&&cp!='{'&&cp!='}'&&cp!='['&&cp!=']'&&cp!='('&&cp!=')') { word[i++]=cp; cp=fgetc(in); }