?? symboltable.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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -