Объявление перечисляемого типа на языке C++.

Описание:
Доступные действия
Введите защитный код для скачивания файла и нажмите "Скачать файл"
Защитный код
Введите защитный код

Нажмите на изображение для генерации защитного кода

Текст:

Министерство образования и науки Российской Федерации

Новосибирский Государственный Технический Университет

Кафедра АСУ

Курсовая работа

по дисциплине

«Теория формальных языков и компиляторов»

на тему:

«Объявление перечисляемого типа на языке C++.»

Студент:

Селиванов А.В.

Группа:

ЗФ-322

Преподаватель:

Достовалов Д.Н.

Новосибирск

2016

Оглавление

Постановка задачи. 3

Требования к программе. 3

Описание языка. 3

Примеры конструкций и коды ошибок. 3

Валидные: 3

Невалидные: 3

Грамматика. 4

Значения лексем.. 4

Граф.. 5

Скриншоты.. 6

Пояснения к программе. 7

Список использованной литературы и источников. 8

Приложение. Текст программы.. 9

Бизнес-логика. 9

Листинг делегатов. 22


Постановка задачи

Выполнить разработку грамматики для заданного формального языка. Разработать и программно реализовать алгоритмы лексического и синтаксического анализа строк, записанных на данном языке.

 Требования к программе

·         Программа должна иметь графический интерфейс.

·         Основные области окна: меню, панель инструментов, окно редактирования, окно для вывода сообщений.

·         В программе должны быть стандартные команды для работы с файлами (создать, открыть, сохранить, сохранить как), редактирования текста (копировать, вставить, вырезать, отменить).

·         Запуск анализа выполняется соответствующей командой.

·         Результатом анализа правильной строки является синтаксическое дерево, которое строится в окне сообщений.

·         При анализе выполняется диагностика и нейтрализация ошибок.

·         Если анализируемая строка содержит ошибки, то выводятся понятные неподготовленному пользователю сообщения о них.

Описание языка

Перечисление enum представляет собой тип данных, все возможные значения которого задаются списком целочисленных констант. Формат:

enum [ имя_типа ] { список_констант } [ список_переменных ];

Имя типа и список переменных указывать не обязательно. Константы должны быть целочисленными и могут инициализироваться обычным образом.

Примеры конструкций и коды ошибок

Валидные:

enum { a, b = 3, c };

enum type { a, b = 3, c } a1, _a;

enum T_Y_P_E { a = 100 };

Невалидные:

Конструкция

Код ошибки

Описание ошибки

enum_TYPE { a }; 

1

enum не найден

enum TYPE, { a };

2

ошибка в имени типа

enum a;

3

отсутствует левая фигурная скобка

enum { a; }

4

ошибка в имени константы

enum { a = 1, b = }

5

ошибка инициализации константы

enum { a, b

6

отсутствует правая фигурная скобка

enum { a, b } 1z;

7

ошибка в имени переменной

enum { a, b }

8

отсутствует точка с запятой

Грамматика

G(Z) = {Vt, Vn, Z, P},

Vt={1, 2, 3, 4, 5, 6, 7, 8, 9, 0},

Vn={A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, X},

Z=A,

P= { A → 1B,

B → 0B|2F|7C|8D,

C → 7C|8D,

D → 0E|2F|6D|7D|8D,

E → 0E|2F,

F → 0F|7G|8H,

G → 7G|8H,

H → 0I|3N|4F|5J|6H|7H|8H,

I → 0I|3N|4F|5J,

J → 0K|6L,

K → 0K|6L,

L → 0M|3N|4F|6L,

M → 0M|3N|4F,

N → 0N|7O|8P|9X,

O → 7O|8P,

P → 0Q|4N|6P|7P|8P|9X,

Q → 0Q|4N|9X,

X → L

}

Значения лексем

1

2

3

4

5

6

7

8

9

0

enum

{

}

,

=

Цифра

_

Буква лат.

;

Пробел

По классификации Хомского грамматика является автоматной. Автомат является детерминированным.


Граф


Скриншоты

Пояснения к программе

Бизнес-логика программы разработана на C++ с применением паттерна State (Состояние). Интерфейс пользователя реализован на Objective-C++.


Список использованной литературы и источников

1.      Теория и практика языковых процессоров: Учеб. пособие / Шорников Ю. В. – Новосибирск: Изд-во НГТУ, 2004.

2.      C/C++. Программирование на языке высокого уровня / Т. А. Павловская – СПб.: Питер, 2002.

3.      Mac Developer Library - https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html

4.      Google - https://www.google.ru

5.      Другие Интернет-ресурсы


Приложение. Текст программы

Бизнес-логика

// Parser.hpp

#include

#include "State.hpp"

class State;

class Parser {

private:

    std::string messages;

    int errorCode;

    State *currentState;

    State *aState;

    State *bState;

    State *cState;

    State *dState;

    State *eState;

    State *fState;

    State *gState;

    State *hState;

    State *iState;

    State *jState;

    State *kState;

    State *lState;

    State *mState;

    State *nState;

    State *oState;

    State *pState;

    State *qState;

    State *xState;

public:

    Parser();

    ~Parser();

    void parse(std::string str);

    std::string getMessages();

    void setMessages(std::string messages);

    int getErrorCode();

    void setErrorCode(int code);

    State *getCurrentState();

    void setCurrentState(State *state);

    State *getAState();

    State *getBState();

    State *getCState();

    State *getDState();

    State *getEState();

    State *getFState();

    State *getGState();

    State *getHState();

    State *getIState();

    State *getJState();

    State *getKState();

    State *getLState();

    State *getMState();

    State *getNState();

    State *getOState();

    State *getPState();

    State *getQState();

    State *getXState();

};

// Parser.cpp

#include "Parser.hpp"

#include "AState.hpp"

#include "BState.hpp"

#include "CState.hpp"

#include "DState.hpp"

#include "EState.hpp"

#include "FState.hpp"

#include "GState.hpp"

#include "HState.hpp"

#include "IState.hpp"

#include "JState.hpp"

#include "KState.hpp"

#include "LState.hpp"

#include "MState.hpp"

#include "NState.hpp"

#include "OState.hpp"

#include "PState.hpp"

#include "QState.hpp"

#include "XState.hpp"

Parser::Parser() {

    setErrorCode(0);

    aState = new AState(this);

    bState = new BState(this);

    cState = new CState(this);

    dState = new DState(this);

    eState = new EState(this);

    fState = new FState(this);

    gState = new GState(this);

    hState = new HState(this);

    iState = new IState(this);

    jState = new JState(this);

    kState = new KState(this);

    lState = new LState(this);

    mState = new MState(this);

    nState = new NState(this);

    oState = new OState(this);

    pState = new PState(this);

    qState = new QState(this);

    xState = new XState(this);

    setCurrentState(getAState());

}

Parser::~Parser() {

    delete aState;

    delete bState;

    delete cState;

    delete dState;

    delete eState;

    delete fState;

    delete gState;

    delete hState;

    delete iState;

    delete jState;

    delete kState;

    delete lState;

    delete mState;

    delete nState;

    delete oState;

    delete pState;

    delete qState;

    delete xState;

}

void Parser::parse(std::string str) {

    std::replace(str.begin(), str.end(), " ", " ");

    std::replace(str.begin(), str.end(), " ", " ");

    size_t first = str.find_first_not_of(" ");

    if (first < SIZE_MAX) {

        str = str.substr(first, str.length() - first);

    }

    getCurrentState()->parse(str);

}

std::string Parser::getMessages() {

    return this->messages;

}

void Parser::setMessages(std::string messages) {

    this->messages = messages;

}

int Parser::getErrorCode() {

    return this->errorCode;

}

void Parser::setErrorCode(int code) {

    this->errorCode = code;

}

State *Parser::getCurrentState() {

    return this->currentState;

}

void Parser::setCurrentState(State *state) {

    this->currentState = state;

}

State *Parser::getAState() {

    return this->aState;

}

State *Parser::getBState() {

    return this->bState;

}

State *Parser::getCState() {

    return this->cState;

}

State *Parser::getDState() {

    return this->dState;

}

State *Parser::getEState() {

    return this->eState;

}

State *Parser::getFState() {

    return this->fState;

}

State *Parser::getGState() {

    return this->gState;

}

State *Parser::getHState() {

    return this->hState;

}

State *Parser::getIState() {

    return this->iState;

}

State *Parser::getJState() {

    return this->jState;

}

State *Parser::getKState() {

    return this->kState;

}

State *Parser::getLState() {

    return this->lState;

}

State *Parser::getMState() {

    return this->mState;

}

State *Parser::getNState() {

    return this->nState;

}

State *Parser::getOState() {

    return this->oState;

}

State *Parser::getPState() {

    return this->pState;

}

State *Parser::getQState() {

    return this->qState;

}

State *Parser::getXState() {

    return this->xState;

}

// State.hpp
#include "Parser.hpp"

class Parser;

class State {

private:

    State() { };

    std::string name;

protected:

    Parser *parser;

public:

    State(Parser *parser);

    std::string getName();

    void setName(std::string name);

    Parser *getParser();

    void setParser(Parser *parser);

    virtual void parse(std::string str) = 0;

};

// State.cpp

State::State(Parser *parser) {

    setParser(parser);

}

std::string State::getName() {

    return this->name;

}

void State::setName(std::string name) {

    this->name = name;

}

Parser *State::getParser() {

    return this->parser;

}

void State::setParser(Parser *parser) {

    this->parser = parser;

}

// AState.hpp

// заголовочные файлы остальных реализаций class State идентичны

#include "State.hpp"

class AState : public State {

public:

    AState(Parser *parser);

    virtual void parse(std::string str) override;

};

// AState.cpp

#include "AState.hpp"

AState::AState(Parser *parser) : State(parser) {

    setName("A");

}

void AState::parse(std::string str) {

    if (str.length() >= 5 && (str.substr(0, 5).compare("enum ") == 0 || str.substr(0, 5).compare("enum{") == 0)) {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "1");

        getParser()->setCurrentState(getParser()->getBState());

        getParser()->getCurrentState()->parse(str.substr(4, str.length() - 4));

    } else {

        getParser()->setErrorCode(1);

    }

}

// далее следуют лишь реализации методов parse

void BState::parse(std::string str) {

    if (str.length() >= 1 && str[0] == " ") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "0");

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == "{") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "2");

        getParser()->setCurrentState(getParser()->getFState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == "_") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "7");

        getParser()->setCurrentState(getParser()->getCState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if ((str[0] >= "a" && str[0] <= "z") || (str[0] >= "A" && str[0] <= "Z")) {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "8");

        getParser()->setCurrentState(getParser()->getDState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else {

        getParser()->setErrorCode(2);

    }

}

void CState::parse(std::string str) {

    if (str.length() >= 1 && str[0] == "_") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "7");

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if ((str[0] >= "a" && str[0] <= "z") || (str[0] >= "A" && str[0] <= "Z")) {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "8");

        getParser()->setCurrentState(getParser()->getDState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else {

        getParser()->setErrorCode(2);

    }

}

void DState::parse(std::string str) {

    if (str.length() >= 1 && str[0] == " ") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "0");

        getParser()->setCurrentState(getParser()->getEState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == "{") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "2");

        getParser()->setCurrentState(getParser()->getFState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] >= "0" && str[0] <= "9") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "6");

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == "_") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "7");

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if ((str[0] >= "a" && str[0] <= "z") || (str[0] >= "A" && str[0] <= "Z")) {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "8");

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str.length() == 0) {

        getParser()->setCurrentState(getParser()->getEState());

        getParser()->getCurrentState()->parse(str);

    } else {

        getParser()->setErrorCode(2);

    }

}

void EState::parse(std::string str) {

    if (str.length() >= 1 && str[0] == " ") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "0");

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str.length() >= 1 && str[0] == "{") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "2");

        getParser()->setCurrentState(getParser()->getFState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else {

        getParser()->setErrorCode(3);

    }

}

void FState::parse(std::string str) {

    if (str.length() >= 1 && str[0] == " ") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "0");

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == "_") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "7");

        getParser()->setCurrentState(getParser()->getGState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if ((str[0] >= "a" && str[0] <= "z") || (str[0] >= "A" && str[0] <= "Z")) {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "8");

        getParser()->setCurrentState(getParser()->getHState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else {

        getParser()->setErrorCode(4);

    }

}

void GState::parse(std::string str) {

    if (str.length() >= 1 && str[0] == "_") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "7");

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if ((str[0] >= "a" && str[0] <= "z") || (str[0] >= "A" && str[0] <= "Z")) {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "8");

        getParser()->setCurrentState(getParser()->getHState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else {

        getParser()->setErrorCode(4);

    }

}

void HState::parse(std::string str) {

    if (str.length() >= 1 && str[0] == " ") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "0");

        getParser()->setCurrentState(getParser()->getIState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == "}") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "3");

        getParser()->setCurrentState(getParser()->getNState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == ",") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "4");

        getParser()->setCurrentState(getParser()->getFState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == "=") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "5");

        getParser()->setCurrentState(getParser()->getJState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] >= "0" && str[0] <= "9") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "6");

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == "_") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "7");

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if ((str[0] >= "a" && str[0] <= "z") || (str[0] >= "A" && str[0] <= "Z")) {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "8");

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str.length() == 0) {

        getParser()->setCurrentState(getParser()->getMState());

        getParser()->getCurrentState()->parse(str);

    } else {

        getParser()->setErrorCode(4);

    }

}

void IState::parse(std::string str) {

    if (str.length() >= 1 && str[0] == " ") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "0");

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == "}") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "3");

        getParser()->setCurrentState(getParser()->getNState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == ",") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "4");

        getParser()->setCurrentState(getParser()->getFState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == "=") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "5");

        getParser()->setCurrentState(getParser()->getJState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else {

        getParser()->setErrorCode(4);

    }

}

void JState::parse(std::string str) {

    if (str.length() >= 1 && str[0] == " ") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "0");

        getParser()->setCurrentState(getParser()->getKState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] >= "0" && str[0] <= "9") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "6");

        getParser()->setCurrentState(getParser()->getLState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else {

        getParser()->setErrorCode(5);

    }

}

void KState::parse(std::string str) {

    if (str.length() >= 1 && str[0] == " ") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "0");

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] >= "0" && str[0] <= "9") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "6");

        getParser()->setCurrentState(getParser()->getLState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else {

        getParser()->setErrorCode(5);

    }

}

void LState::parse(std::string str) {

    if (str.length() >= 1 && str[0] == " ") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "0");

        getParser()->setCurrentState(getParser()->getMState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == "}") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "3");

        getParser()->setCurrentState(getParser()->getNState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == ",") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "4");

        getParser()->setCurrentState(getParser()->getFState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] >= "0" && str[0] <= "9") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "6");

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else {

        getParser()->setErrorCode(5);

    }

}

void MState::parse(std::string str) {

    if (str.length() >= 1 && str[0] == " ") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "0");

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == "}") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "3");

        getParser()->setCurrentState(getParser()->getNState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == ",") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "4");

        getParser()->setCurrentState(getParser()->getFState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else {

        getParser()->setErrorCode(6);

    }

}

void NState::parse(std::string str) {

    if (str.length() >= 1 && str[0] == " ") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "0");

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == "_") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "7");

        getParser()->setCurrentState(getParser()->getOState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if ((str[0] >= "a" && str[0] <= "z") || (str[0] >= "A" && str[0] <= "Z")) {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "8");

        getParser()->setCurrentState(getParser()->getPState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == ";") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "9");

        getParser()->setCurrentState(getParser()->getXState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str.length() == 0) {

        getParser()->setCurrentState(getParser()->getQState());

        getParser()->getCurrentState()->parse(str);

    } else {

        getParser()->setErrorCode(7);

    }

}

void OState::parse(std::string str) {

    if (str.length() >= 1 && str[0] == "_") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "7");

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if ((str[0] >= "a" && str[0] <= "z") || (str[0] >= "A" && str[0] <= "Z")) {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "8");

        getParser()->setCurrentState(getParser()->getPState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else {

        getParser()->setErrorCode(7);

    }

}

void PState::parse(std::string str) {

    if (str.length() >= 1 && str[0] == " ") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "0");

        getParser()->setCurrentState(getParser()->getQState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == ",") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "4");

        getParser()->setCurrentState(getParser()->getNState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == "=") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "5");

        getParser()->setCurrentState(getParser()->getJState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] >= "0" && str[0] <= "9") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "6");

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == "_") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "7");

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if ((str[0] >= "a" && str[0] <= "z") || (str[0] >= "A" && str[0] <= "Z")) {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "8");

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == ";") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "9");

        getParser()->setCurrentState(getParser()->getXState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else {

        getParser()->setErrorCode(8);

    }

}

void QState::parse(std::string str) {

    if (str.length() >= 1 && str[0] == " ") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "0");

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == ",") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "4");

        getParser()->setCurrentState(getParser()->getNState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else if (str[0] == ";") {

        getParser()->setMessages(getParser()->getMessages() + this->getName() + "9");

        getParser()->setCurrentState(getParser()->getXState());

        getParser()->getCurrentState()->parse(str.substr(1, str.length() - 1));

    } else {

        getParser()->setErrorCode(8);

    }

}

void XState::parse(std::string str) {

    getParser()->setMessages(getParser()->getMessages() + this->getName());

    getParser()->setErrorCode(0);

}


Листинг делегатов

//

//  AppDelegate.hh

//  compilers

//

//  Created by Александр Селиванов on 21.06.16.

//  Copyright © 2016 Alexander Selivanov. All rights reserved.

//

#import

@interface AppDelegate : NSObject

@end

//

//  AppDelegate.m

//  compilers

//

//  Created by Александр Селиванов on 21.06.16.

//  Copyright © 2016 Alexander Selivanov. All rights reserved.

//

#import

#import "AppDelegate.hh"

#import "Parser.hpp"

@interface AppDelegate ()

@property (strong, nonatomic) NSURL *thisFileURL;

@property (strong, nonatomic) NSDictionary *errDict;

@property (weak) IBOutlet NSWindow *window;

@property (weak) IBOutlet NSMenuItem *saveMenuItemOutlet;

@property (unsafe_unretained) IBOutlet NSTextView *inputTextViewOutlet;

@property (unsafe_unretained) IBOutlet NSTextView *outputTextViewOutlet;

- (IBAction)runMenuAction:(id)sender;

- (IBAction)runButton:(id)sender;

- (IBAction)doNew:(id)sender;

- (IBAction)doOpen:(id)sender;

- (IBAction)doSave:(id)sender;

- (IBAction)doSaveAs:(id)sender;

@end

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

    // Insert code here to initialize your application

    self.thisFileURL = nil;

    [[self window] setTitle:@"compilers"];

    [[self saveMenuItemOutlet] setEnabled:NO];

    [[self outputTextViewOutlet] setEditable:NO];

    self.errDict = @{

                     @"0" : @"нет ошибок",

                     @"1" : @"enum не найден",

                     @"2" : @"ошибка в имени типа",

                     @"3" : @"отсутствует левая фигурная скобка",

                     @"4" : @"ошибка в имени константы",

                     @"5" : @"ошибка инициализации константы",

                     @"6" : @"отсутствует правая фигурная скобка",

                     @"7" : @"ошибка в имени переменной",

                     @"8" : @"отсутствует точка с запятой"

    };

}

- (void)applicationWillTerminate:(NSNotification *)aNotification {

    // Insert code here to tear down your application

}

- (IBAction)runMenuAction:(id)sender {

    NSString *sourceString = [[self inputTextViewOutlet] string];

    Parser *parser = new Parser();

    parser->parse(std::string([sourceString UTF8String]));

    NSString *mes = [NSString stringWithUTF8String:parser->getMessages().c_str()];

    NSString *errCode = [NSString stringWithFormat:@"%i", parser->getErrorCode()];

    NSString *err = [NSString stringWithFormat:@"Error code %@ : %@", errCode, [[self errDict] valueForKey:errCode]];

    [[self outputTextViewOutlet] setString:[[mes stringByAppendingString:@" "] stringByAppendingString:err]];

    delete parser;

}

- (IBAction)runButton:(id)sender {

    [self runMenuAction:sender];

}

- (IBAction)doNew:(id)sender {

    [[self inputTextViewOutlet] setString:@""];

    [[self outputTextViewOutlet] setString:@""];

    self.thisFileURL = nil;

    [[self window] setTitle:@"compilers"];

    [[self saveMenuItemOutlet] setEnabled:NO];

}

- (IBAction)doOpen:(id)sender {

    NSOpenPanel *openPanel = [NSOpenPanel openPanel];

    NSInteger openPanelResult = [openPanel runModal];

    if (openPanelResult == NSModalResponseOK) {

        [self doNew:self];

        NSURL *fileURL = [openPanel URL];

        NSString *fileContent = [NSString stringWithContentsOfURL:fileURL encoding:NSUTF8StringEncoding error:nil];

        [[self inputTextViewOutlet] setString:fileContent];

        self.thisFileURL = fileURL;

        [[self saveMenuItemOutlet] setEnabled:YES];

        [[self window] setTitle:[fileURL lastPathComponent]];

    }

}

- (IBAction)doSave:(id)sender {

    if ([self thisFileURL] != nil) {

        NSString *fileContent = [[self inputTextViewOutlet] string];

        [fileContent writeToURL:[self thisFileURL] atomically:YES encoding:NSUTF8StringEncoding error:nil];

    } else {

        [self doSaveAs:sender];

    }

}

- (IBAction)doSaveAs:(id)sender {

    NSSavePanel *savePanel = [NSSavePanel savePanel];

    NSInteger savePanelResult = [savePanel runModal];

    if (savePanelResult == NSModalResponseOK) {

        NSURL *fileURL = [savePanel URL];

        NSString *fileContent = [[self inputTextViewOutlet] string];

        [fileContent writeToURL:fileURL atomically:YES encoding:NSUTF8StringEncoding error:nil];

        self.thisFileURL = fileURL;

        [[self saveMenuItemOutlet] setEnabled:YES];

        [[self window] setTitle:[fileURL lastPathComponent]];

    }

}

@end

Информация о файле
Название файла Объявление перечисляемого типа на языке C++. от пользователя xulot
Дата добавления 5.5.2020, 18:44
Дата обновления 5.5.2020, 18:44
Тип файла Тип файла (zip - application/zip)
Скриншот Не доступно
Статистика
Размер файла 358.84 килобайт (Примерное время скачивания)
Просмотров 335
Скачиваний 149
Оценить файл