(完整版)词法分析器(c语言实现)

(完整版)词法分析器(c语言实现)


2024年4月29日发(作者:)

词法分析c实现

一、实验目的

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

二、实验要求

2.1 待分析的简单的词法

(1)关键字:

begin if then while do end

所有的关键字都是小写。

(2)运算符和界符

: = + - * / < <= <> > >= = ; ( ) #

(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:

ID = letter (letter | digit)*

NUM = digit digit*

(4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符

和关键字,词法分析阶段通常被忽略。

2.2 各种单词符号对应的种别码:

表2.1 各种单词符号对应的种别码

单词符号

bgin

If

Then

wile

do

end

lettet(letter|digit)*

dight dight*

+

*

/

种别码

1

2

3

4

5

6

10

11

13

14

15

16

=

(

)

#

单词符号

:=

<

<>

<=

>

>=

种别码

17

18

20

21

22

23

24

25

26

27

28

0

2.3 词法分析程序的功能:

输入:所给文法的源程序字符串。

输出:二元组(syn,token或sum)构成的序列。

其中:syn为单词种别码;

token为存放的单词自身字符串;

sum为整型常数。

例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如

下序列:

(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……

三、词法分析程序的C语言程序源代码:

#include

#include

char prog[80],token[8],ch;

int syn,p,m,n,sum;

char *rwtab[6]={"begin","if","then","while","do","end"};

scaner();

main()

{p=0;

printf("n please input a string(end with '#'):/n");

do{

scanf("%c",&ch);

prog[p++]=ch;

}while(ch!='#');

p=0;

do{

scaner();

switch(syn)

{case 11:printf("( %-10d%5d )n",sum,syn);

break;

case -1:printf("you have input a wrong stringn");

getch();

exit(0);

default: printf("( %-10s%5d )n",token,syn);

break;

}

}while(syn!=0);

getch();

}

scaner()

{ sum=0;

for(m=0;m<8;m++)token[m++]=NULL;

ch=prog[p++];

m=0;

while((ch==' ')||(ch=='n'))ch=prog[p++];

if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))

{ while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))

{token[m++]=ch;

ch=prog[p++];

}

p--;

syn=10;

for(n=0;n<6;n++)

if(strcmp(token,rwtab[n])==0)

{ syn=n+1;

break;

}

}

else if((ch>='0')&&(ch<='9'))

{ while((ch>='0')&&(ch<='9'))

{ sum=sum*10+ch-'0';

ch=prog[p++];

}

p--;

syn=11;

}

else switch(ch)

{ case '<':token[m++]=ch;

ch=prog[p++];

if(ch=='=')

{ syn=22;

token[m++]=ch;

}

else

{ syn=20;

p--;

}

break;

case '>':token[m++]=ch;

ch=prog[p++];

if(ch=='=')

{ syn=24;

token[m++]=ch;

}

else

{ syn=23;

p--;

}

break;

case '+': token[m++]=ch;

ch=prog[p++];

if(ch=='+')

{ syn=17;

token[m++]=ch;

}

else

{ syn=13;

p--;

}

break;

case '-':token[m++]=ch;

ch=prog[p++];

if(ch=='-')

{ syn=29;

token[m++]=ch;

}

else

{ syn=14;

p--;

}

break;

case '!':ch=prog[p++];

if(ch=='=')

{ syn=21;

token[m++]=ch;

}

else

{ syn=31;

p--;

}

break;

case '=':token[m++]=ch;

ch=prog[p++];

if(ch=='=')

{ syn=25;

token[m++]=ch;

}

else

{ syn=18;

p--;

}

break;

case '*': syn=15;

token[m++]=ch;

break;

case '/': syn=16;

token[m++]=ch;

break;

case '(': syn=27;

token[m++]=ch;

break;

case ')': syn=28;

token[m++]=ch;

break;

case '{': syn=5;

token[m++]=ch;

break;

case '}': syn=6;

token[m++]=ch;

break;

case ';': syn=26;

token[m++]=ch;

break;

case '"': syn=30;

token[m++]=ch;

break;

case '#': syn=0;

token[m++]=ch;

break;

case ':':syn=17;

token[m++]=ch;

break;

default: syn=-1;

break;

}

token[m++]='0';

}

四、结果分析:

输入begin x:=9: if x>9 then x:=2*x+1/3; end # 后经词法分析输出如下序列:(begin

10)(:17)(= 18)(9 11)(;26)(if 2)…… 如图5-1所示:

1)(x


发布者:admin,转转请注明出处:http://www.yc00.com/web/1714379544a2435579.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信