1 / 18
文档名称:

编译原理设计c语言的词法分析器.docx

格式:docx   大小:91KB   页数:18页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

编译原理设计c语言的词法分析器.docx

上传人:zhangshut 2022/5/20 文件大小:91 KB

下载得到文件列表

编译原理设计c语言的词法分析器.docx

相关文档

文档介绍

文档介绍:编译原理课程设计报告
题目:
学院:
教师:
姓名:
学号:
班级:
评分:签字:
编译原理课程设计一:设计c语言的词法分析器
、实验目的
了解高级语言单词的分类,了解状态图以及如何表示并识别单词规那么,掌握状态图到{
intcont[300];
intlen;
}constnumber;
//读入一个字符
if((ch=getc(fp))==EOF)exit(1);
}
//读入一个非空字符
voidGetBC(FILE*fp)
{
while(ch==''||ch=='\n'||ch==9)Getchar(fp);
}
//连接字符
voidcontacat()
{
char*cht=&(ch);
strcat_s(token,cht);
}
//判断是否为字母
intletter()
{
returnisalpha(ch);
}
intdigit()
returnisdigit(ch);
//回退
voidretract(FILE*fp,char*c)
{
inta=ftell(fp);
fseek(fp,0,SEEK_SET);
fprintf_s(fp,"%c",ch);
ch='';
fseek(fp,a,SEEK_SET);
}
//处理保存字
intreserve(char**k)
{
inti;
for(i=0;i<LENGTH;i++)
{
if(strcmp(token,k[i])==0)return(i+1);
}
return0;
}
//处理标识符,查找符号表并存放位置假设没有那么添加
intsysmbol(identifier*id)
inti;
for(i=0;i<id->len;i++)
if(strcmp(token,id->I[i])==0)
returni+1;
if(id->len>256)
{
cout<<"error";
}
id->I[id->len]=token;
id->len++;
returnid->len;
}
//数字字符串转化为整数
intstr_to_num()
{
inti=0;
intk=token[i]-'0';
for(i=1;token[i]!='\0';i++)
{
k=k*10+token[i]-'0';
}
returnk;
}
//存入常数表,并返回它在常数表中的位置
intconstant(constnumber*con)
con->cont[con->len]=str_to_num();
con->len++;returncon->len;
//
写到文件
voidTofile(intnum,intval,identifier*id,constnumber*con,FILE*fw)
intnum_=num;
fprintf_s(fw,"(%d,",num);
if(num>=4)
fprintf_s(fw,"%s",CODE[num-1]);
if(num<4)
switch(num)case1:fprintf_s(fw,"%s",id->I[val-1]);break;
case2:fprintf_s(fw,"%d",con->cont[val-1]);break;
case3:fprintf_s(fw,"%s",k[val-1]);break;
fprintf_s(fw,")\n");
voiderror(FILE*fw)
cout<<"(Error,"<<ch<<")"<<endl;
fprintf_s(fw,"(Error,%c\n)",ch);
}
FILE
//词法分析函数
voidWordAnalyze(char**k,char*c,char**CODE,identifier*id,constnumber*con,FILE*fp,*fw)
{
intnum,val;
strcpy_s(token,"");//初始化为空字符串
Getchar(fp);
GetBC(fp);
if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))//分析标识符和保存字
{
//假设字符为A~Z或0~9,那么继续读取
while(letter()||digit())
{
contacat();
Getchar(fp);
}
retract(fp,c);
num=reserve(k);
if(num!=0)
Tofile(3,num,id,con,fw);
else
val=sy