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

📄 lexicalanalysis.cpp

📁 此文件包含了《编译原理》课程设计中词法、语法分析器及代码优化的源代码
💻 CPP
字号:
#include <ctype.h>
#include <string.h>
#include <stdio.h>

#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()函
数结束 */

⌨️ 快捷键说明

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