⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 symbol.cpp

📁 PL语言到中间代码的编译程序
💻 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(&current,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(&current,line_number,BECOME,0);
				else
				{
					fseek(src_file,-1,SEEK_CUR);
					AddSymbolNode(&current,line_number,COLON,0);
				}
				break;
			case '<':
				if(Feof(src_file))
					break;
				read_char=fgetc(src_file);
				if(read_char=='=')
					AddSymbolNode(&current,line_number,LEQ,0);
				else if(read_char=='>')
					AddSymbolNode(&current,line_number,NEQ,0);
				else
				{
					fseek(src_file,-1,SEEK_CUR);
					AddSymbolNode(&current,line_number,LSS,0);
				}
				break;
			case '>':
				if(Feof(src_file))
					break;
				read_char=fgetc(src_file);
				if(read_char=='=')
					AddSymbolNode(&current,line_number,GEQ,0);
				else
				{
					fseek(src_file,-1,SEEK_CUR);
					AddSymbolNode(&current,line_number,GTR,0);
				}
				break;
			case '.':
				if(Feof(src_file))
				{
					AddSymbolNode(&current,line_number,PERIOD,0);
					break;
				}
				read_char=fgetc(src_file);
				if(read_char=='.')
					AddSymbolNode(&current,line_number,DPOINT,0);
				else
				{
					fseek(src_file,-1,SEEK_CUR);
					AddSymbolNode(&current,line_number,PERIOD,0);
				}
				break;
			case '\'':
				read_char=fgetc(src_file);
				if(Feof(src_file))
					break;
				if(fgetc(src_file)=='\'')
					AddSymbolNode(&current,line_number,CHARCON,read_char);
				else
				{
					err_num++;
					Error(1);
				}
				break;
			case '+':
				AddSymbolNode(&current,line_number,PLUS,0);
				break;
			case '-':
				AddSymbolNode(&current,line_number,MINUS,0);
				break;
			case '*':
				AddSymbolNode(&current,line_number,TIMES,0);
				break;
			case '/':
				AddSymbolNode(&current,line_number,DIVSYM,0);
				break;
			case '(':
				AddSymbolNode(&current,line_number,LPAREN,0);
				break;
			case ')':
				AddSymbolNode(&current,line_number,RPAREN,0);
				break;
			case '=':
				AddSymbolNode(&current,line_number,EQL,0);
				break;
			case '[':
				AddSymbolNode(&current,line_number,LBRACK,0);
				break;
			case ']':
				AddSymbolNode(&current,line_number,RBRACK,0);
				break;
			case ';':
				AddSymbolNode(&current,line_number,SEMICOLON,0);
				break;
			case ',':
				AddSymbolNode(&current,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 + -