词法分析器-计算器-设计与实现实验报告.docx
《词法分析器-计算器-设计与实现实验报告.docx》由会员分享,可在线阅读,更多相关《词法分析器-计算器-设计与实现实验报告.docx(21页珍藏版)》请在冰豆网上搜索。
![词法分析器-计算器-设计与实现实验报告.docx](https://file1.bdocx.com/fileroot1/2022-10/4/6dc43afc-c73b-432a-8786-688953fe1ad6/6dc43afc-c73b-432a-8786-688953fe1ad61.gif)
辅导教师 张静 成绩
实验日期
实验时间
1实验名称:
词法分析器的设计与实现
2、实验目的
(1)掌握C语言单词符号的划分、正规式、状态转换图及词法分析器的实现。
(2)掌握词法分析程序的作用。
3、实验要求
(1)对任给的一个C语言源程序,能够滤掉空格、回车换行符、tab键及注释。
(2)识别各类单词符号,如关键字、标识符、运算符、常数、界符,结果以二元式形式输出,并构造符号表。
(3)输出有词法错误的单词及所在行号。
(在此阶段只能识别有限的词法错误)
4、实验原理
根据扫描到的单词符号的第一个字符的种类,分别转到相应的程序进行处理。
这些程序的功能就是识别以相应字符开头的各类单词符号。
5、实验步骤
(1)根据C语言各类单词的正规式,构造能识别各类单词的状态转换图。
(2)根据状态转换图,构造识别各类单词的词法分析器。
6、状态转换图及词法分析程序
状态转换图:
字母或数字
字母
非字母与数字
*
0 1 2
数字
非数字
*
3 4
运算符
*
5
界符
*
6
其他
*
7
空白
词法分析程序:
#include#include#include#includeusingnamespacestd;string
keywords[20]={"include","void","main","int","char","float","double","if","else","then
","break","continue","for","do","while","printf","scanf","begin","end","return"};charrz[99999]="";
stringid[10000];intpp=0;
stringnu[10000];intqq=0;
intchoice1(chara) //判断是否是字母
{
if((a>='a'&&a<='z')||(a>='A'&&a<='Z'))return1;
elsereturn0;
}
intchoice2(chara) //判断是否是数字
{
if(a>='0'&&a<='9')
return1;
elsereturn0;
}
intalpha(intst) //识别保留字和标识符
{
charwordbuf[20]="";intn=0;
for(;;)
{
wordbuf[n]=rz[st];st++;
n++;
if((choice2(rz[st])==1)||(choice1(rz[st])==1)||(rz[st]=='_'))wordbuf[n]=rz[st];
elsebreak;
}
intflag=0;
for(intk=0;k<20;k++)
{
if(strcmp(keywords[k].c_str(),wordbuf)==0)flag=1;
}
if(flag==0)
{
intflagg=-1;
for(intt=0;t{
if(strcmp(id[t].c_str(),wordbuf)==0)
{
flagg=t;
}
}
if(flagg!
=-1)printf("(id,%d)",flagg);else
{
id[pp]=wordbuf;printf("(id,%d)",pp);
pp++;
}
}
else
{
printf("(");
for(inti=0;i{
printf("%c",wordbuf[i]);
}
printf(",-)");
}
returnst;
}
intnumber(intst) //识别整数
{
charnumbuf[20]="";intn=0;
intk=0;intflag=0;for(;;)
{
numbuf[n]=rz[st];st++;
n++;
if(choice2(rz[st])==1)
{
numbuf[n]=rz[st];
}
elseif((k==0)&&(rz[st]=='.'))
{
numbuf[n]=rz[st];k++;
}
elseif(choice1(rz[st])==1)
{
numbuf[n]=rz[st];flag=1;
continue;
}
elsebreak;
}
if(flag==0)
{
intflagg=-1;
for(intt=0;tif(flagg!
=-1)printf("(nu,%d)",flagg);else
{
nu[qq]=numbuf;printf("(nu,%d)",qq);
qq++;
}
}
else
{
printf("(");
for(inti=0;iprintf(",errordigital!
) ");
}
returnst;
}
intanotation(intst) //处理除号/和注释
{
chartabuf[9999]="";intn=0;
st++;
if(rz[st]=='/')
{
printf(" (//,-)");st++;while(rz[st]!
=10)
{
tabuf[n]=rz[st];st++;
n++;
}
printf("\n注释");for(inti=0;iprintf("%c",tabuf[i]);
}
elseif(rz[st]=='*')
{
printf(" (/*,-) ");st++;
intstt=st+1;while
(1)
{
if(rz[st]=='*'&&rz[st+1]=='/')break;tabuf[n]=rz[st];
st++;n++;
if(rz[st+1]=='\0')
{
printf("(/*error!
!
\n)");
returnst+1;
}
} printf("\n注释");for(inti=0;iprintf("%c",tabuf[i]);
printf(" (*/,-) ");st=st+2;
}
elseif(rz[st]=='=')
{
st++;
printf("
(/*,-)
");
}
elseprintf("
(/,-)
");
returnst;
}
intother(intst) //函数识别其他特殊字符
{
switch(rz[st])
{
case'=':
st++;
if(rz[st]=='=')
{
st++;
printf(" (rlop,==) ");
}
elseprintf(" (rlop,=) ");
break;
case'+':
st++;
if(rz[st]=='=')
{
st++;
printf(" (+=,-) ");
}
elseif(rz[st]=='+')
{
st++;printf(" (++,-) ");
}
elseprintf(" (+,-) ");
break;
case'-':
st++;
if(rz[st]=='=')
{
st++;printf(" (-=,-) ");
}
elseif(rz[st]=='-')
{
st++;printf(" (--,-) ");
}
elseprintf(" (-,-) ");break;
case'*':
st++;
if(rz[st]=='=')
{
st++;printf(" (*=,-) ");
}
elseprintf(" (*,-) ");break;
case'>':
st++;
if(rz[st]=='=')
{
st++;
printf(" (rlop,>=) ");
}
elseprintf(" (rlop,>) ");break;
case'<':
st++;
if(rz[st]=='=')
{
st++;
printf(" (rlop,<=) ");
}
elseprintf(" (rlop,<) ");break;
case'%':
st++;
if(rz[st]=='=')
{
st++;
printf(" (\%=,-) ");
}
elseprintf(" (\%,-) ");break;
case'!
':
st++;
if(rz[st]=='=')
{
st++;
printf(" (!
=,-) ");
}
elseprintf(" (!
wrongthing!
) ");break;
case'&':
st++;
if(rz[st]=='&')
{
st++;
printf(" (&&,-) ");
}
elseprintf(" (&,worngword!
) ");break;
case'|':
st++;
if(rz[st]=='|')
{
st++;printf(" (||,-) ");
}
elseprintf(" (|,worngword!
) ");break;
case'{':
st++;printf(" ({,-) ");
break;case'}':
st++;
printf(" (},-) ");
break;case'(':
st++;
printf(" ((,-) ");
break;case')':
st++;
printf(" (),-) ");
break;case'[':
st++;
printf(" ([,-) ");
break;case']':
st++;
printf(" (],-) ");
break;case':
':
st++;
printf(" (:
-) ");
break;case'#':
st++;
printf(" (#,-) ");
break;case';':
st++;
printf(" (;,-) ");
break;case'.':
st++;
printf(" (.,-) ");
break;case',':
st++;
printf(" (,,-) ");
break;case'':
st++;
break;
case' ':
st++;break;
case10:
st++;printf("\n");
break;case34:
st++;
printf(" (\",-) ");break;
case39:
st++;printf(" (',-) ");
break;
default:
printf(" (%c,wo