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

#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