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

📄 my.cpp

📁 编译原理 词法分析 是个不错的词法分析器,已通过编译
💻 CPP
字号:
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#include<iostream.h>
 
char prog[200],token[20];    //taken[]用来存放构成单词符号的字符串
char ch;
int syn;					 //用来存放谒符号的种别码
int p;					 //缓冲区prog的指针
int m=0;				  //taken的指针
int n;					//rwtable下标
int sum;				 //s存放整形单词
char *rwtable[6]={"begin","if","then","while","do","end"};		//关键字
void scaner(void);
void main()
{
	system("color 47");					//设置字体背景颜色
	p=0;
	printf("\n 请输入字符串:\n");
	do								//获得字符串,放到prog[]中
	{
		ch=getchar();
		prog[p++]=ch;
	}while('#'!=ch);
	p=0;
	int b=1;					//每输出5个回车换行
	do
	{
		scaner();						//调用扫描函数
		switch(syn)
		{
		case 11:							//数字
			printf("(11, %d)  ",sum);		
			break;
		case -1:							//错误
			printf("(ERR,'%s')  ",token);
			break;
		default:							//字母与运算符
			printf("(%d, '%s')  ",syn,token);
		}
		if(b++%5==0)							//每5个换行
		{
			printf("\n\n");
		}

	}while(syn!=0);
	system("pause");
}

void scaner(void)
{
	for(n=0;n<20;n++)						//初始化
		token[n]=NULL;
	ch=prog[p++];
	while(' '==ch||'	'==ch||'\n'==ch||'\t'==ch)		//滤掉分隔符
		ch=prog[p++];
	if((ch>='a')&&(ch<='z'))							//如果是字母
	{
		m=0;
		while(((ch>='a')&&(ch<='z'))||((ch>='0')&&(ch<='9')))	//是字母或数字读下一个
		{
			token[m++]=ch;
			ch=prog[p++];
		}
		token[m]='\0';
		p--;
		syn=10;
		for(n=0;n<6;n++)							//判断是不是关键字
			if(0==strcmp(token,rwtable[n]))
			{
				syn=n+1;
				break;
			}
	}
	else if((ch>='0')&&(ch<='9'))				//如果是数字
		{
			sum=0;								//sum置0
			m=0;
			syn=11;
			token[m++]=ch;
			while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z'))	//是数字字符读下一个字符
			{
				token[m++]=ch;
				if(ch>='0'&&ch<='9')
				{
					sum=sum*10+ch-'0';
					ch=prog[p++];
				}
				else							//只要其中有一个不是数字,syn=-1
				{
					ch=prog[p++];
					syn=-1;

				}
				
			}
			token[m++]='\0';			//让token成字符串
			p--;						//prog的指针减1.因为此进prog的指针指向的已经不是数字或字母了
		}
	else switch(ch)						//其它字符
	{
		case'<':
			{
		
				m=0;
				token[m++]=ch;
				ch=prog[p++];
				if('>'==ch)					// <>
				{
					syn=21;
					token[m++]=ch;
					token[m++]='\0';
				}
				else if('='==ch)			// <=
				{
					syn=22;
					token[m++]=ch;
					token[m++]='\0';
				}
				else						// <
				{
					token[m++]='\0';
					syn=20;
					p--;
				}
				break;
			}
		case'>':
			{
				m=0;
				token[m++]=ch;
				ch=prog[p++];
				if('='==ch)			//  >=
				{
					syn=24;
					token[m++]=ch;
					token[m++]='\0';
				}
				else				//  >
				{
					token[m++]='\0';
					syn=23;
					p--;
				}
				break;
			}
		case':':
			{
				m=0;
				token[m++]=ch;
				ch=prog[p++];
				if('='==ch)					//   :=
				{
					syn=18;
					token[m++]=ch;
					token[m++]='\0';
				}
				else						//  =
				{
					token[m++]='\0';
					syn=17;
					p--;
				}
				break;
			}
 
		case'+':
			{
				syn=13;
				token[0]=ch;
				token[1]='\0';
				break;
			}
		case'-':
			{
				syn=14;
				token[0]=ch;
				token[1]='\0';
				break;
			}
		case'*':
			{
				syn=15;
				token[0]=ch;
				token[1]='\0';
				break;
			}
		case'/':
			{
				syn=16;
				token[0]=ch;
				token[1]='\0';
				break;
			}
		case'=':
			{
				syn=25;
				token[0]=ch;
				token[1]='\0';
				break;
			}
		case';':
			{
				syn=26;
				token[0]=ch;
				token[1]='\0';
				break;
			}
		case'(':
			{
				syn=27;
				token[0]=ch;
				token[1]='\0';
				break;
			}
		case')':
			{
				syn=28;
				token[0]=ch;
				token[1]='\0';
				break;
			}
		case'#':
			{
				syn=0;
				token[0]=ch;
				token[1]='\0';
				break;
			}
		default:
			{
				syn=-1;
				token[0]=ch;
				token[1]='\0';
			}
	}

}

⌨️ 快捷键说明

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