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