Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Курсовая работа2 / DrivingTables
.h// 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