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