Скачиваний:
11
Добавлен:
01.05.2014
Размер:
3.5 Кб
Скачать
#ifndef _CODEGEN_INCLUDED_
#define _CODEGEN_INCLUDED_
//-----------------------------------------------------------------------------
#include <string>
#include "SyntaxAn.h"
#include "NameTables.h"
#include "Tetrads.h"
//-----------------------------------------------------------------------------

class CCodeGen: public CSyntAnalyzer
{
    CNameTable      m_NameTable;
    CTetradStream   m_Tetrads;

    unsigned        m_NextName;

    unsigned        m_NextTempNameInt;
    unsigned        m_NextTempNameReal;
    unsigned        m_NextTempNameBool;
    unsigned        m_NextTempNameStr;
    unsigned        m_NextTempNameChar;

    unsigned        m_NextLabel;

public:

    CNameTable      & GetNameTable()    { return m_NameTable; }
    CTetradStream   & GetTetrads()      { return m_Tetrads;   }

    CCodeGen();

    bool Analyze(CTokenStream::iterator it_token, CTokenStream::iterator it_end,
                 const char *FileName);

    // Выполняет "семантические процедуры" при свертке по правилу № RuleNum
    virtual void Operation(int RuleNum, SAttrSet &LeftAttrSet);

    // Создаёт новую переменную
    std::string NewName(VarInfo vi);

    // Создает новую временную переменную
    std::string NewNameTemp(VarInfo vi);

    // Создает новую метку
    std::string NewLabel();

    // Создает новое имя для литерала
    SAttrSet ProcessLiter(TYPES t, unsigned TableIndex);

    // Необходимо вызвать после использования имени, для учета временных имен
    void VarHasBeenUsed(std::string name);
    
    // проверяет может ли тип использоваться в арифметических операциях
    bool IsTypeArithm(TYPES typ);

    // проверяет могут ли эти типы использоваться в арифметических операциях
    bool AreTypesArithm(TYPES typ1, TYPES typ2);

    // Выполняем бинарную логическую операцию
    SAttrSet PerformBoolOperBin(ENUM_TOKENS op, SAttrSet &left, SAttrSet &right);

    void WriteBoolOperationBin(ENUM_TOKENS op, std::string op1, std::string op2, std::string res);

    // Выполняем бинарную арифметическую операцию
    SAttrSet PerformArithmOperBin(SAttrSet &left, SAttrSet &right);

    void WriteArithmOperBin(ENUM_TOKEN_VAL op, TYPES TypeOfOperands, 
                            std::string op1, std::string op2, std::string res);
    
    // Выполняет арифметическое сравнение 
    SAttrSet PerformComparisonArithm(SAttrSet &left, SAttrSet &right);

    // Анализирует типы переменных и при необходимости выполняет приведение типов
    // Возвращает тип результата операции
    TYPES ArithmCast(ENUM_TOKEN_VAL op, SAttrSet &left, SAttrSet &right, std::string &op1, std::string &op2);

    // Выполняет присваивание
    void PerformAssignment(SAttrSet &id, SAttrSet &expr);

    // Выполняет преобразование Integer в Real
    std::string ITOF(std::string operand);

    // Выполняет преобразование Char в String
    std::string CharToStr(std::string operand);

    // Включаем в потом новую тетраду
    void AddTet(TET_OPERATION op, std::string op1, std::string op2, std::string res);

    // Проверяет объявлен ли идентификатор
    bool IsIdDeclared(SAttrSet &attr);
    
    void ErrorIdRedefinition(SAttrSet &attr);
    void ErrorIdUndeclared(SAttrSet &attr);

    SAttrSet PerformStrConcat(SAttrSet &left, SAttrSet &right);
    
    void ErrorTypeUnsupported(unsigned line);
};



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