📄 scan.h
字号:
#include"gloab.h"
enum tokentype{IF=1,ELSE,WHILE,INT,VOID,RETURN,
NUM,ID,
PLU,SUB,MUL,DIV,XY,XYD,DAY,DYD,DY,BDY,FZ,FH,DH,LS,RS,LM,RM,LL,RL,
ENDF,ERROR}; //token列表
enum statetype{START,DONE,INNUM,INID,NEQ,EQ,DA,XIA,CH,ZS,ZSZ}; //状态列表
char keys[7][7]={" ","if","else","while","int","void","return"}; //关键字表
char let[51];
char letline[102]; //当前行
bool tag=true;
int pro=0; //属性
int fre=0;
int now=0;
char* fchars()
{
char c[15];
if(fre>now)
{
for(int i=fre;i<=100;i++)
c[i-fre]=letline[i];
for(int j=0;j<now;j++)
c[i-fre+j]=letline[j];
c[i-fre+j]='\0';
}
else
{
int t=0;
for(int i=fre;i<now;i++)
{
if(i==50)
t=1;
else
c[i-fre-t]=letline[i];
}
c[i-fre-t]='\0';
}
return c;
}
tokentype isid() //判断id是否为关键字
{
char *cl=fchars();
tokentype g;
int i=6;
strcpy(keys[0],cl);
while(1)
{
if(strcmp(cl,keys[i])==0)
{g=(tokentype)i;break;}
i--;
}
if(g)
return g;
else
return ID;
}
void inum() //提取当前int型
{
char *cl=fchars();
int cnum=0;
int i=0;
while(cl[i]!='\0')
{
cnum=cnum*10+(int)(cl[i])-48;
i++;
}
cout<<cnum<<' ';
}
char nextchar()
{
if(now==49)
{
if(!tag)
{filetxt.get(let,51,EOF);strcpy(letline+51,let);tag=true;}
now=51;
return letline[now++];
}
else if(now==100)
{
if(tag)
{filetxt.get(let,51,EOF);strcpy(letline,let);tag=false;}
now=0;
return letline[now++];
}
else return letline[now++];
}
void unnextchar()
{
if(now==0)
now=100;
else if(now==51)
now=49;
else now--;
}
/* sybol + - * / < <= > >= == != = ; , ( ) [ ] { } */
tokentype nexttoken()
{
tokentype currentoken;
statetype state=START;
pro=-1;
while(state!=DONE)
{
char c=nextchar();
switch(state)
{
case START:
if(isdigit(c))
state=INNUM;
else if(isalpha(c))
state=INID;
else if((c==' ')||(c=='\t'))
fre=now;
else if(c=='\n')
{lineno++;fre=now;}
else if((c=='!'))
state=NEQ;
else if((c=='='))
state=EQ;
else if((c=='>'))
state=DA;
else if((c=='<'))
state=XIA;
else if((c=='/'))
state=CH;
else {
state=DONE;
fre=now;
switch(c)
{
case '+':currentoken=PLU;break;
case '-':currentoken=SUB;break;
case '*':currentoken=MUL;break;
case '(':currentoken=LS;break;
case ')':currentoken=RS;break;
case '[':currentoken=LM;break;
case ']':currentoken=RM;break;
case '{':currentoken=LL;break;
case '}':currentoken=RL;break;
case ';':currentoken=FH;break;
case ',':currentoken=DH;break;
case 3:currentoken=ENDF;break;
default:currentoken=ERROR;break;
}
}
break;
case INNUM:
{
if(!isdigit(c))
{
unnextchar();
currentoken=NUM;
state=DONE;
}
break;
}
case INID:
{
if(!(isdigit(c)||isalpha(c)))
{
unnextchar();
currentoken=ID;
state=DONE;
}
break;
}
case NEQ:
{
if(c=='=')
{
currentoken=BDY;
state=DONE;
fre=now;
}
else
{
unnextchar();
currentoken=ERROR;
state=DONE;
fre=now;
}
break;
}
case EQ:
{
if(c=='=')
{
currentoken=DY;
state=DONE;
fre=now;
}
else
{
unnextchar();
currentoken=FZ;
state=DONE;
fre=now;
}
break;
}
case DA:
{
if(c=='=')
{
currentoken=DYD;
state=DONE;
fre=now;
}
else
{
unnextchar();
currentoken=DY;
state=DONE;
fre=now;
}
break;
}
case XIA:
{
if(c=='=')
{
currentoken=XYD;
state=DONE;
fre=now;
}
else
{
unnextchar();
currentoken=XY;
state=DONE;
fre=now;
}
break;
}
case CH:
{
if(c=='*')
state=ZS;
else
{
unnextchar();
currentoken=DIV;
state=DONE;
fre=now;
}
break;
}
case ZS:
{
if(c=='*')
state=ZSZ;
break;
}
case ZSZ:
{
if(c=='/')
{state=START;fre=now;}
else
state=ZS;
break;
}
case DONE:
default:
cout<<"state ERROR!!"<<endl;
state=DONE;
currentoken=ERROR;
break;
}
}
if(currentoken==ID)
currentoken=isid();
if(currentoken==NUM)
inum();
return currentoken;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -