
- •Выпускная квалификационная работа бакалавра
- •Задание на выпускную квалификационную работу бакалавра
- •План-график выполнения работы
- •Реферат
- •Введение
- •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
4.3.2 Грамматика с семантическими правилами
Построение узлов синтаксического дерева реализовано с помощью синтаксически управляемой схемы трансляции (СУТ) с действиями.
Синтаксически управляемая схема трансляции представляет собой контекстно-свободную грамматику с программными фрагментами, внедрёнными в тела продукций. Эти фрагменты называются семантическими действиями и могут находиться в любой позиции в теле продукции.По соглашению действия располагаются внутри фигурных скобок.
Ниже приведена грамматика из раздела 4.2 с добавлением семантических действий в виде нетерминалов.
program → declsDefins {make_seq_decl} classicPart {make_seq_cl_p} hybridPart {make_seq_hyb_p, make_program}
declsDefins → declDefins1 declsDefins
declsDefins → ε
выбориз 2.1 или 2.2 (предосмотр 2)
declsDefins1 → MACRO ID{make_id} param = expr ; {make_decl_macro}
declsDefins1→ CONST ID{make_id} = sign ; {make_decl_const}
declsDefins1 → ARRAY ID{make_id} [NUM {make_const_int} ] ; {make_decl_array}
declsDefins1 → COUNT ID{make_id} = [ list_inter {make_list_inter}]; {make_decl_count}
declsDefins1 → ID {make_id} index = sign ; {make_set_global}
list_inter → interval list_inter1
list_inter1 → , interval list_inter1
list_inter1 → ε
interval → NUM {make_const_int} - NUM{make_const_int, make_interval}
param → [ ID {make_id} ]
param → ε
sign → - sign {make_unary_minus}
sign → literal
index → [ expr_i ] {make_access}
index → ε
classicPart → classicPart1 classicPart
classicPart → ε
выбориз 10.1 или 10.2 (предосмотр2)
classicPart1 → equation
classicPart1 → condition
condition → IF ( Bool ) THEN localValues {make_seq_loc_v} ENDIF ; {make_if}
equation → ID {make_id} der {make_der} index = expr ; {make_equation}
localValues → localValue localValues1
localValues1 → localValue localValues1
localValues1 → ε
localValue → ID {make_id} index = expr ; {make_set_local}
der → '
der → ~
Bool → join Bool1
Bool1 → ORjoin {make_or} Bool1
Bool1 → ε
join → equality join1
join1 → AND equality {make_and} join1
join1 → ε
equality → rel equality1
equality1 → EQ rel {make_eq}
equality1 → NE rel {make_ne}
equality1 → ε
rel → expr rel1
rel1 → < expr { make_less }
rel1 → > expr {make_gr}
rel1 → LE expr {make_le}
rel1 → GE expr {make_ge}
rel1 → ε
expr → term expr1
expr1 → - term {make_sub} expr1
expr1 → + term {make_sum} expr1
expr1 → ε
term → unary term1
term1 → / unary {make_div} term1
term1 → * unary {make_mul} term1
term1 → ε
unary → factor
unary → - unary {make_unary_minus}
unary → NOT unary {make_unary_not}
factor → ( Bool )
factor → ID {make_id} spec
factor → REAL {make_const_float}
factor → NUM {make_const_int}
spec → index
spec → ( {make_start_list} list_expr ) {make_list_arg, make_func}
list_expr → expr list_expr1
list_expr1 → , expr list_expr1
list_expr1 → ε
hybridPart → localState hybridPart
hybridPart → ε
localState → ver IS body {make_seq_eq_locval} FROM list_ver {make_list_vers} ; {make_loc_state}
ver → ID {make_id} cond
cond → [ Bool ] {make_ver_cond}
cond → ε {make_ver}
body → body1 body
body → ε
body1 → equation
body1 → localValue
выбориз 40.1 или 40.2 (предосмотр2)
list_ver → ver list_ver1
list_ver → ε
list_ver1 → , ver list_ver1
list_ver1 → ε
literal → NUM {make_const_int}
literal → REAL {make_const_float}
expr_i → term_i expr1_i
expr1_i → + term_i {make_sum} expr1_i
expr1_i → - term_i {make_sub} expr1_i
expr1_i → ε
term_i → unary_i term1_i
term1_i → / unary_i term1_i
term1_i → * unary_1 term1_i
term1_i → ε
unary_i → factor_i
unary_i → - unary_i {make_unary_minus}
factor_i → ( expr_i)
factor_i → ID {make_id}
factor_i → NUM {make_const_int}
Втаблице 4.3расшифрованкаждыйизнетерминалов,представляющихсемантическоедействие.
Таблица 4.3 – Семантические действия языка LISMA+
Нетерминал (Семантический маркер) |
Описание семантического действия |
make_program |
Создание узла программы - Program |
make_decl_const |
Создание узла декларации константы - DeclConst |
make_decl_array |
Создание узла декларации массива - DeclArray |
make_decl_count |
Создание узла декларации счётчика - DeclCount |
make_decl_macro |
Создание узла декларации макроса - DeclMacro |
make_seq_cl_p |
Создание узла спискаузлов операторов Seq из “классической части” программы |
make_seq_hyb_p |
Создание узла списка узлов операторов Seq из “гибридной части” программы |
make_seq_decl |
Создание узла списка узлов операторов Seq из “части объявлений” программы |
make_seq_loc_v |
Создание узла Seq– списка узлов операторов задания ЛНУ в условном операторе |
make_seq_eq_locval |
Создание узла Seq– списка узлов операторов задания ЛНУ и уравнений |
make_set_global |
СозданиеузлазаданияГНУSetGloabalилиSetGlobalIndex |
make_equation |
Создание узла уравненияEquationилиEquationIndex |
make_set_local |
Создание узла задания ЛНУSetLocalилиSetLocalIndex |
make_if |
Создание узла условного оператораIf |
make_loc_state |
Создание узла локального состоянияLocalState |
make_list_inter |
Создание узла ListExpr- списка интервалов счётчика |
make_list_arg |
Создание узла ListExpr- списка аргументов функции |
make_list_vers |
Создание узла ListExpr- списка условно-адресных пар |
make_interval |
Создание узла интервала изменения счётчикаInterval |
make_access |
Создание узла операции индексацииAccess |
make_func |
Создание узла операции вызова функцииFunc |
make_unary_minus |
Создание узла операции унарный минусUnaryMinus |
make_unary_not |
Создание узла операции логическое отрицаниеUnaryNot |
make_const_int |
Создание узла целочисленной константыConstantInt |
make_const_float |
Создание узла вещественной константыConstantFloat |
make_id |
Создание узла идентификатора Id |
make_or |
Создание узла операции логического “или”Or |
make_and |
Создание узла операции логического “и”And |
make_eq |
Создание узла операции “==” Eq |
make_ne |
Созданиеузлаоперации“!=” Ne |
make_less |
Созданиеузлаоперации“<” Less |
make_gr |
Созданиеузлаоперации“>” Gr |
make_le |
Созданиеузлаоперации“<=” Le |
make_ge |
Созданиеузлаоперации“>=” Ge |
make_sub |
СозданиеузлаоперациивычитанияMinusExp |
make_sum |
Созданиеузлаоперации суммированияPlusExp |
make_div |
Созданиеузлаоперации деленияDivExp |
make_mul |
Созданиеузлаоперации умноженияMulExp |
make_ver |
Созданиеузлаусловно-адресной парыVer |