📄 scanner.cpp
字号:
#include"Scanner.h"
#include<fstream>
#include"stdio.h"
string Reservations[21]=
{
"program","type","var","procedure","begin",
"end","array","of","record","if","then",
"else","fi","while","do","endwh","read",
"write","return","integer","char"
};
scanner::scanner()
{
i_Row=1;
i_SmBr=0;
i_MiBr=0;
i_BiBr=0;
i_SgQu=0;
i_Isfirst=0;
i_IsRight=0;
}
scanner::~scanner()
{
Token * T_tem=T_first;
while(T_first!=T_last)
{
T_tem=T_first;
T_first=T_first->T_next;
delete T_tem;
}
}
Token* scanner::GetToken()
{
return T_first;
}
void scanner::AddNewToken(int r,string str1,string str2)
{
if(i_Isfirst==0)
{
T_first=new Token;
T_first->i_row=r;
T_first->str_wom=str1;
T_first->str_grm=str2;
T_first->T_next=NULL;
T_last=&(*T_first);
i_Isfirst++;
}
else
{
T_last->T_next=new Token;
T_last->T_next->i_row=r;
T_last->T_next->str_wom=str1;
T_last->T_next->str_grm=str2;
T_last->T_next->T_next=NULL;
T_last=T_last->T_next;
i_Isfirst++;
}
}
int scanner::IsLetter(char a)
{
if(int(a)>=65&&int(a)<=90||int(a)>=97&&int(a)<=122)
return 1;
else return 0;
}
int scanner::IsNum(char a)
{
if(int(a)>=48&&int(a)<=57)
return 1;
else return 0;
}
int scanner::Mscan()
{
FILE *Input=fopen("test.txt","r");
if(Input==NULL)
cout<<"fopen is down!"<<endl;
else
{
char ch;
ch=fgetc(Input);
while(ch!=EOF)
{
if(IsLetter(ch)==1)
{
string str_Temp;
str_Temp+=ch;
ch=fgetc(Input);
while(IsLetter(ch)==1||IsNum(ch)==1)
{
str_Temp+=ch;
ch=fgetc(Input);
}
int i_IsRe=0;
for(int i=0;i<=20;i++)
{
if(str_Temp==Reservations[i])
{
i_IsRe=1;
AddNewToken(i_Row,str_Temp,"");
}
}
if(i_IsRe==0)
{
AddNewToken(i_Row,"ID",str_Temp);
}
}
else if(IsNum(ch)==1)
{
char c_Temp[32];
int i_Temp=1;
string str_Te;
str_Te+=ch;
c_Temp[0]=ch;
ch=fgetc(Input);
while(IsNum(ch)==1)
{
str_Te+=ch;
c_Temp[i_Temp]=ch;
i_Temp++;
ch=fgetc(Input);
}
if(IsLetter(ch)==1)
cout<<i_Row<<'\t'<<"error!"<<endl;
else
{
AddNewToken(i_Row,"integer",str_Te);
}
}
else if(ch==':')
{
ch=fgetc(Input);
if(ch=='=')
{
AddNewToken(i_Row,":=","");
ch=fgetc(Input);
}
else
{
i_IsRight++;
cout<<i_Row<<'\t'<<"error,missng = !"<<endl;
}
}
else if(ch==';'||ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='<'||ch=='='||ch==',')
{
char c_Temp=ch;
string str_t;
str_t+=ch;
AddNewToken(i_Row,str_t,"");
ch=fgetc(Input);
if(ch==';'||ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='<'||ch=='='||ch==',')
{
i_IsRight++;
cout<<i_Row<<'\t'<<"missing a Number or a char at the back of"<<endl;
}
}
else if(ch=='('||ch==')'||ch=='['||ch==']'||ch=='{'||ch=='}'||ch=='\'') //39是'的ASCII码
{
switch (ch)
{
case '(':
i_SmBr++;
AddNewToken(i_Row,"(","");
break;
case ')':
i_SmBr--;
AddNewToken(i_Row,")","");
break;
case '[':
i_MiBr++;
AddNewToken(i_Row,"[","");
break;
case ']':
i_MiBr--;
AddNewToken(i_Row,"]","");
break;
case '{':
i_BiBr++;
ch=fgetc(Input);
while(ch!='}'&&ch!=EOF||ch=='\n')
{
if(ch=='\n')
i_Row++;
ch=fgetc(Input);
}
break;
case '}':
i_BiBr--;
break;
default:break;
}
if((int)ch==39)
i_SgQu++;
ch=fgetc(Input);
}
else if(ch=='.')
{
ch=fgetc(Input);
if(ch=='.')
{
AddNewToken(i_Row,"..","");
ch=fgetc(Input);
}
else
{
AddNewToken(i_Row,".","");
}
}
else if(ch=='\n')
{
ch=fgetc(Input);
if(i_SmBr<0)
{
i_IsRight++;
cout<<i_Row<<'\t'<<"error,missing a '('."<<endl;
}
else if(i_SmBr>0)
{
i_IsRight++;
cout<<i_Row<<'\t'<<"error,missing a ')'."<<endl;
}
if(i_MiBr<0)
{
i_IsRight++;
cout<<i_Row<<'\t'<<"error,missing a '['."<<endl;
}
else if(i_MiBr>0)
{
i_IsRight++;
cout<<i_Row<<'\t'<<"error,missing a ']'."<<endl;
}
if(i_SgQu%2!=0)
{
i_IsRight++;
cout<<i_Row<<'\t'<<"error,missing a ' ."<<endl;
}
i_SmBr=0;
i_MiBr=0;
i_BiBr=0;
i_SgQu=0;
i_Row++;
}
else if(ch==' '||ch=='\t')
ch=fgetc(Input);
else
{
i_IsRight++;
cout<<i_Row<<'\t'<<"Illegal character!"<<endl;
ch=fgetc(Input);
}
}
if(i_BiBr<0)
{
i_IsRight++;
cout<<i_Row<<'\t'<<"error,missing "<<i_BiBr<<"'{'."<<endl;
}
else if(i_BiBr>0)
{
i_IsRight++;
cout<<i_Row<<'\t'<<"error,missing "<<i_BiBr<<" '}'."<<endl;
}
AddNewToken(i_Row,"EOF","");
}
fclose(Input);
return 1;
}
void scanner::scanner_out()
{
Token * T_temp=T_first;
while(T_temp!=T_last)
{
cout<<T_temp->i_row<<'\t'<<T_temp->str_wom<<'\t'<<T_temp->str_grm<<endl;
T_temp=T_temp->T_next;
}
cout<<T_temp->i_row<<'\t'<<T_temp->str_wom<<'\t'<<T_temp->str_grm<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -