资源描述
湖南农业大学信息科学技术学院
学 生 实 验 报 告
姓名: 林*文 年级专业班级 **级计算机*班 日期 20** 年 ** 月 **日 成绩
课程名称
编译原理
实验名称
源程序的输入和扫描
实验类型
设计性
【实验目的、要求】
理解源程序被编译器读取的过程,掌握扫描程序的方法。
【实验内容】
1.编制一个源程序的输入过程,从键盘、文件或文本框输入若干行语句,依次存入输入缓冲区(字符型数据);
2.编制一个扫描子程序,该扫描程序能删除无用的空白字符、回车字符以及其他与输入介质相关的非实质性字符,用“#”分隔单词流。
3.删除注释信息。
【实验环境】
计算机、编程环境vc++6.0
【实验步骤、过程】
1 功能描述
⑴ 编制一个源程序的输入过程,从键盘、文件或文本框输入若干行语句,依次存入输入缓冲区(字符型数据)。
⑵ 编制一个扫描子程序,该扫描程序能删除无用的空白字符、回车字符以及其他与输入介质相关的非实质性字符,用“#”分隔单词流。
⑶ 删除注释信息。
2 程序结构描述
⑴ 用freopen读取文件,然后进行读取行数跟每行的字符串长度。接着在开始跟结束先用“#”分隔。
⑵ 遇到空格先用“#”分隔,然后判断并删除后接的空格;遇到回车字符时,直接指针直到下一位;在Pascal语言中,如果遇到“{”此注释标记择指针下移直到遇到“}”完,结束。
⑶ 遇到字母字符时将其输出,并判断下各个字符,如果是继续输出直到不是字母字符。判断数字字符其道理与字母字符处理一样。
⑷ 遇到运算符时,将其前后加“#”输出;遇到分隔符与运算符一样处理;
3 流程图(或原理图)
4 关键代码
#include <stdio.h>
#include <string.h>
char a[100][100];//存放读取文件的字符
int count=0;//全局变量用于行数
void input()//获取文件行数
{
while(gets(a[count++]));
}
void process()//实验工程
{
printf("#");//开始的#
for(int i=0;i<count;i++)
{
int l=strlen(a[i]);
for(int j=0;j<l;j++)
{
if(a[i][j]==' ')
{
printf("#");
while(j<l&&a[i][j+1]==' ')
j++;
}//遇到空格打#,删除后面的空格
else if (a[i][j]=='{')
{
for(int k=0;k<l;k++)
if(a[i][j]!='}')
j++;
}//删除{}注释
else if(a[i][j]==';')
printf("#;#");//;为每句的结束即为回车将其转译成#;#分隔
else if(a[i][j]>='0'&&a[i][j]<='9'||a[i][j]>='a'&&a[i][j]<='z'||a[i][j]>='A'&&a[i][j]<='Z')
printf("%c",a[i][j]);//将数字跟字符分隔
else if(a[i][j]=='+'||a[i][j]==','||a[i][j]=='*'||a[i][j]=='-'||a[i][j]=='/')
printf("#%c#",a[i][j]);//将运算符和标示符号分隔
else if(a[i][j]=='(')
printf("%c#",a[i][j]);
else if (a[i][j]==')')
printf("#%c",a[i][j]);//将()分隔出来
else if(a[i][j]==':'&&a[i][j+1]=='=')
printf("#%c%c#",a[i][j],a[i][j+1]);
else if(a[i][j]==':')//将特殊的 运算符如“:=”等分隔出来
printf("#%c#",a[i][j]);
}
}
printf("#\n");//结束的#
}
int main()
{
freopen("D:\\colin1.txt","r",stdin);//读取实验文件
input();
process();
return 0;
}
【实验结果和总结】(对实验结果进行相应分析,或总结实验的心得体会,并提出实验的改进意见)
1 实验结果记录 (截图)
实验文件:(截图)
实验结果:(截图)
2 实验总结 遇到的问题 所用的时间 所用方法和手段以及心得体会
这个程序存在很多的不足和漏洞,但是我想这只是我的初步程序,应该花更多的时间去考其他的可能性,尽力的完善它。
所用的时间:程序花费2小时。
遇到的问题;
1. 在处理字母字符和数字字符的时候将每个字符分开输出,比如:#P##R#,#2##3#。
2. 程序里的输入处理语句比较困难,不会用freopen条令。
所用的方法和手段:
1. 设置循环语句,进行判断然后输出。
2. 与同学交流,并上网查询。
心得体会:
经过这次的编译原理实验,不仅仅加深并且更熟识掌握的语言。而且在遇到问题无从下手的时候,跟同学交流,还有差资料,真的是不错的选择。而且经过这次的实验,我觉得我不应该是为了完成任务而去写这个程序,而是为了学得更多的知识而努力奋斗。
指导教师签名:
20 12年 11月 10 日
【备注】
展开阅读全文