`
wangchangshuai0010
  • 浏览: 122851 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

贴一个刚写的 词法解析程序吧(C语言),很简陋,呵呵。。。

 
阅读更多

/**
 * 2012年6月25日 中午
 * 
 * 山东科技大学信息学院  版权所有
 * 
 * 联系邮箱:415939252@qq.com
 * 
 * Copyright @2012, sdust, All Rights Reserved
 * 
 * author 王昌帅
 *
 */
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>

#define MAX 1024
#define MAX_LENGTH 10
#define NUM_RESERVED_WORD 40
#define NUM_OPERATOR 6
#define NUM_SEPARATOR 16

//函数声明
//用于输入的函数
void input(char*);
//用于输出的函数
void output();
//判断单词的是哪种标识符
int judge(char*);
//将输入的字符串解析成一个一个的单词
void parse2Array(char*);
//判断字符是否是字母
int isChar(char c);
//判断字符是否是操作符
int isOperator(char c);
//判断字符是否是分隔符
int isSeparator(char c);
//判断字符是否是数字
int isNum(char c);
//判断是否是基本保留字(参数:字符串)
int isReservedWord_str(char* str);
//判断是否是操作符(参数:字符串)
int isOperator_str(char* str);
//判断是否是操作符(参数:字符串)
int isSeparator_str(char* str);
//判断是否是数字串(参数:字符串)
int isNum_str(char* str);
//判断是否是标识符(参数:字符串)
int isIndentifier_str(char* str);


//定义标识符
char sign_reserved_word[][MAX_LENGTH] = {"auto","break","continue","char","case","const","class","default","double","do","define","extern"
              ,"enum","else","friend","float","for","goto","include","int","if","long","namespace","protected",
			  "public","private","register","return","static","short","signed","switch","sizeof","struct","typedef"
			  ,"unsigned","union","using","void","while"};
char sign_operator[][MAX_LENGTH] = {"+","-","*","/","%","="};
char sign_separator[][MAX_LENGTH] = {"\n"," ","\"","\t",",",";",":","'","<",">","(",")","{","}","[","]"};

//单词总数(包括运算符、分隔符等)
int wordNum = 0;
//解析好的单词
char array[MAX][20];

//主函数
int main()
{
	char str[MAX],c;
	while(1)
	{
		system("cls");
		input(str);
		parse2Array(str);
		output();

		printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");

		printf("按Esc退出,按其他任意建继续...\n");
		if((c=getch())==27)
		{break;}
	}
}


//用于输入的函数
void input(char* str)
{
	int i = 0,j = 0;
	char c;
	str[0] = '\0';
	printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
	printf("请输入要解析的语句(按@结束输入,按esc退出):\n\n");
	for(i=0;(c=getch())!='@';i++)
	{
		if(c==27)
			exit(0);
		if(c==8)
		{
			i-=2;
			if(i<-1)
				i=-1;
			system("cls");
			printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
			printf("请输入要解析的语句(按@结束输入,按esc退出):\n\n");
			for(j=0;j<=i;j++)
			{
				printf("%c",str[j]);
			}
			continue;
		}
		else if(c==13)
		{
			str[i] = '\n';
			printf("\n");
		}
		else
		{
			str[i] = c;
			printf("%c",c);
		}
		str[i+1] = '\0';
	}
}



//将输入的字符串解析成一个一个的单词
void parse2Array(char* str)
{
	int count; 
	int i,temp;
	wordNum = 0;
	count = strlen(str);
	for(i=0;i<count;i++)
	{
		temp = i;
		if(isOperator(str[i]))
		{//如果是运算符
			array[wordNum][0]=str[i];
			array[wordNum][1]='\0';
			wordNum++;
		}
		else if(isSeparator(str[i]))
		{//如果是分隔符
			array[wordNum][0]=str[i];
			array[wordNum][1]='\0';
			wordNum++;
		}
		else
		{
			for(;str[i]!='\0'&&(!isOperator(str[i]))&&(!isSeparator(str[i]));i++)
			{
				array[wordNum][i-temp]=str[i];
			}
			array[wordNum][i-temp]='\0';
			wordNum++;
			i--;
		}
	}
}

//输出信息
void output()
{
	int i ;

	printf("\n");
	printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
	for(i = 0;i<wordNum;i++)
	{
		int flag = judge(array[i]);
		switch(flag)
		{
		case 1:
			printf(" 1、基本保留字:\t%s\n",array[i]);
			break;
		case 2:
			printf(" 2、标识符    :\t%s\n",array[i]);
			break;
		case 3:
			printf(" 3、常数      :\t%s\n",array[i]);
			break;
		case 4:
			printf(" 4、运算符    :\t%s\n",array[i]);
			break;
		case 5:
			if(strcmp(array[i],"\n")==0)
			{
				//printf(" 5、分隔符    :\t\\n\n",array[i]);
			}
			else if(strcmp(array[i]," ")==0)
			{
				//printf(" 5、分隔符    :\t空格\n",array[i]);
			}
			else if(strcmp(array[i],"\t")==0)
			{
				//printf(" 5、分隔符    :\t\\t\n",array[i]);
			}
			else
			{
				printf(" 5、分隔符    :\t%s\n",array[i]);
			}
			break;
		case -1:
			printf    ("-1、Error     :\t%s\n",array[i]);
			break;
		default:
			printf("-1、Error     :\t%s\n",array[i]);
			break;
		}
	}
}

//判断是哪类字符(1、基本保留字 2、标识符 3、常数 4、运算符 5、分隔符 -1、不能识别(Error))
int judge(char * word)
{
	if(isSeparator_str(word))
	{
		return 5;
	}
	else if(isOperator_str(word))
	{
		return 4;
	}
	else if(isReservedWord_str(word))
	{
		return 1;
	}
	else if(isNum_str(word))
	{
		return 3;
	}
	else if(isIndentifier_str(word))
	{
		return 2;
	}
	else
	{
		return -1;
	}
}

//判断是否是字符
int isChar(char c)
{
	if(c>='A'&&c<='Z'||c>='a'&&c<='z')
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

//判断是否是数字(单个字符)
int isNum(char c)
{
	if(c>='0'&&c<='9')
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

//判断是否是操作符(单个字符)
int isOperator(char c)
{
	int i ;
	char sign[] = {'+','-','*','/','%','='};
	for(i = 0;i<NUM_OPERATOR;i++)
	{
		if(c==sign[i])
		{
			return 1;
		}
	}
	return 0;
}

//判断是否是分隔符(单个字符)
int isSeparator(char c)
{
	int i ;
	char sign[] = {'\n',' ','\"','\t',',',';',':','\'','<','>','(',')','{','}','[',']'};
	for(i = 0;i<NUM_SEPARATOR;i++)
	{
		if(c==sign[i])
		{
			return 1;
		}
	}
	return 0;
}

//判断是否是基本保留字(参数:字符串)
int isReservedWord_str(char* str)
{
	int i ;
	for(i = 0;i<NUM_RESERVED_WORD;i++)
	{
		if(strcmp(str,sign_reserved_word[i])==0)
		{
			return 1;
		}
	}
	return 0;
}

//判断是否是操作符(参数:字符串)
int isOperator_str(char* str)
{
	int i ;
	for(i = 0;i<NUM_OPERATOR;i++)
	{
		if(strcmp(str,sign_operator[i])==0)
		{
			return 1;
		}
	}
	return 0;
}

//判断是否是分隔符(参数:字符串)
int isSeparator_str(char* str)
{
	int i ;
	for(i = 0;i<NUM_SEPARATOR;i++)
	{
		if(strcmp(str,sign_separator[i])==0)
		{
			return 1;
		}
	}
	return 0;
}

//判断是否是数字串(参数:字符串)
int isNum_str(char* str)
{
	int i , count;
	count = strlen(str);
	for(i = 0;i<count;i++)
	{
		if(str[i]<'0'||str[i]>'9')
		{
			return 0;
		}
	}
	return 1;
}

//判断是否是标识符(参数:字符串)
int isIndentifier_str(char* str)
{
	int i , count;
	count = strlen(str);
	if(str[0]>='0'&&str[0]<='9')
	{
		return 0;
	}
	for(i = 0;i<count;i++)
	{
		if(!isChar(str[i])&&!isNum(str[i])&&(str[i]!='_'))
		{
			return 0;
		}
	}
	return 1;
}


 

效果图如下:

分享到:
评论

相关推荐

    词法分析程序(C语言版)

    本篇将深入解析一个用C语言实现的词法分析程序,帮助理解其工作原理和技术细节。 #### 二、程序结构与功能概述 该词法分析程序主要包括以下几个部分: - **头文件包含**:`stdio.h` 和 `string.h` 用于支持输入输出...

    词法分析程序(C语言)

    在C语言中,词法分析是编译过程的第一阶段,通常由一个名为“词法分析器”或“扫描器”的程序执行。这个程序会识别并分类出C语言中的关键字、标识符、常量、运算符、分隔符等基本元素,为后续的语法分析提供输入。 ...

    词法分析程序(C语言版)

    用C语言编写的词法分析程序,直接用Visual C++打开运行即可。

    编译原理词法分析程序(C语言)

    编译原理词法分析程序(C语言) 编译原理词法分析程序(C语言) 编译原理词法分析程序(C语言)

    词法分析器,c语言源程序

    词法分析器,c语言源程序 这是我自己写的,老师检查也通过了。 好好看看吧!

    编译原理词法分析程序(C语言)

    总的来说,这个项目提供了一个实际应用编译原理中词法分析概念的例子,对于学习编译器设计和C语言编程的学生来说,这是一个很好的实践平台。通过阅读和理解源代码,以及阅读报告,我们可以深入学习到词法分析器的...

    编译原理词法分析器源程序C语言实现

    本资源是一个使用C语言实现的编译原理词法分析器源程序,主要功能是对输入的源程序进行词法分析,识别出关键字、标识符、数字等 token,并将其输出。 1. 编译原理 编译原理是计算机科学中的一门学科,研究的是如何...

    一个C语言写的C语言词法分析程序

    这个"一个C语言写的C语言词法分析程序"是一个用于分析C语言源代码的特定程序,它可以帮助我们理解C语言源代码的结构并为后续的语法分析阶段准备数据。 首先,我们需要理解词法分析的基本概念。词法分析器,通常称为...

    用C语言实现词法分析程序

    本项目是用C语言实现的一个词法分析程序,它能够识别并处理保留字、标识符以及数字等基本元素。 首先,我们来了解一下词法分析的基本概念。词法分析器,又称为扫描器或词法分析器,它的任务是读取源代码,识别出...

    C语言词法分析程序

    在编程领域,词法分析是编译器设计过程中的一个重要步骤,它负责将源代码转换成可供解析器处理的标记序列。在这个特定的案例中,我们关注的是一个针对C语言子集的词法分析程序,它能在Microsoft Visual C++ 6.0...

    词法分析源程序(c语言编写)

    词法分析程序源程序 开发语言:c 使用字符串gets[a]从键盘获取字符串放到数组a中 使用strcpy,strcmp等来处理字符串的复制,比较关键字

    一个简易的c语言词法分析器

    这个简易的C语言词法分析器提供了一个实践平台,可以让学生逐步了解如何从字符流中提取有意义的信息,并转化为编译器可以理解的标记。通过阅读和修改这个分析器的代码,学生可以加深对编译过程的理解,为将来编写更...

    简易C语言词法分析程序

    在这个案例中,我们关注的是一个简单的C语言词法分析程序,这将帮助我们理解C语言源代码的底层处理过程。 词法分析,又称为扫描或词法分解,是编译器的第一个阶段。它的任务是读取源代码字符串,识别出由空白、注释...

    C语言词法分析程序(编译原理)

    在本项目中,我们首先需要创建一个C语言程序,该程序能够打开包含源代码的文件,并逐行读取内容。使用标准库中的`fopen()`函数可以实现这个功能,`fgets()`或`fread()`则用于读取每一行。然后,我们需要编写逻辑来...

    C语言子集的词法分析程序

    **实验目的:**通过设计并实现一个针对C语言子集的词法分析程序,旨在加深学生对词法分析原理的理解,并掌握如何从源程序中识别并提取出关键字、标识符、常数、运算符和界符号等基础单词符号的方法。 **实验要求:*...

    词法分析器代码C语言

    词法分析程序的功能 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。

    词法分析程序 c语言编写

    词法分析程序 用c语言实现 可以自定义可以识别的单词流

    词法分析器C语言编写(附实验报告)

    接着,词法分析器会维护一个当前字符变量,根据字符和已知的词法规则进行状态转换。这通常涉及到定义一系列的状态,比如初始状态、标识符状态、数字状态等,并根据字符的不同,从一个状态转换到另一个状态。例如,当...

    编译原理词法分析程序C语言编写

    这段C语言代码展示了如何实现一个基本的词法分析器,用于处理简单的C语言源代码。它涵盖了词法分析的核心功能,包括跳过空白字符、识别标识符、关键字、整型常量和运算符,以及处理多行注释。虽然这个实现相对简单,...

    词法分析程序 语法分析程序 C语言

    这个阶段通常由一个解析器完成,它构建一个抽象语法树(AST),这是一个表示程序结构的树形数据结构。语法分析程序检查标记序列是否符合给定语言的语法规则,如果不符,则会抛出语法错误。在编译C语言或PASCAL这样的...

Global site tag (gtag.js) - Google Analytics