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

📄 scan.cpp

📁 自己做的一个简单的C词法分析器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		{
			char c = ScanNextChar();
			if('=' == c)
			{
				AddToken(">=",55,0);
			}
			else
			{
				col--;
				AddToken(">",54,0);
			}
		}
		break;
	case '+':
		{
			char c = ScanNextChar();
			if(c=='+')
			{
				AddToken("++",64,0);
			}
			else
			{
				col--;
				AddToken("+",42,0);
			}
		}
		break;
	case '-':
		{
			char c = ScanNextChar();
			if(c=='-')
			{
				AddToken("--",65,0);
			}
			else
			{
				col--;
				AddToken("-",44,0);
			}
		}
		break;
	case '*':
			AddToken("*",40,0);
			break;
	case '(':
			AddToken("(",38,0);
			break;
	case ')':
			AddToken(")",39,0);
			break;
	case '{':
			AddToken("{",58,0);
			break;
	case '}':
			AddToken("}",59,0);
			break;
	case ':':
			AddToken(":",48,0);
			break;
	case '=':
			AddToken("=",53,0);
			break;
	case ';':
			AddToken(";",49,0);
			break;
	case ',':
			AddToken(",",43,0);
			break;
	default:
		{
			CString word;
			//int token=0;
			word += ch;
			//IsKeyword(word,token);
			AddToken(word,0,0);//其它不能识别的字符,就加进错误Token
		}
	}
}

/*********************************************************************/
//函数说明:查询符号表
//参数说明:word-待查询的单词,kind-查询的种类,entry-返回查询的地址
//返回值:无
/*********************************************************************/
void scan::LookUp(CString word,int kind,unsigned &entry)
{
	unsigned p = 0;
	switch(kind)
	{
		//标示符
		case INDEX:
		//字符常数
		case CARCTER:
		{
			
			bool thesame = IsInWordTable(word,p);
			if(!thesame)//无同名单词,就添加
			{
				m_wt[wordtablenum].len = word.GetLength();
				if(kind == CARCTER)//是字符常数
				{
					m_wt[wordtablenum].type = "字符型";
					m_wt[wordtablenum].kind = "常数";
				}
				m_wt[wordtablenum].val = word;
				//字符串表中没有内容,就从开始添加,否则就回溯查找
				if (wordtablenum==0)
					m_wt[wordtablenum].start=0;	
				int i=1;
				while(m_wt[wordtablenum-i].start==-1&&i<=wordtablenum)//往上回溯查找
				{
					i++;
				}
				m_wt[wordtablenum].start=m_wt[wordtablenum-i].start+m_wt[wordtablenum-i].len;
				entry=m_wt[wordtablenum].start;
				strcat(m_st.strtabe,word);
			}
			//有同名单词
			else
			{
				entry = m_wt[p-1].start+m_wt[p-1].len;
				wordtablenum--;
			}
		}
		wordtablenum++;
		break;
		//整型常数
		case INTEN:
		//实型常数
		case REAL:
		{
			bool thesame = IsInWordTable(word,p);
			if(!thesame)//不存在符号表中,就添加
			{
				m_wt[wordtablenum].start=-1;
				m_wt[wordtablenum].len = -1;
				if(kind == INTEN)//整型常数
				{
					m_wt[wordtablenum].type = "整型";
				}
				else//实型常数
				{
					m_wt[wordtablenum].type = "实型";
				}
				m_wt[wordtablenum].val = word;
				m_wt[wordtablenum].kind = "常数";
				p_wt++;
				entry=m_wt[wordtablenum-1].start+2;
			}//在符号表中就返回符号表中的位置
			else
			{
				entry = m_wt[p-1].start+m_wt[p-1].len+1;
				wordtablenum--;
			}
		}
		wordtablenum++;
		break;
	}
}

/*********************************************************************/
//函数说明:判断是否是字母
//参数说明:ch-待处理的字符
//返回值:是就返回ture,不是就是false
/*********************************************************************/
bool scan::IsLetter(char ch)
{
	if( (ch>='a' && ch<='z')||(ch>='A' && ch<='Z'))
		return true;
	else
		return false;
}

/*********************************************************************/
//函数说明:判断是否是数字
//参数说明:ch-待处理的字符
//返回值:是就返回ture,不是就是false
/*********************************************************************/
bool scan::IsNumber(char ch)
{
	if(ch>='0' && ch<='9')
		return true;
	else
		return false;
}

/*********************************************************************/
//函数说明:判断是否是关键字
//参数说明:word-待判断的单词,token-返回单词的token
//返回值:是就返回ture,不是就是false
/*********************************************************************/
bool scan::IsKeyword(CString word,int &token)
{
	//关键字表
	CString keyword[32] ={"auto","break","case","char","const","continue","default","do","double",
						"else","enum","extern","float","for","goto","if","int","long","register",
						"return","short","signed","sizeof","static","struct","switch","typedef",
							"union","unsigned","void","volatile","while"};
	//查找关键字,如果是就返回true
	for(int k=0;k<32;k++)
		if(strcmp(word,keyword[k])==0)
		{
			token=k;
			return true;
		}
	token=-1;
	return false;
}

/*********************************************************************/
//函数说明:判断是否是正确的符号
//参数说明:ch-待处理的字符
//返回值:是就返回ture,不是就是false
/*********************************************************************/
bool scan::IsIdent(char ch)
{
	if(ch>=39 && ch<=45 || ch>=58 && ch<=62 || ch=='/'||ch=='['
		||ch==']'||ch=='_'||ch=='('||ch==')'||ch=='{'||ch=='}')
		return true;
	else
		return false;
}

/*********************************************************************/
//函数说明:加入Token
//参数说明:s-单词,word、num-token
//返回值:无
/*********************************************************************/
void scan::AddToken(CString s,int word,int num)
{
	char buffer[20]="";
	Token to;
	to.word = word;
	to.num=0;
	to.num = num;
	strtoken+=s;
	strtoken+="----(";
	strtoken+=_itoa( word, buffer, 10);
	strtoken+=",";
	strtoken+=_itoa( to.num, buffer, 10);
	strtoken+=")\r\n";
}

/*********************************************************************/
//函数说明:判断是否在符号表
//参数说明:s-待判断的单词,p-在符号表的地址
//返回值:是就返回ture,不是就是false
/*********************************************************************/
bool scan::IsInWordTable(CString word,unsigned &p)
{
	//字符串表中没有内容
	if (wordtablenum==0)
	{
		p=0;//返回地址才最初开始
		return false;
	}
	else//返回符号表中的位置
	{
		CString temp=_T("");
		for(int i=0;i<wordtablenum;i++)
		{
			temp=m_wt[i].val;
			int ret=temp.Compare(word);
			//在符号表中,就返回在符号表中的位置
			if(ret == 0)
				{
 					p = i;
 					return true;
 				}
		}
		p=0;
		return false;
	}
}

/*********************************************************************/
//函数说明:返回错误个数
//参数说明:无
//返回值:错误的个数
/*********************************************************************/
int scan::ErrNum()
{
	return errnum;
}

/*********************************************************************/
//函数说明:写入符号表信息
//参数说明:无
//返回值:返回符号表
/*********************************************************************/
CString scan::AddWordTable()
{
	CString temp=_T("");
	char buffer[200]="";
	//初始化打印字符表
	addwordtable+="***(start)  ";
	addwordtable+="***(length) ";
	addwordtable+="***(value)  ";
	addwordtable+="***(kind)   ";
	addwordtable+="***(type)   \r\n";
	//addwordtable+="\r\n";
	//输出符号表信息
	for(int i=0;i<wordtablenum;i++)
	{
		sprintf(buffer, "%8d%12d%12s%12s%12s", m_wt[i].start, m_wt[i].len,m_wt[i].val,m_wt[i].kind,m_wt[i].type); 
		temp.Format("%s",buffer);
		addwordtable+=temp;
		addwordtable+="\r\n";
	}
	temp=_T("");
	//输出字符表信息
	addwordtable+="字符列表:\r\n";
	temp.Format("%s",m_st.strtabe);
	addwordtable+=temp;
	addwordtable+="\r\n";
	return errnum;
}

/*********************************************************************/
//函数说明:处理错误字符
//参数说明:ch-待处理的错误字符
//返回值:无
/*********************************************************************/
void scan::Error(char ch)
{
	char buffer[20]="";
	err+="(";
	err+=_itoa( row+1, buffer, 10 );
	err+=",";
	
	err+=_itoa( col+1, buffer, 10 );
	err+=")";
	err+=ch;
	err+="\t错误类型:";
	err+="非法字符!\r\n";
	//col++;
	errnum++;
}

⌨️ 快捷键说明

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