编译原理词法分析实验报告.docx
《编译原理词法分析实验报告.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
![编译原理词法分析实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/25/6205ec67-5495-4cb7-b44a-e04b4e4eb5a5/6205ec67-5495-4cb7-b44a-e04b4e4eb5a51.gif)
编译原理词法分析实验报告
编译原理词法分析实验报告
一.实验
题目:
设计基于C语言词法分析器二.实验目的:
通过设计编制调试C语言的词法分析程序,加深对词法分析原理的理解。
并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本字、标识符、常数、运算符、分隔符五大类。
并依次输出各个单词的内部编码及单词符号自身值。
三.词法分析器的算法分析:
(可用N-S图或流程图)
四.程序代码程序开始运行读取文件中的程序且分析读到的字符是字母识别保留字和标识符是是数字识别整数是否否是否是下划线否是识别其他的符号识别注释的内容输出程序的数字和标识符程序结束!
!
!
#include
usingnamespacestd;stringkeywords[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;
intisLetter(chara)
//判断是否是字母{
if(a>="a";;a<="z")return1;/_添加了判断是否为英文字母的函数_/
if(a>="A";;a<="Z")return1;
return0;}
intisDigit(chara)
//判断是否是数字{
if((a-"0")>=0;;(a-"0")<=9)return1;/_添加了判断是否为数字的函数_/
elsereturn0;}
intalpha(intst)
//识别保留字和标识符,给此函数的的语句加上注释。
{
charwordbuf[20]=“”;//定义一个字符数组,用来存放需要得判断字符。
intn=0;//指针只向第一位。
for(;;)
{
wordbuf[n]=rz[st];//吧要判断的字符赋值给字符数组。
st++;//指针往下一位指。
n++;//指针往下一位指。
if((isDigit(rz[st])==1)||(isLetter(rz[st])==1)||(rz[st]=="_"))
//判断是否符合首字母为字母,数字或下划线。
wordbuf[n]=rz[st];//符合就赋值,继续匹配。
else
break;//不符合就跳出函数。
}
intflag=0;
for(intk=0;k<20;k++)//判断上步所匹配的字符串是否为关键字。
是的话则将flag置1,否则继续匹配
{
if(strcmp(keywords[k].c_str,wordbuf)==0)//判断字符串是否相等。
flag=1;//相等将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(isDigit(rz[st])==1)//如果是数字存入数组
{
numbuf[n]=rz[st];
}
elseif((k==0);;(rz[st]=="."))//否则
{
numbuf[n]=rz[st];
k++;
}
elseif(isLetter(rz[st])==1)
{
numbuf[n]=rz[st];
flag=1;
continue;
}
else
break;
}
if(flag==0)
{
intflagg=-1;
for(intt=0;tif(strcmp(nu[t].c_str,numbuf)==0)
flagg=t;
if(flagg!
=-1)
printf(“(nu,%d)”,flagg);
else
{
nu[qq]=numbuf;
printf(“(nu,%d)”,qq);
qq++;
}
}
else{
printf(“(”);
for(inti=0;iprintf(“%c”,numbuf[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;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,==)
”);
}
else
printf(“(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(“
(--,-)
”);
}
else
printf(“
(-,-)
”);
break;
case"_":
st++;
if(rz[st]=="=")
{
st++;
printf(“
(_=,-)
”);
}
else
printf(“
(_,-)”);
break;
case">":
st++;
if(rz[st]=="=")
{
st++;
printf(“(rlop,>=)
”);
}
elseprintf(“(rlop,>)
”);
break;
case"<":
st++;
if(rz[st]=="=")
{
st++;
printf(“(rlop,<=)
”);
}
else
printf(“(rlop,<)
”);
break;
case"%":
st++;
if(rz[st]=="=")
{
st++;
printf(“
(\%=,-)”);
}
else
printf(“
(\%,-)
”);
break;
case"!
":
st++;
if(rz[st]=="=")
{
st++;
printf(“
(!
=,-)
”);
}
else
printf(“
(!
wrongthing!
)
”);
break;
case";":
st++;
if(rz[st]==";")
{
st++;
printf(“(;;,-)
”);
}
elseprintf(“(;,worngword!
)
”);
break;
case"|":
st++;
if(rz[st]=="|")
{
st++;
printf(“
(||,-)
”);
}
else
printf(“
(|,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,worngthing)“,rz[st]);
st++;
}
returnst;
}intchoice(intst)
//根据读入的单词的第一个字符确定调用不同的单词识别函数{
if(isLetter(rz[st])==1)
st=alpha(st);
elseif(isDigit(rz[st])==1)
st=number(st);/_调用函数_/
elseif(rz[st]=="/")
st=anotation(st);/_调用函数_/
else
st=other(st);/_调用函数_/
returnst;
}intmain{
inti=0;
FILE_
fp;
charname[10];
printf(”请输入文件名:
\n“);
scanf(”%s“,;name);
if((fp=fopen(name,”r“))==NULL)
{
printf(”Openerror!
“);
e_it(0);
}
charch=fgetc(fp);
while(ch!
=EOF)
{
rz[i]=ch;
i++;
ch=fgetc(fp);
}
fclose(fp);
intj=0;
while(rz[j]!
="\0")
j=choice(j);
cout<程序中标示符如下“<for(i=0;icout<
“<cout<<”程序中数字如下“<for(j=0;jcout<“<system(”pause;);
}五.运行结果及分析
六.实验心得