Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
бАКАЛАВР_РАБОТА.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.13 Mб
Скачать

Б.2.4Сохранение программной модели

Если требуется сохранить программную модель, можно задать команду "File->Save" (или кнопка , или сочетание Ctrl+S). При этом если файл ранее сохранялся, он будет перезаписан с тем же именем. Если файл не сохранялся, будет вызван стандартный диалог сохранения файла (рисунок Б.7).

Рисунок Б.7 – Диалог сохранения файла

Также можно сохранить файл под другим именем или в другом месте, вызвав команду "File->SaveAs…".

Б.2.6Завершение работы с системой

Закрытие окна выполняется по команде "File->Close" или кнопкой . Если файл не сохранялся, система выдаст запрос (рисунок Б.8).

Рисунок Б.8 – Запрос сохранения изменений

При утвердительном ответе поведение системы аналогично действиям после выполнения команды "File->Save". При выборе отмены действия файл не будет закрыт, и пользователь может продолжить работу с ним.

Приложение в

Листинг программы

В.1 Модуль лексического анализатора

Файл abstractLexer.H

#ifndef ABSTRACTLEXER_H

#define ABSTRACTLEXER_H

#include "token.h"

#ifdef IS_UNIX

/// WINDOWS

#include <tr1/memory>

#else

#include <memory>

#endif

namespace std{

using tr1::shared_ptr;

}

namespace lexer {

using std::shared_ptr;

class AbstractLexer{

public:

virtual shared_ptr<Token>scan() =0;

virtual string getLine() const =0;

virtual ~AbstractLexer(){}

};

}//lexer

#endif // ABSTRACTLEXER_H

Файл lexer.H

#ifndef LEXER_H

#define LEXER_H

#include <cctype>

#include <cstdlib>

#include <cerrno>

#include <clocale>

#include <string>

#include <fstream>

#include "logger/logger.h"

#include "abstractLexer.h"

#include "token.h"

#include "word.h"

#include "number.h"

#ifdef IS_UNIX

#include <tr1/unordered_map>

#include <tr1/memory>

#else

#include <unordered_map> /// WINDOWS

#include <memory>

#endif

namespace std{

using tr1::shared_ptr;

using tr1::unordered_map;

}

namespace lexer {

// have singleton Logger

using std::string;

using std::ifstream;

// using std::weak_ptr;

using std::shared_ptr;

typedef std::unordered_map<string,shared_ptr<Word>> hashmap;

class Lexer: public AbstractLexer {

public:

explicit Lexer( ifstream & input): in(input) {

line=0;

peek=' ';

setlocale(LC_NUMERIC,"C");

reserve(new Word(Token::COUNT,"count"));

reserve(new Word(Token::FROM,"from"));

reserve(new Word(Token::IS,"is"));

reserve(new Word(Token::ENDIF,"endif"));

reserve(new Word(Token::THEN,"then"));

reserve(new Word(Token::IF,"if"));

reserve(new Word(Token::MACRO,"macro"));

reserve(new Word(Token::CONST,"const"));

reserve(new Word(Token::NOT,"not"));

reserve(new Word(Token::OR,"or"));

reserve(new Word(Token::AND,"and"));

reserve(new Word(Token::ARRAY,"array"));

}

shared_ptr<Token>scan() ;

~Lexer(){}

private:

enum Type_error{ INVAL_NE, UNDEF_SYM , DECIM_POINT , EXPON, INVAL_SUFF};

ifstream & in;

char peek;

int line;

hashmap words;

string getLine() const;

bool readch();

bool readch(char c);

void error(Type_error type) ;

void warning(const string &) ;

void reserve(Word *t) { words.insert(std::make_pair(t->lexeme, shared_ptr<Word>(t)));}

inline void skipAlpha();

// block default functions

Lexer(const Lexer&):in(this->in){}

Lexer& operator=(const Lexer&){return *this;}

};

}//lexer

#endif // LEXER_H