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

📄 main.c

📁 简单的词法分析器
💻 C
字号:
#include<stdio.h>
#include<string.h>
#include<ctype.h>

char * rwtab[6] = {"begin","if","then","while","do","end"};
char prog[80] = "-12+23=12";
char token[10] = "begin" ;
char ch;
int pi,ti;    //pi是prog的指针,ti是token的指针
int syn,sum;  

void getch()
{
	ch = prog[pi];
	pi++;	
}

void getbc()
{
	while(ch == ' ' && ch != '\0')
		getch();
}

void concat()
{
	token[ti] = ch;
	ti++;
}

int letter()
{
	return isalpha(ch);
}

int digit()
{
	return isdigit(ch);
}

void retract()
{
	pi--;
}

int reserve()
{
	int i;
	for(i = 0 ; i < 6 ; i++)
	{
		if(!strcmp(rwtab[i],token))
			return i + 1;
	}
	return 10 ;
}

void inital()
{
	int i ;
	for( i = 0 ; i < 10 ; i++ )
		token[i] = '\0' ;
	sum = 0 ;
	ti = 0 ;
}

void scaner()
{	
	getch() ;
	getbc() ;
	inital() ;
	if(letter())
	{
		while( letter() || digit() )
		{
			token[ti++] = ch ;
			getch();
		}
		retract();		
		syn = reserve();
	}
	else if(digit())
	{
		if( digit() )
		{
			while( digit() )
			{
				sum = sum * 10 + ch - '0' ;
				getch();
			}
			retract();
			syn = 11 ;
		}
	}
	else
		switch( ch )
	{
		case '<' : token[ti++] = ch ;
			getch() ;
			if( ch == '>' )
			{
				syn = 21 ;
				token[ti++] = ch ;
			}
			else if( ch == '=' )
			{
				syn = 22 ;
				token[ti++] = ch ;
			}
			else
			{
				syn = 20 ;
				retract() ;
			}
			break ;
		case '>' : token[ti++] = ch ;
			getch() ;
			if( ch == '=' )
			{
				syn = 24 ;
				token[ti++] = ch ;
			}
			else
			{
				syn = 23 ;
				retract() ;
			}
			break ;
		case ':' : token[ti++] = ch ;
			getch() ;
			if( ch == '=' )
			{
				syn = 18 ;
				token[ti++] = ch ;
			}
			else
			{
				syn = 17 ;
				token[ti++] = ch ;
			}
			break ;
		case '+' : syn = 13 ; token[0] = ch ; break;
		case '-' : syn = 14 ; token[0] = ch ; break;
		case '*' : syn = 15 ; token[0] = ch ; break;
		case '/' : syn = 16 ; token[0] = ch ; break;
		case '=' : syn = 25 ; token[0] = ch ; break;
		case ';' : syn = 26 ; token[0] = ch ; break;
		case '(' : syn = 27 ; token[0] = ch ; break;
		case ')' : syn = 28 ; token[0] = ch ; break;
		case '#' : 
		case '\0' : syn = 0 ; token[0] = ch ; break;        //结束标记为'#'或'\0'
		default : syn = -1 ;
	}
}


int main()
{
	int flag ;
	do
	{
		flag = 1 ;
		scaner() ;
		switch( syn )
		{
		case -1 : printf("源程序中有非法字符\n"); flag = 0 ; break ;
		case 0  : printf("源程序编译结束\n"); flag = 0 ; break ;
		case 11 : printf("( %d , %d )\n",syn,sum) ; break ;
		default : printf("( %d , %s )\n",syn,token); break ;
		}
	}while(flag) ;
	return 0 ;
}

⌨️ 快捷键说明

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