Скачиваний:
11
Добавлен:
01.05.2014
Размер:
4.12 Кб
Скачать
// Purpose:     Структуры данных для управляющих таблиц
//*****************************************************************************
#ifndef _DRIVING_TABLES_H_
#define _DRIVING_TABLES_H_
//-----------------------------------------------------------------------------
#include <map>
#include <stack>
#include <assert.h>
#include "Token.h"
#include "TableMgr.h"
#include "Attributes.h"
//-----------------------------------------------------------------------------
// Для LR(k) разбора требуются две функции: ф-ия действия f и ф-ия переходов g
// Как сказал тов. Страуструп, если в предметной области есть некая сущность
// создайте для нее класс. Да будет так.

// Класс, представляющий символ полного алфавита грамматики
// В зависимости от значения m_isTerm символ интерпретируется
// либо как терминал, либо как нетерминал

typedef ENUM_TOKENS   EnumT;
typedef int           EnumNT;

#define DefValT     TKN_DEFAULT
#define DefValNT    0

//------------------------------------

class CSymbol
{
    bool   m_isTerm;
    EnumT  m_term;
    EnumNT m_nonterm;

public:
    CSymbol() : m_isTerm(true), m_term(TKN_DEFAULT), m_nonterm(DefValNT)    { }
    CSymbol(EnumT T)   : m_isTerm(true),  m_term(T), m_nonterm(DefValNT)      { }
    CSymbol(EnumNT NT) : m_isTerm(false), m_term(DefValT), m_nonterm(NT)      { }

    bool    IsTerm()  { return m_isTerm;  }
    EnumT   Term()    { return m_term;    }
    EnumNT  NonTerm() { return m_nonterm; }

    bool operator == (const CSymbol &right) const
    {
        return (m_isTerm ? (m_term==right.m_term) : (m_nonterm==right.m_nonterm));
    }

    bool operator < (const CSymbol &right) const
    {
        // Терминал < Нетерминала
        if ((m_isTerm) && (!right.m_isTerm)) return true;
        // Если оба терминалы или нетерминалы
        if (m_isTerm == right.m_isTerm)
        {
            if (m_isTerm)  return (m_term < right.m_term);
            if (!m_isTerm) return (m_nonterm < right.m_nonterm);
        }
        return false;
    }
};

//-----------------------------------------------------------------------------

// Класс, представляющий магазинный символ
// По сути магазинный символ это обозначение некого состояния, либо дна магазина
// Дно магазина - тоже состояние

typedef unsigned StateType;      // тип представляющий состояние
#define STACK_BOTTOM    0        // ноль у нас будет дном магазина

class CStackSymbol
{
    StateType   m_State;   // состояние
    SAttrSet   m_Attrs;   // набор атрибутов

public:
    CStackSymbol() : m_State(STACK_BOTTOM)        { }
    CStackSymbol(StateType State): m_State(State) { }

    bool operator < (const CStackSymbol &right) const
    {
        return (m_State < right.m_State);
    }

    SAttrSet& Attributes()                   {return m_Attrs; }
};

//-----------------------------------------------------------------------------
// Замутим-ка мы двухмерный ассоциативный массив

template<class HeadRow, class HeadCol, class Data> class Map2D
{
    typedef std::map<HeadCol, Data>  t_row;
    typedef std::map<HeadRow, t_row> t_rows;

    t_rows m_rows;

public:
    // Лучше использовать только для инициализации
    Data & At(HeadRow row, HeadCol col)
    {
        return m_rows[row][col];
    }

    bool Find(HeadRow row, HeadCol col, Data &dat)
    {
        t_rows::iterator it_row = m_rows.find(row);
        if (m_rows.end() == it_row)
            return false;
        t_row::iterator it_data = it_row->second.find(col);
        if (it_row->second.end() == it_data)
            return false;
        dat = it_data->second;
        return true;
    }
};


//-----------------------------------------------------------------------------

// Множество значений функции действия
// Значение от 0 и больше означают свёртку по такому правилу

#define ACT_ERROR       (-3)    // ОШИБКА
#define ACT_OK          (-2)    // ДОПУСК
#define ACT_TRANSFER    (-1)    // ПЕРЕНОС

//-----------------------------------------------------------------------------
#endif
Соседние файлы в папке Курсовая работа2