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

📄 scanner1.cpp

📁 符合编译原理的词法分析器
💻 CPP
字号:
// Scanner1.cpp: implementation of the CScanner class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Scanner.h"
#include "Scanner1.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CString CScanner::Getresult(CString str)
{
	result = "";	//初始化返回的结果
	start = 0;		//截取字符串的开始位置
	Scan(start, str);//词法分析
	return result;	//返回结果
}

void CScanner::Scan(int start, CString str)
{
	if (start >= (int)strlen(str)) return;
	CString temp;
	temp = str.Mid(start, 1);//从字符串开头开始截取一个字符给temp

//考虑到“/”开头的有可能只是运算符,
//还有可能是界限符“/*”
//在这里处理是界限符“/*”的情况
//并且删除注释
	if(temp == "/")
	{
		temp = str.Mid(start, 2);//从字符串开头开始截取2个字符
		if(temp == "/*")//temp是界限符“/*”
		{
			start+=2;
			result = result + "<" + temp + ", 界限符 " + ">" + '\n';
			for (int i = 0; i <= (int)strlen(str)-start; i++)
			{
				temp = str.Mid(start + i, 2);
				if(temp == "*/")
				{
					start = start + i + 2;
					result = result + "<" + temp + ", 界限符 " + ">" + '\n';
					i = -1;
					break;
				}
			}
			if(i != -1)
				return;
			Scan(start, str);
		}
		else//temp是运算符“/”
		{
			start++;
			result = result + "</, 运算符>" + '\n';
			Scan(start, str);
		}
	}

//处理temp是空格的情况
	else if(Isspace(temp))
	{
		start++;
		Scan(start, str);
	}

//处理temp是界限符的情况
	else if(Isinterpunction(temp))
	{
		start++;
		result = result + "<" + temp + ", 界限符 " + ">" + '\n';
		Scan(start, str);
	}

//处理temp是运算符的情况
	else if(Isoperator(temp))
	{
		if(temp == "+" || temp == "-" || \
			temp == "*" || temp == "/" || \
			temp == "%" || temp == "=" || \
			temp == "&" || temp == "|" || \
			temp == "!" || temp == "^" || \
			temp == "<" || temp == ">")
		{//当temp是以上字符时,有可能出现2位的运算符
			CString temp2 = str.Mid(start, 2);
			if(Isoperator(temp2))
			{//出现2位的运算符
				start+=2;
				result = result + "<" + temp2 + ", 运算符 " + ">" + '\n';
				Scan(start, str);
			}
			else
			{//没有出现2位的运算符,temp是一位运算符
				start++;
				result = result + "<" + temp + ", 运算符 " + ">" + '\n';
				Scan(start, str);
			}
		}
		else//temp是一位的运算符
		{
			start++;
			result = result + "<" + temp + ", 运算符 " + ">" + '\n';
			Scan(start, str);
		}
	}

//处理temp是字母或“_”
	else if(Ischar(temp))
	{
		CString temp3;
		for (int i = 1; start + i <= (int)strlen(str); i++)
		{
			temp3 = str.Mid(start + i, 1);
			if(temp3 == "" || Isspace(temp3) || Isoperator(temp3) || Isinterpunction(temp3))
			{//找到关键字或标识符的结束位置
				temp3 = str.Mid(start, i);
				if(Iskeywords(temp3))
				{//处理是关键字的情况
					start+=i;
					result = result + "<" + temp3 + ", 关键字 " + ">" + '\n';
					Scan(start, str);
					break;
				}
				else
				{//处理是标识符的情况
					start+=i;
					result = result + "<标识符, 指向" + temp3 + "的符号表入口的指针" + ">" + '\n';
					Scan(start, str);
					break;
				}
			}
		}
	}

//处理temp是数字的情况
	else if(Isnum(temp))
	{
		CString temp4;
		int i = 1;
		do
		{
			temp4 = str.Mid(start + i, 1);
			i++;
		}while(Isnum(temp4));//找到数的截止位置
		temp4 = str.Mid(start,i-1);//将数给temp4
		start = start + i -1;//对下次Scan()操作的初始位置赋值
		result = result + "<数, " + temp4 + ">" + '\n';
		Scan(start, str);
	}
}


//判断输入字符串是不是运算符
BOOL CScanner::Isoperator(CString str)
{
	int temp = (int)strlen(str);
	if (temp == 1)
	{
		if (str == "?" || str == ":" || \
			str == "<" || str == ">" || \
			str == "." || str == "!" || \
			str == "~" || str == "&" || \
			str == "^" || str == "|" || \
			str == "=" || str == "%" || \
			str == "+" || str == "-" || \
			str == "*" || str == "/") return TRUE;
	}
	else if(temp == 2)
	{
		if(str == "->" || str == "%=" || \
			str == "&&" || str == "||" || \
			str == "==" || str == "!=" || \
			str == "++" || str == "--" || \
			str == "<<" || str == ">>" || \
			str == "<=" || str == ">=" || \
			str == "&=" || str == "^=" || \
			str == "|=" || str == "+=" || \
			str == "-=" || str == "*=" || \
			str == "/=") return TRUE;
	}
	else if(temp == 3)
	{
		if(str == "<<=" || str == ">>=") return TRUE;
	}
	//对于sizeof,把它放到关键字里处理
	//else
	//{
	//	if(str == "sizeof") return TRUE;
	//}
	return FALSE;
}

//判断输入字符串是不是界限符
BOOL CScanner::Isinterpunction(CString str)
{
	int temp = (int)strlen(str);
	if (temp == 1)
	{
		if(str == "," || str == ";" || \
		   str == "{" || str == "}" || \
		   str == "(" || str == ")" || \
		   str == "[" || str == "]") return TRUE;
	}
	else
	{
		if(str == "/*" || str == "*/") return TRUE;
	}
	return FALSE;
}

//判断输入字符是不是数字
BOOL CScanner::Isnum(CString str)
{
	if (str == "0" || str == "1"  || \
		str == "2" || str == "3"  || \
		str == "4" || str == "5"  || \
		str == "6" || str == "7"  || \
		str == "8" || str == "9") return TRUE;
	return FALSE;
}

//判断输入字符是不是空格
BOOL CScanner::Isspace(CString str)
{
	if(str == " ") return TRUE;
	else return FALSE;
}

//判断输入字符是不是字母或“_”
BOOL CScanner::Ischar(CString str)
{
	if(str == "A" || str == "B" || str == "C" || \
		str == "D" || str == "E" || str == "F" || \
		str == "G" || str == "H" || str == "I" || \
		str == "J" || str == "K" || str == "L" || \
		str == "M" || str == "N" || str == "O" || \
		str == "P" || str == "Q" || str == "R" || \
		str == "S" || str == "T" || str == "U" || \
		str == "V" || str == "W" || str == "X" || \
		str == "Y" || str == "Z" || str == "a" || \
		str == "b" || str == "c" || str == "d" || \
		str == "e" || str == "f" || str == "g" || \
		str == "h" || str == "i" || str == "j" || \
		str == "k" || str == "l" || str == "m" || \
		str == "n" || str == "o" || str == "p" || \
		str == "q" || str == "r" || str == "s" || \
		str == "t" || str == "u" || str == "v" || \
		str == "w" || str == "x" || str == "y" || \
		str == "z" || str == "_") return TRUE;
	else return FALSE;
}

//判断输入字符串是不是关键字
BOOL CScanner::Iskeywords(CString str)
{
	if (str == "auto"	 || \
		str == "break"	 || \
		str == "case"	 || \
		str == "char"	 || \
		str == "const"	 || \
		str == "continue" || \
		str == "default" || \
		str == "do"		 || \
		str == "double"	 || \
		str == "else"	 || \
		str == "enum"	 || \
		str == "extern"	 || \
		str == "float"	 || \
		str == "for"	 || \
		str == "goto"	 || \
		str == "if"		 || \
		str == "int"	 || \
		str == "long"	 || \
		str == "register" || \
		str == "return"	 || \
		str == "short"	 || \
		str == "signed"	 || \
		str == "sizeof"	 || \
		str == "static"	 || \
		str == "struct"	 || \
		str == "switch"	 || \
		str == "typedef" || \
		str == "union"	 || \
		str == "unsigned" || \
		str == "void"	 || \
		str == "volatile" || \
		str == "while") return TRUE;
	return FALSE;
}


CScanner::CScanner()
{
}

CScanner::~CScanner()
{
}

⌨️ 快捷键说明

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