Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Курсовая работа2 / SyntaxAn
.h
#ifndef _SYNTAX_AN_H_
#define _SYNTAX_AN_H_
//-----------------------------------------------------------------------------
#include <vector>
#include <set>
#include <fstream>
#include "Tokens.h"
#include "DrivingTables.h"
#include "Stack.h"
//-----------------------------------------------------------------------------
// Для выполнения свёртки требуется знать левую часть правила и длину правой
struct RuleInfo
{
EnumNT LeftSide; // нетерминал в левой части правила
unsigned Length;
};
// С помощью массивов вот таких структур будем задавать функции действий
struct FInfo
{
StateType StackSym; // для инициализации магазинного символа
ENUM_TOKENS Terminal; // функция действия определена на множестве терминалов
int Action; // ДОПУСК, ПЕРЕНОС, ОШИБКА или СВЕРТКА по правилу
};
// А массивами таких структур будем задавать функции переходов
struct GInfo
{
StateType StackSym; // для инициализации магазинного символа
bool bIsTerm; // функция переходов определена на множестве
unsigned Symbol; // ВСЕХ символов алфавита, так что нужен флаг, в
// зависимости от которого будем приводить тип
StateType State; // собственно это g(StackSym,Terminal)
};
//-----------------------------------------------------------------------------
// Вот собственно шаблон класса, реализующего синтаксический анализ
// Таблица действий должны быть проинициализирована значениями ДОПУСК,
// ПЕРЕНОС и СВЕРТКА, всё остальное будет ОШИБКА
class CSyntAnalyzer
{
protected:
// таблица переходов g(x)
Map2D<CStackSymbol, CSymbol, CStackSymbol> m_TableTrans;
// таблица действий f(x)
Map2D<CStackSymbol, CSymbol, int> m_TableAct;
// Магазин
// std::stack<CStackSymbol> m_Stack;
Stack<CStackSymbol> m_Stack;
// Хранит длину правой части каждого правила
std::vector<RuleInfo> m_vRulesInfo;
// Допустимые терминалы граммтики
std::set<ENUM_TOKENS> m_Tokens;
// ---------------------------------------
// функция действий f(x)
int f( const CSymbol &sym );
// функция переходов g(x)
CStackSymbol g( const CSymbol& sym );
// ---------------------------------------
public:
CSyntAnalyzer();
void InitTables(FInfo FV[], unsigned FVLen, GInfo GV[], unsigned GVLen);
void InitRules(RuleInfo RI[], unsigned RulesCount);
void InitTokens(ENUM_TOKENS Tokens[], unsigned Count);
bool FindToken(ENUM_TOKENS Tkn);
virtual bool Analyze(CTokenStream::iterator it_token, CTokenStream::iterator it_end);
// "Семантическая процедура", вычисляет атрибуты и пишет промежуточный код
virtual void Operation(int RuleNum, SAttrSet &LeftAttrSet) { };
};
//-----------------------------------------------------------------------------
#endif
Соседние файлы в папке Курсовая работа2