文档库 最新最全的文档下载
当前位置:文档库 › 软件系统设计(一)

软件系统设计(一)

软件系统设计任务(一) : 第1/2页
编码完成函数getcha()
其功能是:每次被调用时,它从扫描缓冲区line中按顺序读下一个字符,然后将这个字符作为函数值返回。另外它还负责扫描缓冲区line的管理:即当尝试从line中读下一个字符时若发现缓冲区line中无可用字符(扫描缓冲区line的内容为空,或其内容已被前面的调用所读完),则应先从磁盘中读入源语言程序(输入)文件的下一行(无论该行长短)装入line中(然后再从line中读下一个字符并将其返回)。
=========================================================================
本次任务所需全程变量:(永久保留。今后随着任务的增加,全程变量也逐步增加)

#define al 10 /* 标识符的最大长度* /
typedef char alfa[al]; /* 定义10个长的字符串的类型名alfa * /
char ch; /* 用于接受getcha()函数从line中读取的字符* /
char line[81];/* 输入缓冲区,保存从源语言程序文件中读入的一行(无论长短)*/
int ll; /*line中最近输入的源语言程序文件(finput)当前行的实际长度*/
int cc; /*记录line中上一次被读取且被返回的字符在line中的位置下标*/
alfa fname; / *10个长的字符串变量,用来保存文件名*/
FILE *finput, *foutput; /*分别为源语言程序(输入)文件名,和输出文件名*/
========================================================================
函数getcha()的结构:

char getcha() /*函数返回值为(从line中读取的)一个字符*/
{
if (输入缓冲区line 为空或其中所有的字符都已经被读完)
/*提示:利用ll和cc的当前值的相互比较关系来表达出上述条件*/
{
/*若条件成立则执行下面语句从输入文件读入一行(无论长短)装入缓冲区line*/
if (feof(finput)) /* 读文件前,先判断输入文件是否已空 */
{ 调用error()函数输出错误提示:“源语言程序文件不完整”;
exit(0); /*每当出现严重错误都退出编译程序的执行让用户修改*/
}
将输入文件finput的下一行读入line中(在此过程中用ll计数该行实际长度);
同时将此行原样抄送屏幕和输出文件foutput(注意:这一步必需在此时完成);
置cc的值; /*根据上面cc的功能定义仔细考虑此时cc应置何值*/
}
cc++; /*返回line中的下一字符(注意:可能是换行符), */
return (line[cc]); /*这是本函数的主要功能。 */
} /*函数getcha()结束*/
=================================================================
主函数的结构: (今后随着任务的增加,主函数的内容也逐步增加)

main( )
{ 打开输入文件,文件指针为finput; /*即,被处理的源语言程序文件。*/
打开输出

文件,文件指针为foutput; /*即,记录编译过程结果的文件。*/
cc= -1; ll=0; /*思考一下,这二个变量所赋的初值的意义*/

while(! feof(finput)) /*此循环句仅为调试getcha()所用,*/
ch=getcha( ); /*成功后去掉这两行,其它行永久保留。*/
/*调试方法:单步运行while循环同时监视ch和line的内容判断getcha()正确否。*/
/*正确标准:(1)调用getcha()一次它必须返回一个且只一个与line中一致的字符。*/
/* (2)同时line中的源语言程序行也在运行屏幕上同步原样显示。 */

fclose( finput) ; fclose( foutput) ;
} /*主函数main()结束*/
=======================================================================
一个被处理的源语言程序(输入)文件的内容:(它完全符合将在下一阶段给出的语法规则)
begin integer a, b, c101 ;
a:=5;
for b:=0 step a until a*a do
begin
c101:=b*a-a /(b+1);
c101:=c101+1;
begin integer x, y;
x:=c101;
if x>5 then y:=x-a/x + b
else begin
y:= -b*c101;
y:=y/(-a)
end
end
end
end . /*注意:源语言程序中的最后一个单词是句号:‘.’。*/
========================================================================
错误提示子程序error(): 直接给出。其功能是在发现错误的位置输出提示符‘!’和实参传来的错误性质提示信息,然后退出本编译程序的执行让用户修改错误。
请把它加入到编译程序中. 后面的语法分析阶段也要用到它。
viod error(string)
char *string; /*形参string 接收实参传来的错误性质提示信息*/
{ int i ;
printf("****"); /* 输出"****" ,标志本输出行是错误提示行*/
for(i=1; iprintf(" ");
printf("! %s",string); /*输出出错位置指示符‘!’,和错误提示信息*/
fprintf (foutput,"****"); /*将错误提示信息同步送到输出文件*/
for(i=1; ifprintf (foutput," ");
fprintf (foutput ,"!%s",string);
exit(0); /*终止编译程序的运行,待用户修改错误后再重新启动本编译程序*/
} /*函数error()结束*/

相关文档