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

📄 编译原理实验一.txt

📁 PL/0词法分析程序 想要就拿走吧 编译原理实验1
💻 TXT
字号:
#include <stdio.h>
#include <ctype.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>


FILE *fp;//定义文件指针
char cbuffer;//用来接收从文件中读取的字符
//保留字存入指针数组中
char *key[13] = {"begin","call","const","do","end","if","odd","procedure","read","then","var","while","write"};
//运算符存入arithmetic数组中
char *arithmetic[5] = {"+","-","*","/","="};
//关系运算符
char *relation[5] = {"<",">",">=","<=","=="};
char *border[7] = {",",".",";","(",")","{","}"};
int wordlength = 0;

//判断单词是哪种类型
int search(char searchchar[],int wordtype)
{
	int i = 0;
	switch(wordtype)
	{//判断是否为保留字
	case 1:
		for(i = 0;i<13;i++)
		{
			if(strcmp(key[i],searchchar)==0)
				return 1;//若是,返回1
		}
		return 0;//否则返回0
		//判断是否为运算符
	case 2:
		for(i = 0;i<5;i++)
		{
			if(strcmp(arithmetic[i],searchchar)==0)
			{
				return 1;
			}
		}
		return 0;
		//判断是否为关系运算符
	case 3:
		for(i = 0;i<5;i++)
		{
			if(strcmp(relation[i],searchchar)==0)
				return 1;
		}
		return 0;
	case 4:
		for(i = 0;i<7;i++)
		{
			if(strcmp(border[i],searchchar)==0)
				return 1;
		}
		return 0;
	default:
		return 0;
	
	}
}

//若第一个字符为字母,则调用此函数
char alphaprocess(char buffer)
{
	int i = 0;
	char temp[10];
	char alphatp[20];
	//取出整个单词存入数组alphatp中
	while((isalpha(buffer)) || (isdigit(buffer)))
	{
		alphatp[i++] = buffer;
		buffer = fgetc(fp);
		wordlength++;//计算单词的长度
	}
	alphatp[i] = '\0';//添加字符串结束符
	if(search(alphatp,1)==1)
		printf("%s     -----------1:保留字\n",alphatp);
	else
	{
		//如果单词位数超过十位
		printf("%s     -----------5:正常的标识符\n",strcpy(temp,alphatp));
	}
	return buffer;
}

//如果第一个字符是数字,则调用此函数
char digitprocess(char buffer)
{
	int i = 0;
	char digittp[20];
	//取出整个单词存入digittp数组中
	wordlength = 0;
	while(isdigit(buffer) || isalpha(buffer))
	{
		digittp[i++] = buffer;
		buffer = fgetc(fp);
		wordlength++;
	}
	digittp[i] = '\0';//添加字符串的结束符
	//判断是否为合法的标识符,如果第一个字符是数字而后面有字母则为非法
	for(i = 0;i<wordlength;i++)
	{
		if(isalpha(digittp[i]))
			break;
	}
	if(i==wordlength)
		printf("%s     -----------4:数字\n",digittp);
	else 
		printf("%s     -----------6:错误的标识符\n",digittp);
	
	return buffer;
}

//如果第一个字符既不是字母也不是数字,则调用此函数
char otherprocess(char buffer)
{
	int i = 0;
	char othertp[20];
	othertp[0] = buffer;
	othertp[1] = '\0';
	if(search(othertp,4)==1)
		{
			printf("%s     -----------7:界符\n",othertp);
			goto out;
		}
	if(search(othertp,2)==1)
	{
		printf("%s     -----------2:算术运算符\n",othertp);
		buffer = fgetc(fp);
		goto out;
	}
	if(search(othertp,3)==1)
	{
		//因为关系运算符有的为两位,故需再取出一个判断
		buffer = fgetc(fp);
		othertp[1] = buffer;
		othertp[2] = '\0';
		if(search(othertp,3)==1)
		{
			printf("%s     -----------3:关系运算符\n",othertp);
			goto out;
		}
		else
		{
			othertp[1] = '\0';
			printf("%s     -----------3:关系运算符\n",othertp);
			goto out;
		}
		
	}
	
	if(buffer == ':')
		{
			buffer = fgetc(fp);
			if(buffer=='=')
				printf(":=     -----------定义为\n");
			buffer = fgetc(fp);
			return buffer;
		}
	if(buffer!='\n' || buffer!=' ')
			printf("%c 错误!不是一个单词\n",buffer);
		buffer = fgetc(fp);
out: return buffer;
}
//主函数
void main()
{
	//说明
	printf("*------------------------说明----------------------*\n");
	printf("*------------ 1--保留字     2--运算符 -------------*\n");
	printf("*------------ 3--关系运算符 4--数字   -------------*\n");
	printf("*------------ 5--正常的单词 6--错误的标识符 -------*\n");
	printf("*------------ 7--界符  ----------------------------*\n");
	printf("*--------------------------------------------------*\n");
	//打开测试文件,文件物理地址为"D:/test.txt"
	if((fp = fopen("D:/test.txt","r")) == NULL)
		printf("该文件不能打开!");
	else
	{
		cbuffer = fgetc(fp);
		while(cbuffer!=EOF)
		{
			if(isalpha(cbuffer))//如果是字母
				cbuffer = alphaprocess(cbuffer);
			else if(isdigit(cbuffer))//如果是数字
				cbuffer = digitprocess(cbuffer);
			else cbuffer = otherprocess(cbuffer);//其他
			cbuffer = fgetc(fp);
		}
		
		printf("词法分析结束!");
		getchar();
	}
}

⌨️ 快捷键说明

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