词法分析程序的设计与实现

词法分析程序(Lexical Analyzer)要求:

- 从左至右扫描构成源程序的字符流

-  识别出有词法意义的单词(Lexemes

-  返回单词记录(单词类别,单词本身)

-  滤掉空格

-  跳过注释

-  发现词法错误

 

程序结构:

输入:字符流(什么输入方式,什么数据结构保存)

处理:

–遍历(什么遍历方式)

–词法规则

输出:单词流(什么输出形式)

–二元组

 

单词类别:

1.标识符(10)

2.无符号数(11)

3.保留字(一词一码)

4.运算符(一词一码)

5.界符(一词一码)

 

单词符号

种别码

单词符号

种别码

begin

1

:

17

if

2

:=

18

then

3

<

20

while

4

<=

21

do

5

<>

22

end

6

>

23

l(l|d)*

10

>=

24

dd*

11

=

25

+

13

;

26

-

14

(

27

*

15

)

28

/

16

#

0

#include<stdio.h>
#include<string.h>
#define N 80
char word[6][10]={"begin","if","then","while","do","end"};
void Analyse(char a[]);
main()
{
int i;
char a[N];
printf("请输入源程序:(以$结束)\n");
for(i=0;i<N;i++)
{
scanf("%c",&a[i]);
if(a[i]=='$')
break;
}
a[i+1]='\0';
i=0;
printf("词法分析结果为:\n");
Analyse(a);
}
void Analyse(char a[])
{
int i=0,j=0,n=0,m=0,temp=0;
char b[N];
while(a[i]!='$')
{
if(a[i]>=65&&a[i]<=122)
{
j=0;
while((a[i]>=65&&a[i]<=122)||(a[i]>='0'&&a[i]<='9')||a[i]=='_')
{
b[j]=a[i];
j++;
i++;
}
i--;
b[j]='\0';
for(n=0;n<6;n++)
{
if(strcmp(b,word[n])==0)
{
printf("<关键字,%d,",n+1);
while(word[n][m]!='\0')
{
printf("%c",word[n][m]);
m++;
}
printf(">\n");
temp=1;
}
}
if(temp==0)
printf("<标识符,10,%s>\n",b);

}
else
{
switch(a[i])
{
case '#': printf("<0,$>\n");
case '+': printf("<运算符,13,+>\n");break;
case '-': printf("<运算符,14,->\n");break;
case '*': printf("<运算符,15,*>\n");break;
case '/': printf("<运算符,16,/>\n");break;
case ':':if(a[i+1]=='=')
{
printf("<运算符,18,:=>\n");
i++;
}
else printf("<界符,17,:>\n");
break;
case '<': if(a[i+1]=='=')
{
printf("<运算符,21,<=>\n");
i++;
}
else if(a[i+1]=='>')
{
printf("<运算符,22,<>>\n");
i++;
}
else printf("<界符,20,<>\n");
break;
case '>': if(a[i+1]=='=')
{
printf("<运算符,24,>=>\n");
i++;
}
else printf("<界符,23,>>\n");
break;
case '=': printf("<25,=>\n");break;
case ';': printf("<界符,26,;>\n");break;
case '(': printf("<界符,27,(>\n");break;
case ')': printf("<界符,28,)>\n");break;
case' ': break;
case'\n': break;
default:
if(a[i]>='0'&&a[i]<='9')
printf("<数字,%c>\n",a[i]);
else
printf("'%c'输入错误!\n",a[i]);
break;
}
}
i++;
}

}

posted @ 2019-10-11 17:36  Chaiyeh  阅读(248)  评论(0)    收藏  举报