📄 scan.cpp
字号:
{
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 + -