姓名:
学号:
计算机科学与工程系
编译原理课程设计实验报告
姓名:xxx 学号 080512038 年级专业及班级 2008 级计算机科学与技术 2 班 成绩
实验名称
1、源程序的输入和扫描 2、源代码扫描,单词识别输出
完成日期
2011/3/15
指导教师 叶晓鸣&刘娅老师
实验目的:1、源程序的输入和扫描:编制一个源程序的输入过程,从键盘、文件或文本框输入若干行语句,依
次存入输入缓冲区(字符型数据);并编制一个扫描子程序,该子程序中每次调用能依次从存放源程
序的输入缓冲区中读出一个有效字符。
2、源代码扫描,单词识别输出:从文件输入若干行语句,每次读出一个有效字符,构造成单词(关
键字,变量名,常量等),保存到文件或者链表,输出单词以及所在行号。
实验要求:1、源程序的输入和扫描:如源程序为 C 语言。要求输出与输入相同。输入如下一段:
main()
{
int
a,b
,c;
a
= 10;
b=20;
c=a+b;
}
2、源代码扫描,单词识别输出:如源程序为 C 语言。要求读入后,识别出单词。
#include
void main()
{
}
int a,b;
a=3;
b=10;
printf("OK!");
实验内容、原理:1、源程序的输入和扫描:读字符的子程序作为单独一个过程(函数),每调用它一次只返回
缓冲区里的一个字符,主程序连续调用它就得到完整的输出。
2、源代码扫描,单词识别输出:构造单词、输出结果,均独立为函数,导出结果保存到文件
里。
- 1 -
姓名:
学号:
实验环境:需要 TC、VC++ 6.0 等开发工具作为本次试验的环境。
实验步骤:
1、准备: 用 TC、VC++等开发工具;
2、对本实验的任务进行分析,确定实现功能的函数;
3、写好程序,仔细修改函数;
4、上机操作:输入源程序,修改、调试,运行。
5、写好试验报告。
实验调试过程及测试结果
源代码及测试结果:
/*源程序的输入和扫描*/
# include
# include
void main()
{
int WriteFile(char* filename);
int readbuffer();
char *filename={"zjk.txt"};
int j;
j=0;
char creatflie='0';//声明变量
printf("1、input c creat the file and input character $ foundations complete\n");
printf("2、input o open the file\n");
scanf("%c",&creatflie) ;
if(creatflie=='c')
WriteFile(filename);//如果输入为字母 c,就创建文件
if(creatflie=='o')
readbuffer();//如果输入为字母 o,就读取文件
}
int i;
FILE *fp;
FILE *rfp;
char buffer[1000];//声明变量
int WriteFile(char* filename)//子程序开始
{ char a;
int count=0;
int i=0;
if((fp=fopen(filename,"w"))==NULL){
//打开文件
- 2 -
姓名:
学号:
printf("THE FILE CAN'T OPEN!");exit(0); }
while(i<1000)
//输入字符限制为 1000 个
//这里是写入文件,如果没有这个文件则创建文件。其中
//如果你输入$则结束输入功能
//否则将输入的字符写入已创建的文件
//i 是统计已写入的字符个数
文件名由句柄指针 fp 给出
{
scanf("%c",&a) ;
if(a=='$')return i;
fprintf(fp,"%c" ,a);
i++;
}
fclose(fp);
return i;
//关闭文件
}
{
int readbuffer()
//定义整形变量 flen,初始值为 0
int flen=0;
int j=0;
char ch;
char *filename="zjk.txt";//声明变量
printf("filename:zjk.txt \n");
if((rfp=fopen("zjk.txt","r"))==NULL)
{ printf("THE FILE CAN'T OPEN!");exit(0); }
// 输出字符限制为 1000 个
while(j<1000)
ch=fgetc(rfp);
if (feof(rfp))
//读取文件中的下一个字符
//没有到文件末尾
//此时读到第 i 个字符
//将读出的字符放入缓存字符数组
{
{
i=j;
break;
}
buffer[j]=ch;
++j;
}
//如果 flen 小于文件长度
//读取第缓存数组中的第 flen 个字符
//数组指针下移
while(flen
姓名:
学号:
/*源代码扫描,单词识别输出*/
#include
#include
#include
void main()
{
FILE *fp,*fp1;//定义文件指针
int count=1,a=1;//定义计数器和输出换行标志
char ch,infile[10],outfile[10];//定义输入和输出文件名
printf("Enter the infile name:\n");
scanf("%s",infile);//输入需要扫描的文件名
printf("Enter the outfile name:\n");
scanf("%s",outfile);//输入需要另存为的文件名
if((fp = fopen(infile,"r")) == NULL)//打开需要扫描的文件
{
printf("cannot open file\n");
exit(0);
}
- 4 -
姓名:
学号:
if((fp1 = fopen(outfile,"w")) == NULL)//打开需要存入的文件
{
printf("cannot open file\n");
exit(0);
}
/*fputc('1',fp1);
char str[6]={':',' ',' ',' ',' ',' '};
for(int i=0;i<6;i++)//输出“1:
{
fputc(str[i],fp1);
}*/
”字样
while(! feof(fp))//顺序读入 infile 文件中的二进制数据并逐字判断
{
ch=fgetc(fp);
if(ch==10){count++;}//换行符的 ASCII 为 10,如果遇见换行符,计数器加 1
else
{
if((ch>64 && ch<91) || (ch>96 && ch<123) || (ch>47 && ch<58)|| ch==46||ch==33)
{//如果遇见 a~z、A~Z、0~9 和“.”以及“!”就输出并存入文件 outfile 文件中
if(a==1)
{//如果输出换行标志 a 为 1 则输出“ **:
printf("\n%d:
fprintf(fp1,"\n%d:
",count);
",count);
}
printf("%c",ch);//输出 ch 中的字符
fprintf(fp1,"%c",ch);//把 infile 中字符存入 outfile 中
a=0;//置输出换行标志 a 为 0
”,单 a 为 0 时跳过
}
else
{
}
}
}
printf("\n");
}
a=1;//置输出换行标志 a 为 1,准备输出“ **:
”
- 5 -
姓名:
学号:
- 6 -
姓名:
学号:
总结
本次实验的任务是:1、源程序的输入和扫描 2、源代码扫描,单词识别输出。第一个实验是编制一个源程
序的输入过程,从键盘、文件或文本框输入若干行语句,依次存入输入缓冲区(字符型数据);并编制一
个扫描子程序,该子程序中每次调用能依次从存放源程序的输入缓冲区中读出一个有效字符,要求输入与
输出相同。第二个任务是从文件输入若干行语句,每次读出一个有效字符,构造成单词(关键字,变量名,
常量等),保存到文件或者链表,输出单词以及所在行号,要求读入后,识别出单词。我们利用文件的创
建来实现以上两个任务的,我们通过查询书籍,对写文件和读文件有了更进一步的掌握。
指导教师签名:
2011 年 3 月 15 日星期二
- 7 -