编译程序文档格式.docx
《编译程序文档格式.docx》由会员分享,可在线阅读,更多相关《编译程序文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
charalphaprocess(charbuffer);
chardigitprocess(charbuffer);
charotherprocess(charbuffer);
//******************语法分析函数声明*************************************
voidfactor();
voidterm();
voidarithexp();
voidexp();
voidassign_stmt();
voidmatch();
voiderror();
//******************中间代码函数声明******************************************
voidinique(sqs*s);
intpush(sqs*s);
intpop(sqs*s);
voidmiddlecode();
voidprint();
voidoptimizecode();
//*****************************************************************************
//词法分析部分
FILE*fp;
//源文件
char*p;
charfilename[10];
intopenfile=1;
intline=1;
interror1=0;
intsource[buf][2];
intsounum=0;
chardigittp[20];
//关键字
char*key[32]={"
and"
"
array"
begin"
bool"
call"
case"
char"
constant"
do"
"
else"
end"
false"
for"
if"
input"
integer"
not"
of"
or"
output"
procedure"
program"
read"
real"
repeat"
set"
then"
true"
until"
var"
while"
write"
};
//符号表
char*character[21]={"
+"
-"
*"
/"
("
)"
:
="
<
>
/*"
*/"
.."
["
]"
;
`"
//常量表
char*integer[buf];
//标志符表
char*label[10];
intconstnum=0,labelnum=0;
//以上有5张表,储存了所有的信息,其中2维数组source储存的源程序的程序内容,
//前面四张表的次序依次为:
保留字表为1,符号表为2,常数表为3,标志符表为4;
charalphaprocess(charbuffer)//关键字和标识符处理子函数;
intnewid=1,id=1;
inti=-1;
charalphatp[20];
while((isalpha(buffer))||(isdigit(buffer)))
alphatp[++i]=buffer;
buffer=fgetc(fp);
}
alphatp[i+1]='
\0'
//寻找保留字
i=0;
intre=0;
while(i<
32&
&
re==0)
{if(strcmp(key[i],alphatp)==0)
{//printf("
\n\t保留字:
%s"
key[i]);
source[sounum][0]=1;
//将保留字的位置放入数组之中
source[sounum][1]=i;
sounum++;
id=0;
re=1;
i++;
//标志符处理
if(id==1)
{for(i=0;
i<
labelnum;
i++)
{if(strcmp(label[i],alphatp)==0)
{source[sounum][0]=4;
//将标志符的位置放入数组之中
newid=0;
if(newid==1)//开辟标志符新量
{label[labelnum]=(char*)malloc(sizeof(alphatp));
strcpy(label[labelnum],alphatp);
source[sounum][0]=4;
source[sounum][1]=labelnum;
labelnum++;
return(buffer);
chardigitprocess(charbuffer)//数字处理函数
{intnewnum=1;
while((isdigit(buffer)))
digittp[++i]=buffer;
digittp[i+1]='
for(i=0;
constnum;
{if(strcmp(integer[i],digittp)==0)
{source[sounum][0]=3;
newnum=0;
if(newnum==1)
{integer[constnum]=(char*)malloc(sizeof(digittp));
strcpy(integer[constnum],digittp);
source[sounum][0]=3;
source[sounum][1]=constnum;
constnum++;
charotherprocess(charbuffer)//:
其他字符处理函数;
charbuff1;
if(buffer=='
\n'
)//将行号标志符存入数组
{line++;
source[sounum][0]=5;
//行号以5作为标记
source[sounum][1]=line;
return(buffer);
elseif(buffer=='
'
)
{buffer=fgetc(fp);
while(buffer=='
{buffer=fgetc(fp);
buff1=buffer;
return(buff1);
else
{charbuffer1,buffer2,buffer3[3];
buffer1=buffer;
buffer2=fgetc(fp);
//处理双字符的符号
if(buffer2=='
'
||buffer2=='
='
.'
{buffer3[0]=buffer1;
buffer3[1]=buffer2;
buffer3[2]='
inti=0;
intre=0,id=0;
21&
{if(strcmp(character[i],buffer3)==0)
\n\t特殊字符:
character[i]);
source[sounum][0]=2;
//将特殊字符的位置放入数组之中
id=1;
if(id==0)
{printf("
\n字符错误,在%d行-->
line,buffer1);
error1++;
buffer1=fgetc(fp);
return(buffer1);
//处理单字符的符号
buffer3[1]='
intid=0;
line,buffer3);
error1++;
return(buffer2);
voidscan()
{charcbuffer;
printf("
\n请输入文件名:
);
scanf("
&
filename);
p=filename;
if((fp=fopen(p,"
r"
))==NULL)
\n很抱歉,该文件打不开,请选择另一个!
\n"
openfile=0;
{cbuffer=fgetc(fp);
while(cbuffer!
=EOF)
if(isalpha(cbuffer))
cbuffer=alphaprocess(cbuffer);
elseif(isdigit(cbuffer))
cbuffer=digitprocess(cbuffer);
elseif(cbuffer=='
/'
)//处理注释
cbuffer=fgetc