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

📄 symboltable.cpp

📁 一个用C++写的编译器
💻 CPP
字号:
#include "stdafx.h"

using namespace std;


char* SymbolTable::insertArr(string lex)
/*
  Insert every character of lex into lexemeArr,append a '\n' at the end.
  Return the pointer points to the loaction of the first character of the string.
*/
{
	char* forR;
	int temp=(int)lex.length();
	for(int ptr=0;ptr<temp;ptr++)
	{
		lexemeArr[c+ptr]=lex[ptr];
	}
	lexemeArr[c+temp]='\n';
	forR=&lexemeArr[c];
	c=c+temp+1;
	return forR;
	
}
string SymbolTable::readArr(char *entry)
/*
  Read one character a time,put it into output,when read '\n',return output.
*/
{
	char* temp=entry;
	string output="";
	while(*temp!='\n')
	{
		output+=*temp;
		temp++;
	}
	return output;
}
void SymbolTable::initiate(string filename)
{
	count=0;
	char a;
	ifstream input;
	input.open(filename.c_str());
	c=0;
	i=0;

	while(!input.eof())
	{
		input.get(a);
		i++;
	}

	try
	{
		lexemeArr=new char[i+40];//allocate 40 more bytes for keywords.
	}
	catch(bad_alloc &)
	/*
		If allocation fails,the program halts.
	*/
	{
		cout<<"symboltable initiate fails"<<endl;
		cout<<i<<endl;
	}
	head=current=new symbolElement();//The first element of the list is empty,leaves for whitespace or comments. 
	current->token=" ";
	current->next=0;
	current->entry=insertArr(" ");
	count++;
	insert("int","int");
	insert("real","real");
	insert("if","if");
	insert("then","then");
	insert("else","else");
	insert("while","while");
	current->next=0;

}

symbolElement* SymbolTable::insert(string lex,string tok)
{
	symbolElement* tPtr=find(lex);
	if(tPtr==0)//if can't find lex in SymbolTable
	{
		current->next=new symbolElement();
		current=current->next;
		current->token=tok;
		current->next=0;
		current->entry=insertArr(lex);
		count++;
		return current;
	}
	else
	{
		return tPtr;
	}

}
symbolElement* SymbolTable::find(string lexeme)
/*
  lexemes are stored in lexemeArr,so search lexemeArr for 
  lexeme
*/
{

	current=head;
	while(true)
	{
		if(readArr(current->entry)==lexeme)//if lexeme was found in lexemeArr
		{
			
			return current;
		}
		if(current->next!=0)
		{
			current=current->next;
		}
		else
		{
			return 0;
		}
	}
	return 0;
}
SymbolTable::~SymbolTable()
{
	current=head;
	while(head->next!=0)
	{
		head=head->next;
		delete current;
		current=head;
		
	}//delete the list
	delete [] lexemeArr;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -