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

Posted jinwhy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了词法分析程序的设计与实现相关的知识,希望对你有一定的参考价值。

词法分析程序(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 max 200
char pro[max],lin[20];
int n,i,syn;
char   *word[6]={ "begin", "if" , "then", "while", "do" ,"end" }; 
char ch;
void scaner(){
	int j=0;
	for(n=0;n<20;n++)
	lin[n]=NULL;
	ch=pro[i++];
	while (ch==‘ ‘)
    ch=pro[i++];
    if((ch>=‘A‘&&ch<=‘Z‘)||(ch>=‘a‘&&ch<=‘z‘)||(ch>=48&&ch<=57))
	{
    	if((ch>=‘A‘&&ch<=‘Z‘)||(ch>=‘a‘&&ch<=‘z‘)){
    		lin[j++]=ch;
    		ch=pro[i++];
    	while((ch>=‘A‘&&ch<=‘Z‘)||(ch>=‘a‘&&ch<=‘z‘)||(ch>=48&&ch<=57))
    	{
    		lin[j++]=ch;
    		ch=pro[i++];
    	}
    	
    	lin[j]=‘‘;
    	i--;
    	syn=10;
    	 for (n=0;n<6;n++)
    	 if (strcmp(lin,word[n])==0)
    	 {
    	 	syn=n+1;
    	 	break;
    	 }
    	 
    }
    else
	{
    	while(ch>=48&&ch<=57)
    	{
    		lin[j++]=ch;
    		ch=pro[i++];
    	}
    	i--;
    	lin[j]=‘‘;
    	syn=11;
    }
    
}
else
   {
   	if(ch==‘<‘)
   	{
   		lin[j++]=ch;
   		ch=pro[i++];
   		if(ch==‘>‘)
   		{
   			syn=21;
   			lin[j++]=ch;
   			lin[j]=‘‘;
   			
   		}
   		else if(ch==‘=‘)
   		{
   			syn=22;
   			lin[j++]=ch;
   			lin[j]=‘‘;
   		}
   		else
   		{
   			syn=20;
   			lin[j]=‘‘;
   			i--;
   		}
   	}
   	else if (ch==‘>‘)
   	{
   		lin[j++]=ch;
   		ch=pro[i++];
   		if(ch==‘=‘)
   		{
   			syn=24;
   			lin[j++]=ch;
   			lin[j]=‘‘;
   		}
   		else{
   			syn=23;
   			lin[j]=‘‘;
   			i--;
   		}
   	}
   	else if(ch==‘:‘)
   	{
   		lin[j++]=ch;
   		ch=pro[i++];
   		if(ch==‘=‘)
   		{
   			syn=18;
   			lin[j++]=ch;
   			lin[j]=‘‘;
   		}
   		else
   		{
   			syn=17;
   			lin[j]=‘‘;
   			i--;
   		}
   	}
   	else if(ch==‘+‘)
   	{
   		syn=13;
   		lin[j++]=ch;
   		lin[j]=‘‘;
   	}
   	else if (ch==‘-‘)
   	{
   		syn=14;
   		lin[j++]=ch;
   		lin[j]=‘‘;
   	}
   	else if (ch==‘*‘)
   	{
   		syn=16;
   		lin[j++]=ch;
   		lin[j]=‘‘;
   	}
   	else if (ch==‘/‘)
   	{
   		syn=16;
   		lin[j++]=ch;
   		lin[j]=‘‘;
   	}
   	else if (ch==‘=‘)
   	{
   		syn=25;
   		lin[j++]=ch;
   		lin[j]=‘‘;
   	}
   	else if (ch==‘;‘)
   	{
   		syn=26;
   		lin[j++]=ch;
   		lin[j]=‘‘;
   	}
   	else if (ch==‘(‘)
   	{
   		syn=27;
   		lin[j++]=ch;
   		lin[j]=‘‘;
   	}
   	else if (ch==‘)‘)
   	{
   		syn=28;
   		lin[j++]=ch;
   		lin[j]=‘‘;
   	}
   	else if (ch==‘#‘)
   	{
   		syn=0;
   		lin[j++]=ch;
   		lin[j]=‘‘;
   	}
   	else 
   	syn=-1;
   }
   return ;
}

void read()
{
	FILE *fp;
	int k;
	fp=fopen("shi_yan.txt","r");
	for (k=0;k<max-1;k++)
	{
		fscanf(fp,"%c",&pro[k]);
	}
	pro[k]=‘‘;
	fclose(fp);
}

int main(void)
{
	int i=0;
	printf("**************************************************************************
");
	printf("*********************************种别编码*********************************
");
	printf("**************************************************************************
");
	printf("(1,begin)       (2,if)                 (3,then)         (4,while)    (5,do)
");
	printf("(6,end)         (10,基本标示符)        (11,数字)        (13,+)       (14,-)
");
	printf("(15,*)          (16,/)                 (17,:)           (18,:=)      (20,<)
");
	printf("(21,<>)         (22,<=)                (23,>)           (24,>=)      (25,=)
");
	printf("(26,;)          (27,()                 (28,))           (0,#)
");
	
	read();
	printf("

读入的字符串如下:

");
	puts(pro);
	printf( "
词法分析结果如下:
" );
	printf( "
" );
	do
	{
		scaner();
		switch(syn)
		{
			case 11: 
			  printf("(%d,%s)
",syn,lin);
			  break;
			case -1:
			  printf("错误符号
");
			  break;
			 default:
			  printf("(%d,%s)
",syn,lin);
		}
		
	}
	while (syn!=0);
	printf( "
词法分析结束
" );
	scanf("%c",&i);
	return 0;
}

(代码知识不太精通)

参考于:https://blog.csdn.net/xyy410874116/article/details/6397549   https://blog.csdn.net/fybshy/article/details/31826321

以上是关于词法分析程序的设计与实现的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

编译原理之词法分析程序的设计与实现