📄 symbol.cpp
字号:
#include "common.h"
SymbolItem *Symbols=NULL;
int Feof(FILE *fp)
{
int get_char;
get_char=fgetc(fp);//从数据流读出一个字符
if(get_char==-1)
{
if(feof(fp))
return 1;
}
else
fseek(fp,-1,SEEK_CUR); //任意移动文件中的处理定位器
return 0;
}
int GetReserveWord(char *name_value)
{
const reserve_word_number=19;
int i;
char reserve_word[reserve_word_number][20]=
{
"and","begin","const","else","if","not","or","program","type","while",
"array","call","do","end","mod","of","procedure","then","var"
};
int reserve_type[reserve_word_number]=
{
ANDSYM,BEGINSYM,CONSTSYM,ELSESYM,IFSYM,NOTSYM,ORSYM,PROGRAMSYM,TYPESYM,WHILESYM,
ARRAYSYM,CALLSYM,DOSYM,ENDSYM,MODSYM,OFSYM,PROCSYM,THENSYM,VARSYM
};
for(i=0;i<reserve_word_number;i++)
if(!stricmp(reserve_word[i],name_value))//查找保留字
return reserve_type[i];
return 0;
}
void AddSymbolNode(SymbolItem **current,int line_number,int type,int iValue)
{
(*current)->Next=new SymbolItem;
if(!(*current)->Next)
{
Error(7);
exit(4);
}
(*current)=(*current)->Next;
(*current)->LineNumber=line_number;
(*current)->Type=type;
(*current)->Value.iValue=iValue;
(*current)->Next=NULL;
}
void GetSymbol(FILE *src_file)
{
int line_number=1;
char name_value[SYMNAMESIZE];
int name_value_index;
char read_char;
int err_num=0;
SymbolItem head,*current=&head;
printf("Analysing the word symbol...");
while(!Feof(src_file))
{
read_char=fgetc(src_file);
if(iscsymf(read_char))
{
name_value_index=0;
do
{
name_value[name_value_index++]=read_char;
read_char=fgetc(src_file);
if(Feof(src_file))
break;
}while(iscsym(read_char) || isdigit(read_char));
name_value[name_value_index]=0;
fseek(src_file,-1,SEEK_CUR);
current->Next=new SymbolItem;
current=current->Next;
current->LineNumber=line_number;
if(!(current->Type=GetReserveWord(name_value)))
{
current->Type=IDENT;
current->Value.lpValue=new char[name_value_index];
strcpy(current->Value.lpValue,name_value);
}
current->Next=NULL;
}
else if(isdigit(read_char))
{
name_value_index=0;
do
{
name_value[name_value_index++]=read_char;
read_char=fgetc(src_file);
if(Feof(src_file))
break;
}while(isdigit(read_char));
name_value[name_value_index]=0;
fseek(src_file,-1,SEEK_CUR);
AddSymbolNode(¤t,line_number,INTCON,atoi(name_value));
}
else switch(read_char)
{
case ' ': //character tab
case ' ':
break;
case '\n':
break;
case '\r':
line_number++;
break;
case ':':
if(Feof(src_file))
break;
read_char=fgetc(src_file);
if(read_char=='=')
AddSymbolNode(¤t,line_number,BECOME,0);
else
{
fseek(src_file,-1,SEEK_CUR);
AddSymbolNode(¤t,line_number,COLON,0);
}
break;
case '<':
if(Feof(src_file))
break;
read_char=fgetc(src_file);
if(read_char=='=')
AddSymbolNode(¤t,line_number,LEQ,0);
else if(read_char=='>')
AddSymbolNode(¤t,line_number,NEQ,0);
else
{
fseek(src_file,-1,SEEK_CUR);
AddSymbolNode(¤t,line_number,LSS,0);
}
break;
case '>':
if(Feof(src_file))
break;
read_char=fgetc(src_file);
if(read_char=='=')
AddSymbolNode(¤t,line_number,GEQ,0);
else
{
fseek(src_file,-1,SEEK_CUR);
AddSymbolNode(¤t,line_number,GTR,0);
}
break;
case '.':
if(Feof(src_file))
{
AddSymbolNode(¤t,line_number,PERIOD,0);
break;
}
read_char=fgetc(src_file);
if(read_char=='.')
AddSymbolNode(¤t,line_number,DPOINT,0);
else
{
fseek(src_file,-1,SEEK_CUR);
AddSymbolNode(¤t,line_number,PERIOD,0);
}
break;
case '\'':
read_char=fgetc(src_file);
if(Feof(src_file))
break;
if(fgetc(src_file)=='\'')
AddSymbolNode(¤t,line_number,CHARCON,read_char);
else
{
err_num++;
Error(1);
}
break;
case '+':
AddSymbolNode(¤t,line_number,PLUS,0);
break;
case '-':
AddSymbolNode(¤t,line_number,MINUS,0);
break;
case '*':
AddSymbolNode(¤t,line_number,TIMES,0);
break;
case '/':
AddSymbolNode(¤t,line_number,DIVSYM,0);
break;
case '(':
AddSymbolNode(¤t,line_number,LPAREN,0);
break;
case ')':
AddSymbolNode(¤t,line_number,RPAREN,0);
break;
case '=':
AddSymbolNode(¤t,line_number,EQL,0);
break;
case '[':
AddSymbolNode(¤t,line_number,LBRACK,0);
break;
case ']':
AddSymbolNode(¤t,line_number,RBRACK,0);
break;
case ';':
AddSymbolNode(¤t,line_number,SEMICOLON,0);
break;
case ',':
AddSymbolNode(¤t,line_number,COMMA,0);
break;
default:
err_num++;
Error(2);
} //switch end
} //while end
Symbols=head.Next;
if(err_num)
{
printf("\n%d errors found.",err_num);
exit(2);
}
else
printf("OK!\n");
}
void DestroySymbols()
{
SymbolItem *current,*need_del;
current=Symbols;
while(!current)
{
need_del=current;
if(current->Type==IDENT)
delete current->Value.lpValue;
current=current->Next;
delete need_del;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -