?? scanner.h
字號:
#include<string.h>
char* reserve[21]={"and","begin","const","div","do","else","end","function","if","integer",
"not","or","procedure","program","read","real","then","type","var","while","write"}; //保留字表
int num[30]; //常量表
int const_tab=0; //常量表當前大小
char line[100]; //放入文件的一行
static int ii=0,jj=0; //當前文件讀頭位置,行未標志
int lineno=1; //行號
extern char token[11]; //標識符的緩沖區
int scanner(ifstream&);
void getnbc(ifstream&, char&);
void getchar(ifstream&, char&);
int search_reserve(char*);
int search_symbol(char*);
int search_num(char*);
void retract(char&);
int getconst(); //當剛掃描到一個數時,此函數用來返回其編號,若常量數組中已經有該數,則已有地址
int scanner(ifstream& sf)
{
int token_num=0; //緩沖區當前大小
int temp=0;
char current;
getnbc(sf,current);
switch(current)
{
case'a':
case'b':
case'c':
case'd':
case'e':
case'f':
case'g':
case'h':
case'i':
case'j':
case'k':
case'l':
case'm':
case'n':
case'o':
case'p':
case'q':
case'r':
case's':
case't':
case'u':
case'v':
case'w':
case'x':
case'y':
case'z': token[token_num]=current;
token_num++;
getchar(sf,current);
while((current<='z'&¤t>='a')||(current<='9'&¤t>='0'))
{
if(token_num<10)
{
token[token_num]=current;
token_num++;
}
getchar(sf,current);
}
token[token_num]='\0';
retract(current);
temp=search_reserve(token);
if(temp==-1)
{
return 21;
}
else
{
return temp;
}
break;
case'0':
case'1':
case'2':
case'3':
case'4':
case'5':
case'6':
case'7':
case'8':
case'9':
temp=current-30; //char到int的轉變
getchar(sf,current);
while(current<='9'&¤t>='0')
{
if(temp<65535)
{
temp=temp*10+(current-30); //char到int的轉變
}
getchar(sf,current);
}
num[const_tab++]=temp;
retract(current);
return 22;
break;
case',':
return 23;
case';':
return 24;
case':': getchar(sf,current);
if(current=='=')
{
return 44;
}else
{
retract(current);
return 25;
}
case'.': getchar(sf,current);
if(current=='.')
{
return 31;
}else
{
retract(current);
return 26;
}
case'(':
return 27;
case')':
return 28;
case'[':
return 29;
case']':
return 30;
//缺單目加
//缺單目減
case'+':
return 34;
case'-':
return 35;
case'*':
return 36;
case'/':
return 37;
case'=':
return 38;
case'<': getchar(sf,current);
if(current=='>')
{
return 41;
}
if(current=='=')
{
return 42;
}
else
{
retract(current);
return 39;
}
case'>': getchar(sf,current);
if(current=='=')
{
return 43;
}else
{
retract(current);
return 40;
}
case'{':
return 45;
case'}':
return 46;
case'#':
return 47;
default:
return -1;
}
}
void getnbc(ifstream& sf, char& current)
{
GET: getchar(sf,current);
if(current==' '||current=='\0'||current=='\t')
{
do{
getchar(sf,current);
}while(current==' '||current=='\0'||current=='\t');
}
if(current=='{')
{
do{
getchar(sf,current);
}while(current!='}');
goto GET;
}
}
void getchar(ifstream& sf, char& current)
{
if(ii==jj)
{
ii=jj=0;
sf.getline(line,100);
for( ;line[jj]!='\0';jj++);
lineno=lineno+1;
current=line[ii];
return;
}
current=line[++ii];
if(current>='A'&¤t<='Z')
current+=32;
}
int search_reserve(char* token)
{
for(int i=0;i<=20;i++)
{
if(strcmp(token,reserve[i])==0)
return i;
}
return -1;
}
void retract(char& current)
{
ii--;
current=line[ii];
}
int getconst()
{
for(int i=0;i<const_tab-1;i++)
{
if(num[i]==num[const_tab-1])
{
const_tab-=1;
return 1000+i;
}
}
return 999+const_tab;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -