📄 parsevar.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 + -