Министерство образования и науки Российской Федерации
Новосибирский Государственный Технический Университет
Кафедра АСУ
Курсовая работа
по дисциплине
«Теория формальных языков и компиляторов»
на тему:
«Объявление перечисляемого типа на языке 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