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