
- •Выпускная квалификационная работа бакалавра
- •Задание на выпускную квалификационную работу бакалавра
- •План-график выполнения работы
- •Реферат
- •Введение
- •1 Языковые процессоры
- •1.1 Практическое применениеискусственных языков
- •1.2 Практический пример
- •1.3 Понятие и структура языкового процессора
- •2Обзор существующих систем и обоснование выбора инструментальных средств и класса грамматики
- •2.1 Обзор существующей символьной спецификации моделей гс в среде исма
- •2.1.1 Лексемы языка исма
- •2.1.2 Грамматика языка исма
- •2.1.3 Семантические действия в языковом процессоре исма
- •2.1.4 Заключение
- •2.2 Обоснование выбора инструментальных средств и класса грамматики
- •3 Постановка задачи исследования
- •3.1 Характеристика задачи исследования
- •3.2 Входная информация
- •3.3 Выходная информация
- •3.4 Архитектура среды исма с расширенным языком описания гс
- •4 Программно-математическое обеспечение
- •4.1Лексический анализатор
- •4.1.1 Функции лексического анализатора
- •4.1.2 Спецификация токенови входного алфавита символов
- •4.1.3 Распознавание токенов
- •4.1.4 Иерархия классов модуля
- •4.2 Синтаксический анализатор
- •4.2.1 Функции синтаксического анализатора
- •4.2.2 Спецификация грамматики
- •4.2.3 Метод разбора
- •4.2.4 Восстановление после ошибок
- •4.2.5 Иерархия классов модуля
- •4.3 Семантический анализ
- •4.3.1 Промежуточное представление программы
- •4.3.2 Грамматика с семантическими правилами
- •4.3.3 Модифицированныйметодразбора
- •4.3.4 Семантический анализ. Таблица символов
- •4.3.5 Семантический анализ. Проверка корректности типа
- •4.4 Генерация кода
- •4.5 Система сбора диагностических сообщений
- •5 Тестирование
- •5.1 Лексический анализатор
- •5.2 Синтаксическийанализатор
- •5.3 Семантический анализатор
- •Заключение
- •Список использованных источников
- •ПриложениеA Диагностические сообщения
- •Диагностические сообщения сканера
- •Диагностические сообщения парсера
- •Диагностические сообщения семантического анализатора
- •ПриложениеБ
- •Б.1.3 Установка системы
- •Б.2 Работа с системой б.2.1 Запуск системы и начало работы
- •Б.2.2Ввод программной модели
- •Б.2.3Трансляция модели и просмотр результата
- •Б.2.4Сохранение программной модели
- •Б.2.6Завершение работы с системой
- •Приложение в
- •Листинг программы
- •В.1 Модуль лексического анализатора
- •Файл abstractLexer.H
- •Файл lexer.H
- •Файл lexer.Cpp
- •В.2 Модуль синтаксического анализатора Файл abstractParser.H
- •Файлparser_ll1.H
- •Файл parser_ll1.Cpp
- •В.3 Модуль семантического анализатора Файл symbolTable.H
- •Файл SymbolTableFactory.H
- •Файл checker.H
- •В.4 Модулькодогенератора ФайлastVisitor.H
- •Файл astCodeGen.H
Б.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