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

📄 parsevar.h

📁 一个简单的词法分析程序。是编译原理的部分课程设计。因为时间有限。未能完成全部。如果有朋友改了代码或添加了功能使代码更加完善。请与我联系:ningmeng_studio@163.com谢谢. 做的不是
💻 H
字号:
/*=============================================
**             2005-8-30					**
**			  词法分析  	 				**
**			 lizhu zhang					**
=============================================*/
#include "GetType.h"
#include "FindError.h"
/*=============================================
**函数用能:对文件进行词法分析
**参数说明:[in]pHead:符号表的头指针
**返回值  : 成功返回1,失败返回0 
**===========================================*/
int FParse(SYMBELLIST * pHead)
{
	int row,col;
	row = 1;
	col = 0;
	//错误信息
	ERRMSG *pErrMsg;
	pErrMsg = (ERRMSG *)malloc(sizeof(ERRMSG));
	char *keyType;
	keyType = (char *)malloc(sizeof(char));
	//while跳出标志
	int breakFlg = 0;
	//记录当前是第几个token字
	int tokenCount = 1;
	//token变量
	TOKEN *pToken;
	pToken = (TOKEN *)malloc(sizeof(TOKEN));
	//如果失败则返回
	while(FGetToken(tokenCount,pToken))
	{
		cout<<"row:"<<row<<","<<"col:"<<col<<endl;
		breakFlg = 0;
		switch(pToken->code)
		{
		case 31://说明语句翻译
			{
				//作为第一个变量的标志
				int state = 0;
				//作为token字地址存放的临时单元
				int type[1024];
				//对临时单元地址计数
				int i = 0;
				tokenCount ++;
				while(FGetToken(tokenCount,pToken)&&breakFlg == 0)
				{
					switch(state)
					{
					case 0:
						{
							if(pToken->code == 34)
							{
								state = 2;
								type[i] = pToken->addr;
								i++;
								tokenCount ++;
							}
							else
							{
								//写错误文件
								FFindError("nihao.txt",tokenCount,row,col,0);
								state = -1;
							}
						break;
						}//case 0
					case 1:
						{
							if(pToken->code == 34)
							{
								state = 2;
								tokenCount++;
							}
							else
							{
								FFindError("nihao.txt",tokenCount,row,col,0);
								state = -1;
							}
							break;
						}//case 1
					case 2:
						{
							if(pToken->code == 44)
							{
								state = 1;
								type[i] = pToken->addr;
								i++;
								tokenCount ++;
							}
							else
								if(pToken->code == 50)
								{
									state = 3;
									tokenCount ++;
								}
								else
								{
									//写错误文件
									FFindError("nihao.txt",tokenCount,row,col,0);
									state = -1;
								}
							break;
						}//case 2
					case 3:
						{
						//	strcpy(keyType,FGetType(pToken->code));
							cout<<FGetType(pToken->code)<<endl;

							getchar();

							if(strcmp(FGetType(pToken->code),"") == 0)
							{
								tokenCount ++;
								state = 4;
							}
							else
							{
								cout<<"tokenCount:"<<tokenCount<<endl;
								getchar();
								//写错误文件
								FFindError("nihao.txt",tokenCount,row,col,0);
								state = 4;
							}
							break;
						}//case 3
					case 4://遇到;声明过程结束
						{
							if(pToken->code == 52)
								;
							else
							{
								//缺少结束符号,直接写错误文件 
								FFindError("nihao.txt",tokenCount,row,col,1);
								//写错误文件
								//FFindError("nihao.txt",tokenCount,row,col,0);
								pErrMsg->row = row;
								pErrMsg->col = col;
								strcpy(pErrMsg->pErrMsg," 非法结束!");
								//如果写入错误信息失败则退出整个分析过程
								if(!FFileWrite("Error.txt",2,pErrMsg))
									return 0;
							}
							//获得类型信息,并写符号表
							breakFlg = 1;
							break;
						}
					default:
						{
							
							breakFlg = 1;
							break;
						}//default
					}//switch
				}//case 31 while
			break;
			}//case 31
		default:
			{
				tokenCount ++;
				break;
			}
		}
	}//while

		return 1;
}//

⌨️ 快捷键说明

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