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

📄 f.cpp

📁 一个简单的词法分析程序,功能基本上实现了,有需要的可以下,希望对大家有帮助.
💻 CPP
字号:
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h> 
#include<string.h>
int i,j,k,flag,number,status;
/*status which is use to judge the string is keywords or not!*/
char ch;
char words[10] = {" "};
char program[500];
int Scan(char program[])
{
	char *keywords[13] = {"void","main","if","then","break","int",
		"char","float","include","for","while","printf",
		"scanf"};
	number=0;
	status=0;
	j=0;
	ch=program[i++];
	/* To handle the lettle space ands tab*/
	
	/*handle letters*/
	if((ch>='a')&&(ch<='z'))
	{
while((ch>='a') && (ch<='z'))
		{
			words[j++]=ch;
			ch=program[i++];
		}
		i--;
		words[j++]='\0';
		for(k=0;k<13;k++)
			if(strcmp(words,keywords[k])==0)
switch(k)
{
case 0:{
	flag=1;
	status=1;
	break;
       }
case 1:{
	flag=2;
	status=1;
	break;
       }
case 2:{
	flag=3;
	status=1;
	break;
       }
case 3:{
	flag=4;
	status=1;
	break;
       }
case 4:{
	flag=5;
	status=1;
	break;
       }
case 5:{
	flag=6;
	status=1;
	break;
       }
case 6:{
	flag=7;
	status=1;
	break;
       }
case 7:{
	flag=8;
	status=1;
	break;
       }
case 8:{
	flag=9;
	status=1;
	break;
       }
case 9:{
	flag=10;
	status=1;
	break;
       }
case 10:{
	flag=11;
	status=1;
	break;
	}
case 11:{
	flag=12;
	status=1;
	break;
	}
case 12:{
	flag=13;
	status=1;
	break;
	}
        }
	if(status==0)
        {
	flag=100;
	}
	}
	/*handle digits*/
	else if ((ch >= '0') && (ch <= '9'))
	{
		number = 0;
		while ((ch >= '0' ) && (ch <= '9' ))
		{
			number = number*10+(ch-'0');
			ch= program[i++];
		}
		flag=200;
		i--;
	}
	/*opereation and edge handle*/
	else switch (ch)
	{
case '=':{
	if (ch == '=')
	words[j++] = ch;
	words[j] = '\0';
	ch= program[i++];
	if (ch == '=')
	{
		words[j++] = ch;
		words[j] = '\0';
		flag= 401;
	}
	else
	{
		i--;
		flag= 402;
	}
	break;
	 }
case'>':{
	if (ch == '>')
		words[j++] = ch;
	words[j] = '\0';
	ch = program[i++];
	if (ch == '=')
	{
		words[j++] = ch;
		words[j] = '\0';
		flag= 403;
	}
	else
	{
		i--;
		flag= 404;
	}
	break;
	}
case'<':{
	if (ch == '<')
		words[j++] = ch;
        words[j] = '\0';
        ch= program[i++];
        if (ch == '=')
	{
		words[j++] = ch;
		words[j]= '\0';
		flag= 405;
	}
        else
	{
		i--;
		flag=406;
	}
	break;
	}
case'!':{
	if (ch == '!')
	words[j++]=ch;
	words[j]='\0';
	ch=program[i++];
	if (ch=='=')
	{
words[j++]=ch;
		words[j]='\0';
		flag=407;
	}
	else
	{
		i--;
		flag=408;
	}
	break;
	}
case'+':{
	if (ch=='+')
	words[j++]=ch;
	words[j]='\0';
	ch=program[i++];
	if (ch=='=')
	{
		words[j++]=ch;
		words[j]='\0';
		flag=409;
	}
	else if (ch=='+')
	{
		words[j++]=ch;
		words[j]='\0';
		flag=410;
	}
	else
	{
		i--;
		flag=411;
	}
	break;
	}
case'-':{
	if (ch=='-')
	words[j++]=ch;
	words[j]='\0';
	ch= program[i++];
	if (ch=='=')
	{
		words[j++]=ch;
		words[j]='\0';
flag=412;
	}
	else if( ch=='-')
	{
		words[j++]=ch;
		words[j]='\0';
		flag=413;
	}
	else
	{
		i--;
		flag=414;
	}
	break;
	}
case'*':{
	if (ch == '*')
	words[j++] = ch;
	words[j]   = '\0';
	ch         = program[i++];
	if (ch == '=')
	{
		words[j++] = ch;
		words[j]='\0';
		flag=415;
	}
	else
	{
		i--;
		flag=416;
	}
	break;
	}
case'/':{
	if (ch == '/')
	words[j++]=ch;
	words[j]='\0';
	ch=program[i++];
	if (ch=='=')
	{
		words[j++]=ch;
		words[j]='\0';
		flag=417;
	}
else
	{
		i--;
		flag=418;
	}
	break;
	}
case';':{
	words[j]=ch;
	words[j+1]='\0';
	flag=501;
	break;
	}
case'(':{
	words[j]=ch;
	words[j+1]='\0';
	flag=502;
	break;
	}
case')':{
	words[j]=ch;
	words[j+1]='\0';
	flag=503;
	break;
	}
case'[':{
	words[j]=ch;
	words[j+1]='\0';
	flag=504;
	break;
	}
case']':{
	words[j]=ch;
	words[j+1]='\0';
	flag=505;
	break;
	}
case'{':{
	words[j]=ch;
	words[j+1]='\0';
	flag=506;
	break;
	}
case'}':{
	words[j]=ch;
	words[j+1]='\0';
	flag=507;
	break;
	}
case':':{
	words[j]=ch;
	words[j+1]='\0';
	flag=508;
	break;
	}
case'"':{
	words[j] = ch;
	words[j+1] = '\0';
	flag = 509;
	break;
	}
case'%':{
	if(ch=='%')
	words[j++]=ch;
	words[j]='\0';
	ch=program[i++];
	if(ch=='=')
	{
		words[j++]=ch;
		words[j]='\0';
		flag=510;
	}
	else
	{
		i--;
		flag=511;
	}
	break;
	}
case',':{
	words[j]=ch;
	words[j+1]='\0';
	flag=512;
	break;
	}
case'#':{
	words[j]=ch;
words[j+1]='\0';
	flag=513;
	break;
	}
case'@':{
	words[j]='#';
	flag=0;
	break;
	}
default:{
	flag=-1;
	break;
	}
}
return flag;
}
main()
{
	i=0;
	printf("please input a program end with @");
	do
	{
		ch=getchar();
		program[i++]=ch;
	}while(ch!='@');
	i=0;
	do{
		flag=Scan(program);
		if (flag==200)
		{
			printf("(%2d,%4d)",flag,number);
		}
		else if (flag==-1)
		{
			printf("(%d,error)",flag);
		}
		else
		{
			printf("(%2d,%4s)",flag,words);
		}
	}while (flag!=0);
	system("pause");
}

⌨️ 快捷键说明

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