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

📄 scannerdlg.cpp

📁 This program about compilers.This is the first section of compilers.Source routines after manual inp
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	else
	{
		int type = BIAOZHIFU;
		//strcpy(value.character,word);
		value.character = word.GetBufferSetLength(word.GetLength());
		LookUp(type,value);
	}

}

void CScannerDlg::RecogDig(char ch)
{
	char curchar;
	int Type;
	CString word = _T("");
	CString chir = _T("");
	chir.Format("%c",ch);
	word += chir;
	++coloumn;
	if(GetChar(curline,coloumn,curchar))
	{
		while(CharType(curchar) == 1)
		{
			chir.Format("%c",curchar);
			word += chir;
			++coloumn;
			if(!GetChar(curline,coloumn,curchar))
				break;
		}
		if(curchar == '.')         //处理实常数
		{
			Type = SHICHANGSHU;
			word += ".";
			++coloumn;
			if(GetChar(curline,coloumn,curchar))
			{
				while(CharType(curchar) == 1)
				{
					chir.Format("%c",curchar);
					word += chir;
					++coloumn;
					if(!GetChar(curline,coloumn,curchar))
						break;
				}
				//将实常数填入符号表
				value.character = word.GetBufferSetLength(word.GetLength());
				LookUp(Type,value);
				return;
			}
			else  //'.'号后面没有数字,则进行错误处理
			{
				PutError(curhang,coloumn,"实常数没有结束");
				return;
			}
		}
		else//处理整型常数
		{
			Type = ZHENGCHANGSHU;
			value.integer = atoi(word.GetBufferSetLength(word.GetLength()));
			LookUp(Type,value);
			return;

		}
	}
}

void CScannerDlg::HandleCom(char ch) //处理'/'注解或者除号
{
	char curch;
	++coloumn;
	GetChar(curline,coloumn,curch);
	if(curch != '*')  //识别为除号
	{
		FormatToken(keyword[48]);
		return;
	}
	else            //识别为注解
	{
		char nextchar;
		++coloumn;
		if(!GetChar(curline,coloumn,curch))
		{
			PutError(curhang,coloumn,"注解出错");
			return;
		}
		++coloumn;
		if(!GetChar(curline,coloumn,nextchar))
		{
			PutError(curhang,coloumn,"注解出错");
			return;
		}
		while(!(curch == '*'&&nextchar == '/'))
		{
			curch = nextchar;
			++coloumn;
			if(!GetChar(curline,coloumn,nextchar))
				break;
		}
		if(!(curch == '*'&&nextchar == '/'))
		{
			PutError(curhang,coloumn,"注解出错");
			return;
		}
		++coloumn;
	}
}

void CScannerDlg::RecogStr(char ch)
{
	char curchar;
	CString word = _T("");
	CString chir = _T("");
	++coloumn;
	if(!GetChar(curline,coloumn,curchar))
	{
		PutError(curhang,coloumn,"当个引号引起错误");
	}
	while(CharType(curchar) == 0 || CharType(curchar) == 1)
	{
		chir.Format("%c",curchar);
		word += chir;
		++ coloumn;
		if(!GetChar(curline,coloumn,curchar))
			break;
	}
	if(curchar != '"')
	{
		PutError(curhang,coloumn,"字符常数缺少右引号");
		++coloumn;
		return;
	}
	else   //确认为字符常数
	{
		++coloumn;
		int type = ZIFUCHANGSHU;
		value.character = word.GetBufferSetLength(word.GetLength());
		LookUp(type,value);
	}
}

void CScannerDlg::RecogDel(char ch)
{
	char curch;
	token del;
	switch(ch)
	{
	case '(':
		++coloumn;
		FormatToken(keyword[39]);
		break;
	case ')':
		++coloumn;
		FormatToken(keyword[40]);
		break;
	case '*':
		++coloumn;
		GetChar(curline,coloumn,curch);
		if(CharType(curch) == 2)
		{
			++coloumn;
			FormatToken(keyword[42]);  //   '*/'
			break;
		}
		else
		{
			FormatToken(keyword[41]);  //   '*'
			break;
		}
	case '+':
		++coloumn;
		FormatToken(keyword[43]);
		break;
	case '-':
		++coloumn;
		FormatToken(keyword[45]);
		break;
	case ',':
		++coloumn;
		FormatToken(keyword[44]);
		break;
	case ';':
		++coloumn;
		FormatToken(keyword[52]);
		break;
	case ':':
		++coloumn;
		GetChar(curline,coloumn,curch);
		if(curch == '=')
		{
			++coloumn;
			FormatToken(keyword[51]);  //   ':='
			break;
		}
		else
		{
			FormatToken(keyword[50]);  //   ':'
			break;
		}
	case '[':
		++coloumn;
		FormatToken(keyword[59]);
		break;
	case ']':
		++coloumn;
		FormatToken(keyword[60]);
		break;
	case '=':
		++coloumn;
		FormatToken(keyword[56]);
		break;
	case '<':
		++coloumn;
		GetChar(curline,coloumn,curch);
		if(curch == '=')
		{
			++coloumn;
			FormatToken(keyword[54]);  //   '<='
			break;
		}
		if(curch == '>')
		{
			++coloumn;
			FormatToken(keyword[55]);          //  '<>'
			break;
		}
		else
		{
			FormatToken(keyword[53]);  //   '<'
			break;
		}
	case '>':
		++coloumn;
		GetChar(curline,coloumn,curch);
		if(curch == '=')
		{
			++coloumn;
			FormatToken(keyword[57]);  //   '>='
			break;
		}
		else
		{
			FormatToken(keyword[58]);  //   '='
			break;
		}
	case '.':
		++coloumn;
		GetChar(curline,coloumn,curch);
		if(curch == '.')
		{
			++coloumn;
			FormatToken(keyword[47]);  //   '..'
			break;
		}
		else
		{
			FormatToken(keyword[46]);  //   '.'
			break;
		}
	default:
		break;
	}
}

void CScannerDlg::callerror(char ch)
{
	PutError(curhang,coloumn,"非法字符");
	++coloumn;
}

void CScannerDlg::InitKeyWord()
{
	for(int i=1;i<=60;i++)
	{
		keyword[i].kind = i;
	}
	keyword[1].name = "and";
	keyword[2].name = "array";
	keyword[3].name = "begin";
	keyword[4].name = "bool";
	keyword[5].name = "call";
	keyword[6].name = "case";
	keyword[7].name = "char";
	keyword[8].name = "constant";
	keyword[9].name = "do";
	keyword[10].name = "else";
	keyword[11].name = "end";
	keyword[12].name = "false";
	keyword[13].name = "for";
	keyword[14].name = "if";
	keyword[15].name = "input";
	keyword[16].name = "integer";
	keyword[17].name = "not";
	keyword[18].name = "of";
	keyword[19].name = "or";
	keyword[20].name = "output";
	keyword[21].name = "procedure";
	keyword[22].name = "program";
	keyword[23].name = "read";
	keyword[24].name = "real";
	keyword[25].name = "repeat";
	keyword[26].name = "set";
	keyword[27].name = "then";
	keyword[28].name = "to";
	keyword[29].name = "true";
	keyword[30].name = "until";
	keyword[31].name = "var";
	keyword[32].name = "while";
	keyword[33].name = "write";

	keyword[34].name = "标识符";
	keyword[35].name = "整常数";
	keyword[36].name = "实常数";
	keyword[37].name = "字符常数";


	keyword[38].name = "'";
	keyword[39].name = "(";
	keyword[40].name = ")";
	keyword[41].name = "*";
	keyword[42].name = "*/";
	keyword[43].name = "+";
	keyword[44].name = ",";
	keyword[45].name = "-";
	keyword[46].name = ".";
	keyword[47].name = "..";
	keyword[48].name = "/";
	keyword[49].name = "/*";
	keyword[50].name = ":";
	keyword[51].name = ":=";
	keyword[52].name = ";";
	keyword[53].name = "<";
	keyword[54].name = "<=";
	keyword[55].name = "<>";
	keyword[56].name = "=";
	keyword[57].name = ">";
	keyword[58].name = ">=";
	keyword[59].name = "[";
	keyword[60].name = "]";
}

BOOL CScannerDlg::IsKeyWord(CString str,token &key)
{
	for(int i=1;i<=33;i++)
	{
		if(!strcmp(str,keyword[i].name))  //在表中查到关键字
		{
			key = keyword[i];
			return TRUE;
		}
	}
	return FALSE;	
}

void CScannerDlg::FormatToken(token del)
{
	CString strtoken;
	strtoken.Format("(%d,%s)",del.kind,del.name);
	m_stoken += strtoken;
}

void CScannerDlg::PutError(int hang,int lie,CString error)
{
	CString str;
	str.Format("第%d行 第%d列 %s",hang,lie,error);
	m_listerror.AddString(str);
	OnShowerror();
}

void CScannerDlg::LookUp(int type, VALUE value)
{
	signform form;
	int len = 0;
	int count = 0;
	int i;
	int integer = 0;
	float fudian = 0.0;
	CString str = _T("");
	CString cmp = _T("");
	token temptoken;
	switch(type)
	{
	case BIAOZHIFU:
		str = value.character;
		len = str.GetLength();
		count = list.list.GetCount();
		for(i=0;i<count;i++)
		{
			POSITION pos;;
			pos = list.list.FindIndex(i);
			form = list.list.GetAt(pos);
			cmp = list.strform.Left(form.name.begin+form.name.length).Right(form.name.length);
			int k = strcmp(str,cmp);
			//符号表中有同名标识符
			if(form.type == BIAOZHIFU &&!k)
			{
				temptoken.kind = 34;
				temptoken.entry = form.name.begin;
				str.Format("(%d,%d)",temptoken.kind,temptoken.entry);
				m_stoken += str;
				goto tag2;
			}
		}
		//符号表中不存在同名标识符
		form.type = BIAOZHIFU;
		form.name.begin = list.totallen;
		form.name.length = len;
		list.totallen += len;
		form.val.character = value.character;
		list.list.AddTail(form);
		list.strform += value.character;
		temptoken.kind = 34;
		temptoken.entry = form.name.begin;
		str.Format("(%d,%d)",temptoken.kind,temptoken.entry);
		m_stoken += str;
tag2:	break;
	case ZIFUCHANGSHU:
		str = value.character;
		len = str.GetLength();
		count = list.list.GetCount();
		for(i=0;i<count;i++)
		{
			POSITION pos;;
			pos = list.list.FindIndex(i);
			form = list.list.GetAt(pos);
			//符号表中有同名标识符
			//cmp = form.val.character;
			cmp = list.strform.Left(form.name.begin+form.name.length).Right(form.name.length);
			int leng = cmp.GetLength();
			
		//	cmp = cmp.Right(leng-1).Left(leng-2);
			int h = strcmp(str,cmp);
			
			if(form.type == ZIFUCHANGSHU &&!h)
			{
				temptoken.kind = 37;
				temptoken.entry = form.name.begin;
				str.Format("(%d,%d)",temptoken.kind,temptoken.entry);
				m_stoken += str;
				goto tag1;
			}
		}
		//符号表中不存在同名标识符
		form.type = ZIFUCHANGSHU;
		form.name.begin = list.totallen;
		form.name.length = len;
		list.totallen += len;
		form.val.character = value.character;
		list.list.AddTail(form);
		list.strform += value.character;
		temptoken.kind = 37;
		temptoken.entry = form.name.begin;
		str.Format("(%d,%d)",temptoken.kind,temptoken.entry);
		m_stoken += str;
tag1:		break;
	case ZHENGCHANGSHU:
		integer = value.integer;
		count = list.list.GetCount();
		for(i=0;i<count;i++)
		{
			POSITION pos;;
			pos = list.list.FindIndex(i);
			form = list.list.GetAt(pos);
			if(form.type ==ZHENGCHANGSHU && integer == form.val.integer)
			{
				temptoken.kind = 35;
				temptoken.entry = form.name.begin;
				str.Format("(%d,%d)",temptoken.kind,temptoken.entry);
				m_stoken += str;
				goto tag3;
			}
		}

		//不存在相同的整数值
		form.type = ZHENGCHANGSHU;
		form.name.begin = list.totallen;
		str.Format("%d",integer);
		//AfxMessageBox(str);
		form.name.length = str.GetLength();
		list.totallen += str.GetLength();
		form.val.integer = integer;
		list.list.AddTail(form);
		list.strform += str;
		temptoken.kind = 35;
		temptoken.entry = form.name.begin;
		str.Format("(%d,%d)",temptoken.kind,temptoken.entry);
		m_stoken += str;
tag3:	break;
	case SHICHANGSHU:
		str = value.character;
		len = str.GetLength();
		count = list.list.GetCount();
		for(i=0;i<count;i++)
		{
			POSITION pos;;
			pos = list.list.FindIndex(i);
			form = list.list.GetAt(pos);
			cmp = list.strform.Left(form.name.begin+form.name.length).Right(form.name.length);
			int k = strcmp(str,cmp);
			if(form.type ==SHICHANGSHU && !k)
			{
				temptoken.kind = 36;
				temptoken.entry = form.name.begin;
				str.Format("(%d,%d)",temptoken.kind,temptoken.entry);
				m_stoken += str;
				goto tag4;
			}
		}

		//不存在相同的整数值
		form.type = SHICHANGSHU;
		form.name.begin = list.totallen;
		form.name.length = len;
		list.totallen += len;
		form.val.fudian = fudian;
		list.list.AddTail(form);
		list.strform += str;
		temptoken.kind = 36;
		temptoken.entry = form.name.begin;
		str.Format("(%d,%d)",temptoken.kind,temptoken.entry);
		m_stoken += str;
tag4:	break;
	default:
		break;
	}
}

⌨️ 快捷键说明

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