type.cpp
来自「编译原理的作业 编译器」· C++ 代码 · 共 80 行
CPP
80 行
#include "type.h"
StringPool::StringPool()
:_curPos(0)
{
}
int StringPool::Add(const char* str)
{
MapBucket b;
b = _indexer.Exsits(MapBucket(str));
if (b._index != -1)
{
return b._index;
}
b._index = _curPos;
b._str = str;
strcpy(_pool + _curPos, str);
_curPos += (strlen(str) + 1);
_indexer.Insert(b);
return b._index;
}
void StringPool::Store(FILE* fp)
{
fwrite(_pool, sizeof(char), _curPos, fp);
}
FieldDesc::FieldDesc()
:_name(0), _size(0), _type(Void)
{
}
MethodDesc::MethodDesc()
:_addr(0), _isEntry(false), _maxStack(0), _name(0), _retType(Void)
{
}
MetaDataDesc::MetaDataDesc()
{
}
void MetaDataDesc::AddMethod(MethodDesc& method)
{
_methods.PushBack(method);
}
void MetaDataDesc::Store(FILE* file)
{
List<FieldDesc>::Iterator fi(_fields);
List<MethodDesc>::Iterator mi(_methods);
for (fi.First(); !fi.IsDone(); fi.Next())
{
fwrite(&(fi.Current()), sizeof(FieldDesc), 1, file);
}
for (mi.First(); !mi.IsDone(); mi.Next())
{
fwrite(&(mi.Current()), sizeof(MethodDesc), 1, file);
}
}
int Key(const MethodBucket& b)
{
return (int)(b._name) % PRIME;
}
int Key(const MapBucket& b)
{
return (int)((b._str)[0] % PRIME);
}