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