词法分析器-计算器-设计与实现实验报告.docx

上传人:b****9 文档编号:158701 上传时间:2022-10-04 格式:DOCX 页数:21 大小:55.38KB
下载 相关 举报
词法分析器-计算器-设计与实现实验报告.docx_第1页
第1页 / 共21页
词法分析器-计算器-设计与实现实验报告.docx_第2页
第2页 / 共21页
词法分析器-计算器-设计与实现实验报告.docx_第3页
第3页 / 共21页
词法分析器-计算器-设计与实现实验报告.docx_第4页
第4页 / 共21页
词法分析器-计算器-设计与实现实验报告.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

词法分析器-计算器-设计与实现实验报告.docx

《词法分析器-计算器-设计与实现实验报告.docx》由会员分享,可在线阅读,更多相关《词法分析器-计算器-设计与实现实验报告.docx(21页珍藏版)》请在冰豆网上搜索。

词法分析器-计算器-设计与实现实验报告.docx

辅导教师 张静 成绩

实验日期

实验时间

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;t

if(flagg!

=-1)printf("(nu,%d)",flagg);else

{

nu[qq]=numbuf;printf("(nu,%d)",qq);

qq++;

}

}

else

{



printf("(");

for(inti=0;i

printf(",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;i

printf("%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;i

printf("%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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1