⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 0.cpp

📁 词法分析器 词法分析器的具体源程序和源代码
💻 CPP
字号:
#include   <stdio.h>   
#include   <stdlib.h>   
#include   <string.h>   
#include   <ctype.h>   
#define   LEN   sizeof(struct   Node)   
#define   NULL   0   

struct   Node   
{char   data;   
struct  Node   *next;   /*   定义动态链表数据结构   */   
};   


void   output(struct   Node*);/*扫描输出函数*/   
void   scaner();   /*词法分析*/   
void   getbc();   
void   getch();   
void   concat();   
int   letter(char   ch);   
int   degit(char   ch);   
int   reserve();   
void   retract();   
void   back(int   a,char   *b);   

struct   Node   *head,*p;   
char   ch;   /*全局变量*/   
char   *key[]={"main","int","char","if","else","for","while"};   /*关键字表*/   
char   token[20];   /*字符数组,存放构成单词的符号串*/   

int   main(void)   
{   
	head=(struct   Node   *)malloc(LEN);   /*分配头节点存储空间*/   
	if(!head)   {printf("error");exit(1);}   
	head->next=NULL;   
	head->data=' ';   
	p=head;   
	printf("When input a \'$\' at the beigining of an line,this programe will be over.\n");   
	printf("And  the programe will output the codes you inputed  just now.\n");   
	printf("Please  input   your  codes:\n");   
    
	while(1)   
	{   int   i=0;   
	char   temp[256];/*每行长度不超过256个字符*/   
	gets(temp);   /*输入源程序,以行为单位*/   
	if(temp[0]=='$')   break;/*当输入的第一个字符为$时表示输入源代码结束*/   
    
	p->next=(struct   Node   *)malloc(LEN);   
	if(!(head->next))   {printf("error");exit(1);}   
	p=p->next;   
    
	while(temp[i]!='\0'   &&   i<256)             /*将输入的代码以行为单位存入缓冲区*/   
	{   
		p->data=temp[i];   
		p->next=(struct   Node   *)malloc(LEN);   
        if(!(p->next))   {printf("error");exit(1);}   
		p=p->next;   
		i++;   
    }   
	p->data='\n';   
	p->next=NULL;             /*尾结点*/   
	}   
    
	output(head);           /*扫描缓冲区,输出结果*/   
	p=head->next;   
	while(p->next!=NULL)   
		scaner();           /*词法分析*/   
    
	system("pause");   
	return   0;   
}   

void   output(struct   Node   *head)                           /*扫描缓冲区函数*/   
{   if(!head)   {printf("error");exit(1);}   
p=head->next;   
while(p->next!=NULL)   
{   
	printf("%c",p->data);   
	p=p->next;   
}   
printf("\n");   
}   

void   getbc()   /*若ch中是空白字符,则不停调用getch()直到读入的不是空白字符为止*/   
{   
	while   (ch=='   ')   
		getch();   
}   

void   getch()         /*从缓冲区读入一字符*/   
{   
	ch=p->data;   
	p=p->next;   
}   

void   concat()       /*将ch中的字符连接到token的后面*/   
{   
	unsigned   int   i;   
	i=strlen(token);   
	token[i]=ch;   
	token[i+1]='\0';   
}   

int   letter(char   ch)   /*判断ch中的是否是字母*/   
{   
	return   isalpha((int)ch);   
}   

int   digit(char   ch)     /*判断ch中的是否是数字*/   
{   
	return   isdigit((int)ch);   
}   

int   reserve()   /*判断token中的字符串是否是关键字或是标识符*/   
{   
	int   k;   
	for(k=0;k<6;k++)   
	{   
		if(strcmp(key[k],token)==0)   return   (k+1);   
	}   
	return   10;   
}   

void   retract()   /*指针回退一个字符*/   
{   
	struct   Node   *Q;   
	Q=head->next;   
	while(Q->next!=p)   
		Q=Q->next;   
	p=Q;   
}   

void   back(int   a,char   *b)         /*返回函数,输出序列*/   
{   
	printf("(%d,%s)\n",a,b);   
}   


void   scaner()   /*词法分析函数*/   
{   
	int   c;   
	token[0]=NULL;   /*将token清空*/   
	getch();   
	getbc();   /*读入一个单词*/   
	if(letter(ch))   /*处理字符的情况*/   
	{   
		while(letter(ch)||digit(ch))   
		{   
			concat();   
			getch();   
		}   
		retract();   
		c=reserve();   
		if(c!=10)   back(c,token);   
		else   back(10,token);   
	}   
	else   if(digit(ch))   /*处理数字的情况*/   
	{   
		while(digit(ch))   
		{   
			concat();   
			getch();   
		}   
		retract();   
		printf("(20,%d)",atoi(token));   
	}   
	else   
		switch(ch)     /*处理特殊符号的情况*/   
	{   
  case'+':   back(22,"+");break;   
  case'-':   back(23,"-");break;   
  case'*':   back(24,"*");break;   
  case'/':   back(25,"/");break;   
  case'<':   getch();   
	  if(ch=='=')   back(38,"<=");   
	  retract();   
	  back(36,"<");   
	  break;   
  case'>':   getch();   
	  if(ch=='=')   back(37,">=");   
	  retract();   
	  back(35,">");   
	  break;   
  case';':   back(34,";");break;   
  case'{':   back(30,"{");break;   
  case'}':   back(31,"}");break;   
  case'(':   back(26,"(");break;   
  case')':   back(27,")");break;   
  case'=':   back(21,"=");break;   
  case'\n':   break;   
  default:   printf("error");break;   
	}   
}   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -