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

📄 11.cpp

📁 简单的词法分析器 可识别关键字 操作符 分隔符
💻 CPP
字号:
#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 



int IsLetter(char ch) /*判断是否是字母,是则返回 1,否则返回 0 */ 
{

	return ((ch >= 'a' && ch <= 'z') || ( ch >= 'A' && ch <= 'Z'));
		
} 

int IsDigit(char ch) /*判断是否为数字,是则返回 1,否则返回 0 */
{ 
	if( ch >= '0' && ch <= '9' )
	{
		return 1; 
	}
	return 0;

} 
int IsSpace(char ch) /*判断是否为空白符(空格、换行、制表符等),是则返回 1,否则返回 0*/ 
{
	if(isspace(ch)) return 1; 
	return 0; 
} 

int  judge(char ch) //判断文件是否输入结束 
{

	if (ch != EOF)  return 1;
	else return 0;
} 

void GetBC(FILE *fp,char *ch) /*如果是空白则继续读下一个,直到不是空白*/ 
{
	do 
	{ 
		*ch = fgetc(fp);
	}while( IsSpace(*ch) && (*ch != EOF) ); 
} 



char compare(char *str) //返回关键字的编码
{
	if(strcmp(str,"void") == 0) return '1'; 
	if(strcmp(str,"main") == 0) return '2'; 
	if(strcmp(str,"int") == 0) return '3'; 
	return '0'; 
} 


//******************************************词法分析子程序******************************************
int lexSubFunc(FILE *fp) 
{
	char ch,code; 
	int i;
	int a;
	char tem[10]; //临时存放读入的字符串

	//跳过文件中开头的空格 回车 制表符
	GetBC(fp,&ch); 
	i = 0; 
	do
	{ 
	
	if(ch == EOF) 
	{
		printf("There is nothing!"); 
		return 0; 
	}                      //如果文件为空 直接跳出 

	else if ( IsLetter(ch) ) //假如输入的第一个字符是字母,则接下来可能输入字母或数字形成关键字或标示符
	{ 
		for(i = 0; i < 10; i ++)  tem[i] = '\0';
		i = 0;
		while ( IsLetter(ch) || IsDigit(ch) ) 
		{ 
			tem[i] = ch;
			i ++;
			ch = getc(fp);
		} 
		a = i;   //记录共有多少个字符
		code = compare(tem);//
		if (code == '1')
		{ 
			printf("关键字:void\n"); 
		
		} 
		else  if(code == '2')
		{ 
			printf("关键字:main\n");
		} 
		else if(code == '3')
		{
			printf("关键字:int\n"); 
		}
		else if(code == '0')
		{	
			
			printf("标示符:");//输出标示符
		    for(i = 0; i<a; i++ )
			{
				printf("%c",tem[i]);
			}
			printf("\n");
		}
	//	for(i = 0;i < 10; i++)  s[i] = '0';//将字符数组重新全部置零
	                             //数组下标置零

	} 

	else if( IsDigit (ch) ) //如果输入的第一个字符是数字,则接下来只可能是数字,
	{ 
		for(i = 0; i < 10; i ++)  tem[i] = '\0';
		i = 0;
		while ( IsDigit(ch) == 1 ) //如果接下来是数字,则将这个字符与上个字符归为同一个标示符的组成元素
		{ 
			tem[i] = ch;
			i++;
			ch = getc(fp);
		} 
		a = i;
		printf("数字:");
		for(i = 0; i<a; i++ )
		{
			printf("%c",tem[i]);
		}
		printf("\n");
	                        
	} 

	//接下来是其他各种杂情况,如文件分隔符,操作符
    if (ch == '=')
	{ 
		printf("操作符:=\n"); 
	
	} 
	else if (ch == '+')
	{ 
		printf("操作符:+\n"); 
	
	} 
	else if (ch == '-')
	{ 
		printf("操作符:-\n"); 
	
	} 
	else if (ch == '*')
	{ 
		printf("操作符:*\n"); 
	
	} 
	else if (ch == '/')
	{ 
		printf("操作符:/\n"); 
	
	} 
	else if (ch == ';')
	{ 
		printf("分隔符: ;\n"); 
	} 
	else if (ch == '(') 
	{ 
		printf("分隔符: (\n"); 
	} 
	else if (ch == ')') 
	{ 
		printf("分隔符: )\n"); 
	} 
	else if (ch == '{') 
	{ 
		printf("分隔符: {\n"); 
	} 
	else if (ch == '}') 
	{ 
		
		printf("分隔符: }\n"); 
	} 

		ch = getc(fp);

	}while(judge(ch)) ;
	return 1;
}

//***********************************主程序***********************************************
int main() 
{
	FILE *fp; 
		//open a file
	if((fp = fopen("1.txt","r")) == NULL )
	{
		printf("cannot open this file\n");
		return 0;
	}
	lexSubFunc(fp); 
	fclose(fp); 
	return 1;
} 

⌨️ 快捷键说明

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