
- •Выпускная квалификационная работа бакалавра
- •Задание на выпускную квалификационную работу бакалавра
- •План-график выполнения работы
- •Реферат
- •Введение
- •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.1.2 Грамматика языка исма
Синтаксический анализатор языкового процессора языка LISMA является нисходящим методом рекурсивного спуска, использует последовательность разбора слева направо, использует просмотр вперед на K символов без возвратов (LL(k)).
Согласно классификации Хомского грамматика языка является однозначной контекстно-свободной (КС).
Далее представлены КС-грамматики нерегулярных конструкций языка LISMA. Строчными латинскими буквами обозначены нетерминальные символы, прописными – элементы терминального алфавита. Описание конструкций приводится в двух формах для лучшего восприятия: псевдоязык и общепринятая в теории формальных грамматик – форма Бэкуса-Наура (BNF). Достаточно сложные конструкции сопровождаютсяфрагментами программ, иллюстрирующих их использование.
Вызов функции (F)
<идентификатор> ( <список_фактических_параметров> )
F → i b A P f
P → c A
P → c A P
Арифметическое выражение (A)
A → m O R
A → O R
R → a O
R → a O R
O → i
O → u
O → F
O → b A f
Пользовательская константа (C)
[const] <идентификатор> = [-] <число_без_знака> ;
C → n i k m u e
C → n i k u e
C → i k m u e
C → i k u e
Макрос (M)
macro <идентификатор> = <арифметическое_выражение> ;
M → p i k A e
Глобальное начальное условие (G)
<идентификатор> = [-] <число_без_знака> ;
G → i k m u e
G → i k u e
Локальное начальное условие (I)
<идентификатор> = <арифметическое_выражение> ;
I → i k A e
Уравнение (E)
<идентификатор> [‘|~] = <арифметическое_выражение> ;
E → i j k A e
Логическое выражение (L)
L → B
L → L o B
B → A x A
B → i
B → u
B → m u
B → b L f
B → y b B f
B – атомарная составляющая логического выражения. Например: x>=y, abs(sin(x))<0, not (((((x+5)))!=7)), true, -5.
Условный оператор (Q)
if ( <логическое_выражение> ) then <последовательность_действий> endif ;
Q → q b L f r H t e
H → I
H → H I
Пример:
if (y<0) then
v=-v;
endif;
Локальное состояние (W)
<условно_адресная_пара> is <операторы><секция_from> ;
<операторы> → { <локальное_начальное_значение> | <уравнение> }
<секция_from> → from <условно_адресная_пара>{‘,’ <условно_адресная_пара>}
<условно_адресная_пара> → <идентификатор> [ ‘[’ <логическое_выражение> ‘]’ ]
Программа (S)
< константы_и_макросы><динамическая_часть><гибридная_часть>
S → T U V
T → C
T → M
T → T C
T → T M
U → E
U → U E
V → W
V → V W
Пример программы:
x1=0; x2=4;
w=2.5;
v1=2; v2=1;
r1=0; r2=0;
st1 [ (x1<=r1) ] is
x1'=w-v1;
x2'=-v2;
from;
st2 [ (x2<=r2) ] is
x1'=-v1;
x2'=w-v2;
from;
Из определения конструкции Программа видно, что корректность структуры программы контролируется уже на этапе синтаксического анализа.
Для удобства классификации перепишем грамматику в расширенной форме Бэкуса-Наура (EBNF), используя правила свертки. Грамматика LISMA принимает вид:
1) S → A B C // программа
2) A → { D | E }
3) B → { F | G }
4) C → { H }
5) H → i g I h v { J | F } w [ i [ g I h] { c i [ g I h]} ] // локальное состояние
6) G → q b I f r J { J } t e // условный оператор
7) I → K { o K } // логическое выражение
8) K → L x L | i | [m] u | [y] b I f
9) F → i j k L e // уравнение
10) J → i k L e // лок. начальное значение
11) M → i k [m] u e // глоб. начальное значение
12) E → p i k L e // макрос
13) D → [n] i k [m] u e // пользовательская константа
14) L → [m] O { a | m O} // арифметическое выражение
15) O → i | u | P | b L f
16) P → i b L { c L } f // вызов функции
В качестве алгоритма, реализующего нейтрализацию синтаксических ошибок, используется алгоритм Айронса [11].