Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Курсовая работа2 / TableMgr
.cpp
// File: TableMgr.cpp
#include "StdAfx.h"
#include "TableMgr.h"
#include <cstdio>
#include <assert.h>
#include "Utilities.h"
#include "ErrorHandler.h"
#include "Limits.h"
using namespace std;
//-----------------------------------------------------------------------------
CTableManager g_TableMgr;
//-----------------------------------------------------------------------------
CTableManager::CTableManager()
{
m_tKeyWords.AddRecord(RecordKeyWord( "Program", TKN_PROGRAM ));
m_tKeyWords.AddRecord(RecordKeyWord( "Const", TKN_CONST ));
m_tKeyWords.AddRecord(RecordKeyWord( "Var", TKN_VAR ));
m_tKeyWords.AddRecord(RecordKeyWord( "Begin", TKN_BEGIN ));
m_tKeyWords.AddRecord(RecordKeyWord( "End", TKN_END ));
m_tKeyWords.AddRecord(RecordKeyWord( "If", TKN_IF ));
m_tKeyWords.AddRecord(RecordKeyWord( "Then", TKN_THEN ));
m_tKeyWords.AddRecord(RecordKeyWord( "Else", TKN_ELSE ));
m_tKeyWords.AddRecord(RecordKeyWord( "For", TKN_FOR ));
m_tKeyWords.AddRecord(RecordKeyWord( "While", TKN_WHILE ));
m_tKeyWords.AddRecord(RecordKeyWord( "Do", TKN_DO ));
m_tKeyWords.AddRecord(RecordKeyWord( "To", TKN_TO ));
m_tKeyWords.AddRecord(RecordKeyWord( "Or", TKN_OR ));
m_tKeyWords.AddRecord(RecordKeyWord( "And", TKN_AND ));
m_tKeyWords.AddRecord(RecordKeyWord( "Not", TKN_NOT ));
m_tKeyWords.AddRecord(RecordKeyWord( "True", TKN_TRUE ));
m_tKeyWords.AddRecord(RecordKeyWord( "False", TKN_FALSE ));
m_tKeyWords.AddRecord(RecordKeyWord( "Integer", TKN_INTEGER ));
m_tKeyWords.AddRecord(RecordKeyWord( "Real", TKN_REAL ));
m_tKeyWords.AddRecord(RecordKeyWord( "Boolean", TKN_BOOLEAN ));
m_tKeyWords.AddRecord(RecordKeyWord( "Char", TKN_CHAR ));
m_tKeyWords.AddRecord(RecordKeyWord( "String", TKN_STRING ));
m_tKeyWords.AddRecord(RecordKeyWord( "Stack", TKN_STACK ));
m_tKeyWords.AddRecord(RecordKeyWord( "Write", TKN_WRITE ));
m_tKeyWords.AddRecord(RecordKeyWord( "Writeln", TKN_WRITELN ));
m_tKeyWords.AddRecord(RecordKeyWord( "Read", TKN_READ ));
m_tKeyWords.AddRecord(RecordKeyWord( "Push", TKN_PUSH ));
m_tKeyWords.AddRecord(RecordKeyWord( "Pop", TKN_POP ));
m_tKeyWords.AddRecord(RecordKeyWord( "Top", TKN_TOP ));
m_tSpecSymbols.AddRecord(RecordOper( "=", TKN_REL_EQUAL , VAL_REL_E ));
m_tSpecSymbols.AddRecord(RecordOper( ">", TKN_REL_NOT_EQUAL , VAL_REL_G ));
m_tSpecSymbols.AddRecord(RecordOper( ">=", TKN_REL_NOT_EQUAL , VAL_REL_GE ));
m_tSpecSymbols.AddRecord(RecordOper( "<>", TKN_REL_NOT_EQUAL , VAL_REL_NE ));
m_tSpecSymbols.AddRecord(RecordOper( "<", TKN_REL_NOT_EQUAL , VAL_REL_L ));
m_tSpecSymbols.AddRecord(RecordOper( "<=", TKN_REL_NOT_EQUAL , VAL_REL_LE ));
m_tSpecSymbols.AddRecord(RecordOper( "+", TKN_PLUS , VAL_PLUS_P ));
m_tSpecSymbols.AddRecord(RecordOper( "-", TKN_PLUS , VAL_PLUS_M ));
m_tSpecSymbols.AddRecord(RecordOper( "*", TKN_MULT , VAL_MULT_M ));
m_tSpecSymbols.AddRecord(RecordOper( "/", TKN_MULT , VAL_MULT_D ));
m_tSpecSymbols.AddRecord(RecordOper( ":=", TKN_ASSIGN , VAL_NONE ));
m_tSpecSymbols.AddRecord(RecordOper( "(", TKN_BRACKET_OPEN , VAL_NONE ));
m_tSpecSymbols.AddRecord(RecordOper( ")", TKN_BRACKET_CLOSE , VAL_NONE ));
m_tSpecSymbols.AddRecord(RecordOper( "[", TKN_BRACKET_SQ_OPEN , VAL_NONE ));
m_tSpecSymbols.AddRecord(RecordOper( "]", TKN_BRACKET_SQ_CLOSE , VAL_NONE ));
m_tSpecSymbols.AddRecord(RecordOper( ";", TKN_SEMICOLON , VAL_NONE ));
m_tSpecSymbols.AddRecord(RecordOper( ",", TKN_COMMA , VAL_NONE ));
m_tSpecSymbols.AddRecord(RecordOper( ".", TKN_PERIOD , VAL_NONE ));
m_tSpecSymbols.AddRecord(RecordOper( ":", TKN_COLON , VAL_NONE ));
m_tSpecSymbols.AddRecord(RecordOper( "..", TKN_RANGE , VAL_NONE ));
}
//-----------------------------------------------------------------------------
void CTableManager::AddToken(ENUM_TOKEN_TYPES tt, std::string lexeme, unsigned line)
{
int i;
float f;
unsigned index;
ENUM_TOKENS tok;
switch(tt)
{
case TT_INT:
sscanf(lexeme.c_str(), "%d", &i);
if ((i < INTEGER_MIN) || (i > INTEGER_MAX))
ErrorOutOfRange(line);
index = m_tInt.AddRecord( RecordInt(i) );
tok = TKN_LITER_INT;
break;
case TT_REAL:
sscanf(lexeme.c_str(), "%f", &f);
index = m_tFloat.AddRecord( RecordFloat(f) );
tok = TKN_LITER_REAL;
break;
case TT_CHAR:
index = m_tChar.AddRecord( RecordChar(lexeme[0]) );
tok = TKN_LITER_CHAR;
break;
case TT_STRING:
if (lexeme.length() > MAX_STRING_LEN)
g_ErrorHandler.Error(CError(ERR_STRING_TOO_LONG, line));
index = m_tString.AddRecord(RecordString(lexeme));
tok = TKN_LITER_STRING;
break;
case TT_ID: // keywords and identifiers
if (m_tKeyWords.find(lexeme, index)) // is it a keyword ?
tok = m_tKeyWords.GetRecord(index).token;
else
{
index = m_tID.AddRecord(RecordID(lexeme));
tok = TKN_ID;
}
break;
case TT_SPEC_SYMB:
if (m_tSpecSymbols.find(lexeme, index))
tok = m_tSpecSymbols.GetRecord(index).token;
else
{
assert(false);
}
break;
case TT_EPS:
tok = TKN_EPS;
break;
}
m_TokenStream.Add(CToken(tok, index, line));
}
//-----------------------------------------------------------------------------
void CTableManager::Clear()
{
m_tInt.Clear();
m_tFloat.Clear();
m_tChar.Clear();
m_tString.Clear();
m_TokenStream.clear();
m_tID.Clear();
}
//-----------------------------------------------------------------------------
void CTableManager::FPrintTables(const char * filename)
{
FILE *pFile = fopen(filename, "w");
if (!pFile) return;
char sBuff[128];
UTIL::GetTimeStr(sBuff, sizeof(sBuff)-1);
fprintf(pFile, " Файл сгенерирован: %s", sBuff);
fprintf(pFile, "\n--------------------------------------------------\n\n");
fprintf(pFile, "\n--- Integer table ---\n");
for (unsigned i = 0; i < m_tInt.Size(); ++i)
fprintf(pFile, "%3u\t %d\n", i, m_tInt.GetRecord(i).value);
fprintf(pFile, "\n--- Float table ---\n");
for (i = 0; i < m_tFloat.Size(); ++i)
fprintf(pFile, "%3u\t %f\n", i, m_tFloat.GetRecord(i).value);
fprintf(pFile, "\n--- Char table ---\n");
for (i = 0; i < m_tChar.Size(); ++i)
fprintf(pFile, "%3u\t %c\n", i, m_tChar.GetRecord(i).value);
fprintf(pFile, "\n--- String table ---\n");
for (i = 0; i < m_tString.Size(); i++)
fprintf(pFile, "%3u\t \"%s\"\n", i, m_tString.GetRecord(i).value.c_str());
fprintf(pFile, "\n--- Identifiers ---\n");
for (unsigned k = 0; k < m_tID.Size(); k++)
fprintf(pFile, "%3u\t %s\n", k, m_tID.GetRecord(k).lexem.c_str());
fprintf(pFile, "\n--- Keywords ---\n");
for (i = 0; i < m_tKeyWords.Size(); ++i)
fprintf(pFile, "%3u\t %s\n", i, m_tKeyWords.GetRecord(i).lexem.c_str());
fprintf(pFile, "\n--- Special symbols ---\n");
for ( k = 0; k < m_tSpecSymbols.Size(); k++)
fprintf(pFile, "%3u\t %s\n", k, m_tSpecSymbols.GetRecord(k).lexem.c_str());
fclose(pFile);
}
//-----------------------------------------------------------------------------
void CTableManager::FPrintTokens(const char * filename)
{
FILE *pFile = fopen(filename, "w");
if (!pFile) return;
fprintf(pFile, "--- Tokens ---\n");
for (CTokenStream::iterator iter = m_TokenStream.begin(); iter != m_TokenStream.end(); ++iter)
{
// switch(iter->Type())
// {
//
// }
}
fclose(pFile);
}
//-----------------------------------------------------------------------------
//ENUM_TOKENS CTableManager::Token(CToken &tok)
//{
// switch (tok.Type())
// {
// case TT_ID: return TKN_ID;
// case TT_KEYWORD: return m_tKeyWords.GetRecord(tok.Index()).token;
// case TT_STRING: return TKN_LITER_STRING;
// case TT_CHAR: return TKN_LITER_CHAR;
// case TT_INT: return TKN_LITER_INT;
// case TT_REAL: return TKN_LITER_REAL;
// case TT_SPEC_SYMB: return m_tSpecSymbols.GetRecord(tok.Index()).token;
//
// default: return TKN_DEFAULT;
// }
//}
//-----------------------------------------------------------------------------
void CTableManager::ErrorOutOfRange(unsigned line)
{
CError err(ERR_OUT_OF_RANGE, line);
g_ErrorHandler.Error(err);
}
Соседние файлы в папке Курсовая работа2