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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

词法分析器实验报告

实验目的:

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

功能描述:

该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error!”,然后跳过错误部分继续进行)

设计思想:

设计该词法分析器的过程中虽然没有实际将所有的状态转移表建立出来,但是所用的思想是根据状态转移表实现对单词的识别。首先构造一个保留字表,然后,每输入一个字符就检测应该进入什么状态,并将该字符连接到d串后继续输入,如此循环,最后根据所在的接受状态以及保留字表识别单词。

①标识符及保留字:

②number:

③关系操作符:

digit

digit

digit

E

digit

other

other

letter or

⑤算术运算符:

(<=, 2) * (<>, 2)

(<,2)

(>=, 2)

(>, 2)

(:=,2)

使用环境:

Windows xp下的visual c++6.0 程序测试:

input1 :

int a,b;

a=b+2;

input2:

while(a>=0)

do

7x=x+6.7E+23;

end;

input3:

begin:

x:=9

if x>0 then x:=x+1;

while a:=0 do

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

error line 3

2,=

3,x

2,+

4,6.7E+23

5,;

1,end

5,;

output3:

1,begin

error line 1

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 void main()

{

int i=0,j,k=0,state=1,f=0,linenum=1;

char

a[11][10]={"const","var","call","begin","if","while","do","odd","e nd","then","procedure"};

char b,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();

}

else if((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;

}

else if(b>='0'&&b<='9')/*识别常数*/

{ d[i++]=b;

b=getchar();

while(f!=1){

switch (state) {

case 1:

if(b>='0'&&b<='9') {

state=1;

d[i++]=b;

b=getchar();}

else if(b=='.') { state=2;d[i++]=b;b=getchar();}

else if(b=='E') { state=4;d[i++]=b;b=getchar();}

else state=7;

break;

case 2:

if(b>='0'&&b<='9') {

state=3;

d[i++]=b;

b=getchar();}

else state=8;

break;

case 3:

if(b>='0'&&b<='9') {

state=3;

d[i++]=b;

b=getchar();}

else if(b=='E') { state=4;d[i++]=b;b=getchar();} else state=7;

break;

case 4:

if(b=='+'||b=='-')

{ state=5;d[i++]=b;b=getchar();}

else

if(b>='0'&&b<='9'){ state=6;d[i++]=b;b=getchar();}

相关文档
最新文档