编译原理词法分析器实验报告.docx

上传人:b****2 文档编号:24276615 上传时间:2023-05-26 格式:DOCX 页数:15 大小:67.74KB
下载 相关 举报
编译原理词法分析器实验报告.docx_第1页
第1页 / 共15页
编译原理词法分析器实验报告.docx_第2页
第2页 / 共15页
编译原理词法分析器实验报告.docx_第3页
第3页 / 共15页
编译原理词法分析器实验报告.docx_第4页
第4页 / 共15页
编译原理词法分析器实验报告.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

编译原理词法分析器实验报告.docx

《编译原理词法分析器实验报告.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析器实验报告.docx(15页珍藏版)》请在冰豆网上搜索。

编译原理词法分析器实验报告.docx

编译原理词法分析器实验报告

 

词法分析器实验报告

 

实验目的:

设计、编制、调试一个词法分析子程序-识别单词.加深对词法分析原理的理解。

功能描述:

该程序要实现的是一个读单词过程.从输入的源程序中.识别出各个具有独立意义的单词.即基本保留字、标识符、常数、运算符、分隔符五大类。

并依次输出各个单词的内部编码及单词符号自身值。

(遇到错误时可显示“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

状态转换图:

①标识符及保留字:

②number:

③关系操作符:

④分隔符:

 

⑤算术运算符:

使用环境:

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:

3,int

3,a

5,,

3,b

5,;

3,a

2,=

3,b

2,+

4,2

5,;

output2:

1,while

5,(

3,a

2,>=

4,0

5,)

1,do

errorline3

2,=

3,x

2,+

4,6.7E+23

5,;

1,end

5,;

output3:

1,begin

errorline1

3,x

2,:

=

4,9

1,if

3,x

2,>

4,0

1,then

3,x

2,:

=

3,x

2,+

4,1

5,;

1,while

3,a

2,:

=

4,0

1,do

3,b

2,:

=

4,2

2,*

3,x

2,/

4,3

5,,

3,c

2,:

=

3,a

5,;

1,end

5,;

测试结果与预期结果一致

 

源程序代码:

#include

#include

voidmain()

{

inti=0,j,k=0,state=1,f=0,linenum=1;

chara[11][10]={"const","var","call","begin","if","while","do","odd","end","then","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();}

elseif(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语言编写程序.实现一定的实际功能。

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

当前位置:首页 > 初中教育 > 政史地

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

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