Скачиваний:
11
Добавлен:
01.05.2014
Размер:
9.38 Кб
Скачать

// 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