编译原理词法分析实验报告Word格式文档下载.docx
《编译原理词法分析实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析实验报告Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
a"
;
a<
z"
)return1;
/_添加了判断是否为英文字母的函数_/
A"
Z"
return0;
}
intisDigit(chara)
//判断是否是数字{
if((a-"
0"
)>
=0;
(a-"
)<
=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]=="
_"
))
//判断是否符合首字母为字母,数字或下划线。
//符合就赋值,继续匹配。
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<
pp;
t++)//判断是否重复出现过,并且标记flag。
if(strcmp(id[t].c_str,wordbuf)==0)//判断字符串是否相等。
flagg=t;
if(flagg!
=-1)//如果不存在直接输出。
printf(“(id,%d)”,flagg);
id[pp]=wordbuf;
//若存在输出原编号
printf(“(id,%d)”,pp);
pp++;
//下表加一。
Else//输出匹配到的关键字。
printf(“(”);
for(inti=0;
i<
n;
i++)
printf(“%c”,wordbuf[i]);
printf(“,-)”);
returnst;
//返回下标}
intnumber(intst)
//识别整数{
charnumbuf[20]=“”;
//定义一个数组存数字
intk=0;
numbuf[n]=rz[st];
if(isDigit(rz[st])==1)//如果是数字存入数组
elseif((k==0);
(rz[st]=="
."
))//否则
k++;
elseif(isLetter(rz[st])==1)
{
continue;
qq;
t++)
if(strcmp(nu[t].c_str,numbuf)==0)
=-1)
printf(“(nu,%d)”,flagg);
nu[qq]=numbuf;
printf(“(nu,%d)”,qq);
qq++;
}
else{
printf(“%c”,numbuf[i]);
printf(“,errordigital!
)”);
}intanotation(intst)
//处理除号/和注释,给此函数的语句加上注释
chartabuf[9999]=“”;
//定义字符数组,用来存放需要判断的字符。
//指针指向第一位
if(rz[st]=="
/"
//形成单行注释
printf(“
(//,-)”);
//将其输出
//指针指向下一位
while(rz[st]!
=10)
//当遇到换行符时跳出,否则持续赋值注释内容
tabuf[n]=rz[st];
//赋值
printf(“\n注释”);
i++)//输出注释的信息
printf(“%c”,tabuf[i]);
elseif(rz[st]=="
//形成多行注释
(/_,-)
”);
intstt=st+1;
while
(1)
;
rz[st+1]=="
)//遇到_/跳出循环
//赋值
//指针指向下一位
if(rz[st+1]=="
\0"
)//空格就报错!
printf(“(/_
error!
!
\n)”);
returnst+1;
//返回
i++)//输出注释的内容
(_/,-)
st=st+2;
elseprintf(“
(/,-)
//返回下标}intother(intst)
//函数识别其他特殊字符{
switch(rz[st])
case"
:
printf(“(rlop,==)
printf(“(rlop,=)
+"
(+=,-)
(++,-)
(+,-)
-"
(-=,-)
(--,-)
(-,-)
)
(_=,-)
(_,-)”);
>
"
printf(“(rlop,>
=)
elseprintf(“(rlop,>
<
printf(“(rlop,<
%"
(\%=,-)”);
(\%,-)
(!
=,-)
wrongthing!
printf(“(;
-)
elseprintf(“(;
worngword!
|"
(||,-)
(|,worngword!
)
{"
({,-)
}"
(},-)
("
((,-)
)"
["
([,-)
]"
(],-)
(:
#"
(#,-)
(;
(.,-)
"
(,,-)
"
case"
case10:
printf(“\n”);
case34:
printf(“(\”,-)
“);
case39:
printf(”
default:
(%c,worngthing)“,rz[st]);
}intchoice(intst)
//根据读入的单词的第一个字符确定调用不同的单词识别函数{
if(isLetter(rz[st])==1)
st=alpha(st);
elseif(isDigit(rz[st])==1)
st=number(st);
/_调用函数_/
st=anotation(st);
/_调用函数_/
st=other(st);
}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]!
="
j=choice(j);
cout<
endl<
”
程序中标示符如下“<
endl;
for(i=0;
“<
id[i]<
”程序中数字如下“<
for(j=0;
j<
j++)
nu[j]<
system(”pause;
);
}五.运行结果及分析
六.实验心得