📄 myscannerdlg.cpp
字号:
if(flag)
{//是实数
if(j!=-1)
{//如果符号表中已经有了
token[m_pos_token].type=36;
::strcpy(token[m_pos_token].word,tmp);
sprintf(token[m_pos_token].val,"%d",j);
m_pos_token++;
}
else
{
::strcpy(chartab[m_pos_chartab].type,"实");
::strcpy(chartab[m_pos_chartab].val,tmp);
::strcpy(chartab[m_pos_chartab].kind,"常数");
token[m_pos_token].type=36;
::strcpy(token[m_pos_token].word,tmp);
sprintf(token[m_pos_token].val,"%d",m_pos_chartab);
m_pos_token++;
m_pos_chartab++;
}
}
else
{//是整数
if(j!=-1)
{//如果符号表中已经有了
token[m_pos_token].type=35;
::strcpy(token[m_pos_token].word,tmp);
sprintf(token[m_pos_token].val,"%d",j);
m_pos_token++;
}
else
{
::strcpy(chartab[m_pos_chartab].type,"整");
::strcpy(chartab[m_pos_chartab].val,tmp);
::strcpy(chartab[m_pos_chartab].kind,"常数");
token[m_pos_token].type=35;
::strcpy(token[m_pos_token].word,tmp);
sprintf(token[m_pos_token].val,"%d",m_pos_chartab);
m_pos_chartab++;
m_pos_token++;
}
}
}
//---------------------------------------------
//
//
//---------------------------------------------
void CMyScannerDlg::operhit()//识别注解
{
if(getnext(m_pos)=='*')
{
addpos();
addpos();
while((!(getcur(m_pos)=='*'&&getnext(m_pos)=='/'))&&!(getcur(m_pos)=='\n')&&!(getcur(m_pos)==0))
{
addpos();
}
if(getcur(m_pos)=='\n'||getcur(m_pos)==0)
{
wrong[m_pos_error].ln=line;
wrong[m_pos_error].col=col;
::strcpy(wrong[m_pos_error].wrongmsg,"注解不封闭");
m_pos_error++;
}
else
{
addpos();
addpos();
}
}
else
{
token[m_pos_token].type=48;
::strcpy(token[m_pos_token].word,"/");
::strcpy(token[m_pos_token].val,"_ ");
m_pos_token++;
addpos();
}
}
//---------------------------------------------
//
//
//---------------------------------------------
void CMyScannerDlg::opercharconst()//识别字符常量
{
char tmp[50];
unsigned int i=0;
int j;
addpos();
while((getcur(m_pos)!='\'')&&!(getcur(m_pos)=='\n')&&!(getcur(m_pos)=='\r')&&!(getcur(m_pos)==0))
{
tmp[i]=getcur(m_pos);
i++;
addpos();
}
tmp[i]=0;
if(getcur(m_pos)=='\n'||getcur(m_pos)=='\r'||getcur(m_pos)==0)
{
wrong[m_pos_error].ln=line;
wrong[m_pos_error].col=col;
::strcpy(wrong[m_pos_error].wrongmsg,"字符常数不封闭");
m_pos_error++;
}
else
{
addpos();
}
i=::strlen(tmp);
j=isincharstrtab(tmp,2);
if(j!=-1)
{
token[m_pos_token].type=37;
::strcpy(token[m_pos_token].word,tmp);
sprintf(token[m_pos_token].val,"%d",j);
m_pos_token++;
}
else
{
chartab[m_pos_chartab].startpos=m_charstrtab_length;
chartab[m_pos_chartab].length=i;
::strcpy(chartab[m_pos_chartab].type,"字符");
::strcpy(chartab[m_pos_chartab].kind,"常量");
::strcpy(string[m_pos_charstrtab].string,tmp);
string[m_pos_charstrtab].flag=false;
string[m_pos_charstrtab].pos=m_pos_chartab;
m_charstrtab_length+=i;
token[m_pos_token].type=37;
::strcpy(token[m_pos_token].word,tmp);
sprintf(token[m_pos_token].val,"%d",string[m_pos_charstrtab].pos);
m_pos_charstrtab++;
m_pos_chartab++;
m_pos_token++;
}
}
//---------------------------------------------
//
//
//---------------------------------------------
void CMyScannerDlg::operother()//识别其他符号
{
char tmp;
tmp=getcur(m_pos);
switch(tmp)
{
case '(':
token[m_pos_token].type=39;
::strcpy(token[m_pos_token].word,"(");
::strcpy(token[m_pos_token].val,"_ ");
m_pos_token++;
addpos();
break;
case ')':
token[m_pos_token].type=40;
::strcpy(token[m_pos_token].word,")");
::strcpy(token[m_pos_token].val,"_ ");
m_pos_token++;
addpos();
break;
case '*':
if(getnext(m_pos)=='/')
{
wrong[m_pos_error].ln=line;
wrong[m_pos_error].col=col;
::strcpy(wrong[m_pos_error].wrongmsg,"错误的注释结尾(没有开始)");
addpos();
addpos();
}
else
{
token[m_pos_token].type=41;
::strcpy(token[m_pos_token].word,"*");
::strcpy(token[m_pos_token].val,"_ ");
m_pos_token++;
addpos();
}
break;
case '+':
token[m_pos_token].type=43;
::strcpy(token[m_pos_token].word,"+");
::strcpy(token[m_pos_token].val,"_ ");
m_pos_token++;
addpos();
break;
case ',':
token[m_pos_token].type=44;
::strcpy(token[m_pos_token].word,",");
::strcpy(token[m_pos_token].val,"_ ");
m_pos_token++;
addpos();
break;
case '-':
token[m_pos_token].type=45;
::strcpy(token[m_pos_token].word,"-");
::strcpy(token[m_pos_token].val,"_ ");
m_pos_token++;
addpos();
break;
case ':':
if(getnext(m_pos)=='=')
{
token[m_pos_token].type=51;
::strcpy(token[m_pos_token].word,":=");
::strcpy(token[m_pos_token].val,"_ ");
m_pos_token++;
addpos();
addpos();
}
else
{
token[m_pos_token].type=50;
::strcpy(token[m_pos_token].word,":");
::strcpy(token[m_pos_token].val,"_ ");
m_pos_token++;
addpos();
}
break;
case ';':
token[m_pos_token].type=52;
::strcpy(token[m_pos_token].word,";");
::strcpy(token[m_pos_token].val,"_ ");
m_pos_token++;
addpos();
break;
case '<':
if(getnext(m_pos)=='=')
{
token[m_pos_token].type=54;
::strcpy(token[m_pos_token].word,"<=");
::strcpy(token[m_pos_token].val,"_ ");
m_pos_token++;
addpos();
addpos();
}
else if(getnext(m_pos)=='>')
{
token[m_pos_token].type=55;
::strcpy(token[m_pos_token].word,"<>");
::strcpy(token[m_pos_token].val,"_ ");
m_pos_token++;
addpos();
addpos();
}
else
{
token[m_pos_token].type=53;
::strcpy(token[m_pos_token].word,"<");
::strcpy(token[m_pos_token].val,"_ ");
m_pos_token++;
addpos();
}
break;
case '=':
token[m_pos_token].type=56;
::strcpy(token[m_pos_token].word,"=");
::strcpy(token[m_pos_token].val,"_ ");
m_pos_token++;
addpos();
break;
case '>':
if(getnext(m_pos)=='=')
{
token[m_pos_token].type=58;
::strcpy(token[m_pos_token].word,">=");
::strcpy(token[m_pos_token].val,"_ ");
m_pos_token++;
addpos();
addpos();
}
else
{
token[m_pos_token].type=57;
::strcpy(token[m_pos_token].word,">");
::strcpy(token[m_pos_token].val,"_ ");
m_pos_token++;
addpos();
}
break;
case '[':
token[m_pos_token].type=59;
::strcpy(token[m_pos_token].word,"[");
::strcpy(token[m_pos_token].val,"_ ");
m_pos_token++;
addpos();
break;
case ']':
token[m_pos_token].type=60;
::strcpy(token[m_pos_token].word,"]");
::strcpy(token[m_pos_token].val,"_ ");
m_pos_token++;
addpos();
break;
case '.':
wrong[m_pos_error].ln=line;
wrong[m_pos_error].col=col;
::strcpy(wrong[m_pos_error].wrongmsg,"错误的小数点标记");
col++;
m_pos_error++;
case ' ':
addpos();
break;
case '\n':
addpos();
col=1;
line++;
break;
case '\r':
addpos();
break;
case '\t':
addpos();
break;
default:
wrong[m_pos_error].ln=line;
wrong[m_pos_error].col=col;
::strcpy(wrong[m_pos_error].wrongmsg,"非法字符");
m_pos_error++;
addpos();
break;
}
}
//**************************************************************
//
//
//**********************************************************
void CMyScannerDlg::output()
{
unsigned int i;
char tmp[5000];
char tmp1[3];
tmp[0]=0;
for(i=0;i<m_pos_charstrtab;i++)
{
::strcpy(tmp,::strcat(tmp,string[i].string));
}
tmp[m_charstrtab_length]=0;
m_charstrtab.SetWindowText(tmp);
//以上输出字符串表
m_tokentab.ResetContent();
for(i=0;i<m_pos_token;i++)
{
tmp[0]=0;
::strcpy(tmp,::strcat(tmp,token[i].word));
::strcpy(tmp,::strcat(tmp,"("));
sprintf(tmp1,"%d",token[i].type);
::strcpy(tmp,::strcat(tmp,tmp1));
::strcpy(tmp,::strcat(tmp,","));
::strcpy(tmp,::strcat(tmp,token[i].val));
::strcpy(tmp,::strcat(tmp,")"));
m_tokentab.AddString(tmp);
}
//以上输出token串表
m_chartable.ResetContent();
m_chartable.AddString("起始位置 长度 类型 种属 数值 地址");
m_chartable.AddString("");
for(i=0;i<m_pos_chartab;i++)
{
tmp[0]=0;
if((chartab[i].startpos!=-1)&&(::strlen(chartab[i].type)==0))
{
sprintf(tmp1,"%d",chartab[i].startpos);
::strcpy(tmp,::strcat(tmp,tmp1));
::strcpy(tmp,::strcat(tmp," "));
sprintf(tmp1,"%d",chartab[i].length);
::strcpy(tmp,::strcat(tmp,tmp1));
m_chartable.AddString(tmp);
}
else if((chartab[i].startpos!=-1)&&(::strlen(chartab[i].type)!=0))
{
sprintf(tmp1,"%d",chartab[i].startpos);
::strcpy(tmp,::strcat(tmp,tmp1));
::strcpy(tmp,::strcat(tmp," "));
sprintf(tmp1,"%d",chartab[i].length);
::strcpy(tmp,::strcat(tmp,tmp1));
::strcpy(tmp,::strcat(tmp," "));
::strcpy(tmp,::strcat(tmp,chartab[i].type));
::strcpy(tmp,::strcat(tmp," "));
::strcpy(tmp,::strcat(tmp,chartab[i].kind));
m_chartable.AddString(tmp);
}
else
{
::strcpy(tmp,::strcat(tmp," "));
::strcpy(tmp,::strcat(tmp,chartab[i].type));
::strcpy(tmp,::strcat(tmp," "));
::strcpy(tmp,::strcat(tmp,chartab[i].kind));
::strcpy(tmp,::strcat(tmp," "));
::strcpy(tmp,::strcat(tmp,chartab[i].val));
m_chartable.AddString(tmp);
}
}
//以上输出符号表
m_errortab.ResetContent();
m_errortab.AddString("行 列 错误类型");
m_errortab.AddString("");
for(i=0;i<m_pos_error;i++)
{
tmp[0]=0;
sprintf(tmp1,"%d",wrong[i].ln);
::strcpy(tmp,::strcat(tmp,tmp1));
::strcpy(tmp,::strcat(tmp," "));
sprintf(tmp1,"%d",wrong[i].col);
::strcpy(tmp,::strcat(tmp,tmp1));
::strcpy(tmp,::strcat(tmp," "));
::strcpy(tmp,::strcat(tmp,wrong[i].wrongmsg));
m_errortab.AddString(tmp);
}
//以上输出错误信息
}
//************************************************************
//
//
//***********************************************************
void CMyScannerDlg::OnButtonSave()
{
// TODO: Add your control notification handler code here
CFile file_string;
CStdioFile file_token;
CStdioFile file_chartab;
CStdioFile file_error;
CString tmp;
char tmp_string[5000];
int list_count,i;
//生成字符串表文件
file_string.Open("字符串表.txt",CFile::modeCreate|CFile::modeWrite);
int sz=m_charstrtab.GetWindowText(tmp_string,5000);
tmp_string[sz]=0;
file_string.Write(tmp_string,::strlen(tmp_string));
file_string.Close();
//生成token串表文件
file_token.Open("TOKEN串表.txt",CFile::modeCreate|CFile::modeWrite);
list_count=m_tokentab.GetCount();
for(i=0;i<list_count;i++)
{
m_tokentab.GetText(i,tmp);
tmp=tmp+'\n';
file_token.WriteString(tmp);
}
file_token.Close();
//生成符号表文件
file_chartab.Open("字符表.txt",CFile::modeCreate|CFile::modeWrite);
list_count=m_chartable.GetCount();
for(i=0;i<list_count;i++)
{
m_chartable.GetText(i,tmp);
tmp=tmp+'\n';
file_chartab.WriteString(tmp);
}
file_chartab.Close();
//生成错误列表文件
file_error.Open("错误列表.txt",CFile::modeCreate|CFile::modeWrite);
list_count=m_errortab.GetCount();
for(i=0;i<list_count;i++)
{
m_errortab.GetText(i,tmp);
tmp=tmp+'\n';
file_error.WriteString(tmp);
}
file_error.Close();
MessageBox("结果已保存,请查看!");
}
void CMyScannerDlg::OnButtonAbout()
{
// TODO: Add your control notification handler code here
MessageBox(" MyScanner(词法分析器)\n\n计算机科学学院2002级1班 徐小豹 \n\n 2004.12.1");
}
void CMyScannerDlg::OnEnChangeEditInput()
{
// TODO: 如果该控件是 RICHEDIT 控件,则它将不会
// 发送该通知,除非重写 CDialog::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask(),
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
// TODO: 在此添加控件通知处理程序代码
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -