编译原理词法分析器实验报告doc.docx
- 文档编号:28660357
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:29
- 大小:79.53KB
编译原理词法分析器实验报告doc.docx
《编译原理词法分析器实验报告doc.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析器实验报告doc.docx(29页珍藏版)》请在冰豆网上搜索。
编译原理词法分析器实验报告doc
词法分析器实验报告
实验目的:
设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。
功能描述:
该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立意义的
单词,即基本保留字、标识符、常数、运算符、分隔符五大类。
并依次输出各个单词的内
部编码及单词符号自身值。
(遇到错误时可显示“Error!
”,然后跳过错误部分继续进
行)
设计思想:
设计该词法分析器的过程中虽然没有实际将所有的状态转移表建立出来,但是所用的
思想是根据状态转移表实现对单词的识别。
首先构造一个保留字表,然后,每输入一个字符
就检测应该进入什么状态,并将该字符连接到d串后继续输入,如此循环,最后根据所在的
接受状态以及保留字表识别单词。
符号表:
记号类别属性值
ws--
const
保留字
1
var
保留字
1
call
保留字
1
begin
保留字
1
if
保留字
1
while
保留字
1
do
保留字
1
odd
保留字
1
end
保留字
1
then
保留字
1
procedure
保留字
1
=
运算符
2
<
运算符
2
<=
运算符
2
<>
运算符
2
>
运算符
2
>=
运算符
2
*
运算符
2
+
运算符
2
-
运算符
2
/
运算符
2
:
=
运算符
2
ident
标识符
3
number
常数
4
(分隔符5
)分隔符5
;分隔符5
分隔符5
.分隔符5
状态转换图:
①标识符及保留字:
letteror
Startlette
②number:
other
other
digit
Edigit
③关系操作符:
start
<
=
(<=,2)
>
(<>,2)
other
=
*
(<,2)
(=,2)
>
:
=
(>=,2)
other
*
(>,2)
=
(:
=,2)
④分隔符:
;
start
(;,5)
((,5)
(),5)
(,,5)
(.,5)
⑤算术运算符:
+
start
(+,2)
(-,2)
(*,2)
(/,2)
使用环境:
Windowsxp下的visualc++6.0
程序测试:
input1:
inta,b;
a=b+2;
input2:
while(a>=0)
do
7x=x+6.7E+23;
end;
input3:
begin:
x:
=9
ifx>0thenx:
=x+1;
whilea:
=0do
b:
=2*x/3,c:
=a;
end;
output1:
output2:
5,;
3,int
1,while
3,a
5,(
5,,
3,a
3,b
2,>=
5,;
4,0
3,a
5,)
2,=
1,do
3,b
errorline3
2,+
2,=
4,2
3,x
5,;
2,+
4,6.7E+23
5,;
1,end
output3:
2,:
=
4,2
1,begin
3,x
2,*
errorline1
2,+
3,x
3,x
4,1
2,/
2,:
=
5,;
4,3
4,9
1,while
5,,
1,if
3,a
3,c
3,x
2,:
=
2,:
=
2,>
4,0
3,a
4,0
1,do
5,;
1,then
3,b
1,end
3,x
2,:
=
5,;
测试结果与预期结果一致
源程序代码:
#include
#include
voidmain()
{
inti=0,j,k=0,state=1,f=0,linenum=1;
char
a[11][10]={"const","var","call","begin","if","while","do","odd","end","t
hen","procedure"};
charb,d[40]={"\0"};
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
b=getchar();
while(b!
=EOF)/*判断所输入字符是否为结束符*/
{
if(b==''||b=='\n'||b=='\t')/*滤过空格、换行等分隔符号*/
{if(b='\n')linenum++;
b=getchar();
}
elseif((b>='a'&&b<='z')||(b>='A'&&b<='Z'))/*识别标识符以及保留字
*/
{
d[i++]=b;
b=getchar();
while((b>='a'&&b<='z')||(b>='A'&&b<='Z')||(b>='0'&&b<='9'))
{
d[i++]=b;
b=getchar();
}
for(j=0;j<11;j++)/*查询保留字表确定该单词是否是保留字*/
{if(strcmp(d,a[j])==0){printf("1,%s\n",d);
k=1;
break;
}
}
if(k==0)/*在保留字表中没有查到该单词,是标识符*/
printf("3,%s\n",d);
for(j=0;j<=i;j++)
d[j]='\0';
i=0;
k=0;
}
elseif(b>='0'&&b<='9')/*识别常数*/
{d[i++]=b;b=getchar();while(f!
=1){
switch(state){
case1:
if(b>='0'&&b<='9'){
state=1;
d[i++]=b;
b=getchar();}
elseif(b=='.'){state=2;d[i++]=b;b=getchar();}
elseif(b=='E'){state=4;d[i++]=b;b=getchar();}
elsestate=7;
break;
case2:
if(b>='0'&&b<='9'){
state=3;
d[i++]=b;
b=getchar();}
elsestate=8;
break;
case3:
if(b>='0'&&b<='9'){
state=3;
d[i++]=b;
b=getchar();}
elseif(b=='E'){state=4;d[i++]=b;b=getchar();}
elsestate=7;
break;
case4:
if(b=='+'||b=='-'){state=5;d[i++]=b;b=getchar();}
else
if(b>='0'&&b<='9'){state=6;d[i++]=b;b=getchar();}
elsestate=8;
break;
case5:
if(b>='0'&&b<='9'){state=6;d[i++]=b;b=getchar();}
elsestate=8;
break;
case6:
if(b>='0'&&b<='9'){state=6;d[i++]=b;b=getchar();}
elsestate=7;
break;
case7:
f=1;break;
case8:
f=1;break;
}
}
if(state==7&&(b<'a'||b>'z')&&(b<'A'||b>'Z'))
printf("4,%s\n",d);
elseif(state==7&&(b>='a'&&b<='z')||(b>='A'&&b<='Z'))/*数字后接字
母的出错控制*/
{
while((b>='a'&&b<='z')||(b>='A'&&b<='Z'))
{d[i++]=b;
b=getchar();
}
printf("errorline%d\n",linenum);
}
elseprintf("errorline%d\n",linenum);
for(j=0;j<=i;j++)
d[j]='\0';
i=0;
f=0;
state=1;
}
elseif(b=='<')/*识别'<'、'<='和'<>'*/
{d[i++]=b;b=getchar();
if(b=='='||b=='>'){d[i++]=b;
b=getchar();
printf("2,%s\n",d);
for(j=0;j<=i;j++)
d[j]='\0';
i=0;
}
else
{printf("2,%s\n",d);
for(j=0;j<=i;j++)
d[j]='\0';
i=0;
}
}
elseif(b=='>')/*识别'>'和'>='*/
{d[i++]=b;b=getchar();if(b=='=')
{d[i++]=b;b=getchar();
printf("2,%s\n",d);
for(j=0;j<=i;j++)
d[j]='\0';
i=0;
}
else
{printf("2,%s\n",d);
for(j=0;j<=i;j++)
d[j]='\0';
i=0;
}
}
elseif(b==':
')/*识别':
='*/
{d[i++]=b;b=getchar();
if(b=='=')
{d[i++]=b;b=getchar();
printf("2,%s\n",d);
}
elseprintf("errorline%d\n",linenum);
for(j=0;j<=i;j++)
d[j]='\0';
i=0;
}
elseif(b=='*'||b=='+'||b=='-'||b=='/'||b=='=')/*识别运算符*/
{printf("2,%c\n",b);b=getchar();
}
elseif(b=='('||b==')'||b==','||b==';'||b=='.')/*识别分隔符*/
{printf("5,%c\n",b);b=getchar();
}
else
{printf("errorline%d\n",linenum);
b=getchar();
}
}
}
实验心得:
此次实验让我了解了如何设计、编制并调试词法分析程序,并加深了我对词法分
析器原理的理解;熟悉了直接构造词法分析器的方法和相关原理,并学会使用c语
言直接编写词法分析器;同时更熟练的掌握用c语言编写程序,实现一定的实际功
能。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 词法 分析器 实验 报告 doc