www.pudn.com > SyntaxAnalysis.rar > Test.cpp


#include  
#include  
#include  
 
#define N 83	/* 用来标记 C++ 和 Pascal 语言中关键字的个数 */ 
 
/* 定义一个全局变量,一个全局文件指针 */ 
FILE *fp;    /* fp是一个指向FILE类型结构的指针变量,可以使fp指向某一个文件 
              * 的结构变量,从而通过该结构体变量中的文件信息访问该文件 
			  */ 
int id;      /* 标志变量,用来标识各类型的ID */ 
 
/* 主函数 */ 
int main() 
{    
	/* 自定义函数的声明 */ 
	char cbuffer; 
	char alphaprocess(char buffer); 
	char digitprocess(char buffer); 
	char otherprocess(char buffer); 
 
	if((fp = fopen("example.txt","r")) == NULL)   /* 以只读方式打开文件 "example.txt",NULL在 stdio.h 文件中已被定义为 0 */ 
		printf("error\n"); 
    else                                     
    { 
		cbuffer = fgetc(fp);			/* 文件不为空则从文件中取字符 */ 
        while(cbuffer != EOF)		/* EOF文件结束标志 */ 
        { 
			if(cbuffer==' ' || cbuffer == '\n' || cbuffer == '\t') /* 掠过空格和回车符 */ 
			{ 
				cbuffer = fgetc(fp); 
				id = 4; 
			} 
			else if(isalpha(cbuffer))     
				cbuffer = alphaprocess(cbuffer);	/* 检查cbuffer是否为字母,是则调用alphaprocess()函数 */ 
			else if(isdigit(cbuffer)) 
				cbuffer = digitprocess(cbuffer);	/* 检查cbuffer是否为数字 0~9,是则调用digitprocess()函数 */ 
			else cbuffer = otherprocess(cbuffer);	/* 非上述两者则调用otherprocess()函数 */ 
		} 
	} 
	printf("\n"); 
 
	return 0; 
}/* 主函数结束 */ 
 
/* 处理读取字符为字母的情况 */ 
char alphaprocess(char buffer) 
{   
	int search(char searchchar[],int wordtype);		/* 函数声明 */ 
	int atype;	/* 保存是关键字的字符串在关键字表中的索引 */ 
    int i = 0; 
	char alphatp[20];    /* 字符数组存储从文件中读取的字符 */ 
 
    while((isalpha(buffer)) || (isdigit(buffer)) || buffer == '_'  || buffer == '.' )  /* 标识符的组成成分 */ 
    { 
		alphatp[i++] = buffer;	/* 将当前读取的字符存入数组 */ 
		buffer = fgetc(fp);		/* 读取下一个字符 */ 
	} 
	if(atype != 0)				/* 是关键字则输出该关键字,编号为1,并输出该关键字在关键字表中的位置 */ 
	{ 
		if(atype != 23) 
			printf("(%s, (1,%d))\n",alphatp,atype); 
		id = 1;                 /* 关键字的ID为1 */ 
	} 
	else 
	{ 
		printf("(%s ,2)\n",alphatp);	/* 为标识符时,编号为2 */ 
		id = 2;                         /* 标识符的ID为2 */ 
	}  
 
	return 'a'; 
} 
 
/* 判断字符串是否为关键字 */ 
int search(char searchchar[],int wordtype) 
{ 
	char key[N][10] = {"abstract","and","array","asm","auto","begin","bool","break","case","catch", 
					"char","class","const","continue","default","delete","div","do","double","downto", 
					"dynamic","else","float","for",,"integer","long","mod","namespace","private","program", 
					"protected","public","read","register","repeat","return","set","short","signed", 
					"sizeof","static","string","struct","switch","template","then","this","throw","true","try", 
					"type","typedef","union","unsigned","using","until","var","virtual","volatile","void", 
					"while","write","xor"}; 
					/* 设置数组指针存储 C++ 和 Pascal 语言中的 83 个关键字 */ 
     int i,p; 
     switch(wordtype) 
     { 
		case 1: 
			for(i = 0; i <= N; i++) 
			{ 
				if(strcmp(key[i],searchchar) == 0)  /* 比较字符串,为关键字则定位该关键字的序号 */ 
				{	p = i + 1; break; } 
				else p = 0; 
			} 
		default:; 
	 } 
 
	return(p); 
}/* alphaprocess()函数结束 */ 
 
/* 处理读取字符为数字时的情况 */ 
char digitprocess(char buffer) 
{ 
	int i = 0; 
	char digittp[20]; 
 
	while((isdigit(buffer))) 
	{ 
	    digittp[i++] = buffer; 
	  } 
	printf("(%s ,3)\n",digittp);	/* 输出该数字,编号为3 */ 
	id = 3;                         /* 设置ID为3 */ 
 
	return(buffer); 
}/* digitprocess()函数结束 */ 
 
/* 处理读出字符为其他字符的情况 */ 
char otherprocess(char buffer) 
{ 
	int i; 
	int n = 0; 
    char ch[20]; 
    ch[0] = buffer; 
 
	if(ch[0] == '#' || ch[0] == '"') 
	{ 
		printf("(%s ,4)\n",ch); 
		id = 4;	 
	} 
	else if(ch[0] == ':') 
	{ 
		buffer = fgetc(fp); 
		if(buffer == '=') 
		{ 
			ch[1] = buffer; 
			printf("(%s ,5)\n",ch); 
			id = 5; 
			return(buffer); 
		} 
		printf("(%s ,5)\n",ch); 
		id = 5; 
	} 
	else if(ch[0] == '%' || ch[0] == '\') 
	{	/* 处理标准输出格式和转义字符 */ 
		printf("(%s ,5)\n",ch); 
		id = 5; 
		buffer = fgetc(fp); 
	} 
	else if(ch[0] == '&') 
	{ 
		buffer = fgetc(fp); 
	    if(buffer != '&') 
		{ 
			printf("(%s ,5)\n",ch); 
			id = 5; 
		} 
	} 
	else if(ch[0] == '{' || ch[0] == '}' || ch[0] == '(' || ch[0] == ')') 
	{ 
		printf("(%s ,5)\n",ch); 
		buffer = fgetc(fp); 
		id = 5; 
	} 
	else if(ch[0] == '*'|| ch[0] == '/') 
	{ 
		printf("(%s ,4)\n",ch); 
		id = 4; 
	} 
	else if(ch[0] == '=' || ch[0] == '!' || ch[0] == '<' || ch[0] == '>') 
	{ 
		buffer = fgetc(fp); 
		printf("(%s ,4)\n",ch); 
		id = 4; 
	} 
	else if(ch[0] == '+' || ch[0] == '-') 
	{ 
		if(id == 4)		/* 如果'+','-'前ID为4的字符则可能为正负数或'++','--',否则为加减号 */ 
		{ 
			for(i = 1; i < 10; i++) 
			{ 
				buffer = fgetc(fp); 
				if(buffer == '+') 
				{ 
					ch[1] = '+'; break;	/* 跳出for循环体 */ 
				} 
				else if(buffer == '-') 
				{ 
					ch[1] = '-'; break;		/* 跳出for循环体 */ 
				}				 
				ch[i+1] = '\0'; 
			} 
			printf("(%s ,3)\n",ch);   
			id = 3;  
			return(buffer); 
		} 
		printf("(%s ,4)\n",ch);  
		buffer = fgetc(fp); 
		id = 4; 
	} 
	return 'f'; 
} /* otherprocess()函 
数结束 */