ЗАДАНИЕ БЫЛО ТАКОЕ:
Необходимо выполнить лабораторную работу по теме: См. файл - task.pdf
Структура лабораторной работы
Оформление лабораторной работы
См. файл - task.pdf
___
ДУБЛИРУЮ ЗАДАНИЕ СЮДА:
Использовать средство синтаксического анализа Bison, и реализовать на языке С модуль для
разбора текста в соответствии с языком по варианту. Реализовать построение по исходному
файлу с текстом синтаксического дерева с узлами, соответствующими элементам
синтаксической модели языка. Вывести полученное дерево в файл в формате,
поддерживающем просмотр графического представления.
Порядок выполнения:
1. Записать спецификацию для средства синтаксического анализа, включающую следующие
конструкции:
a. Подпрограммы со списком аргументов и возвращаемым значением;
b. Операции контроля потока управления – простые ветвления if-else и циклы или аналоги;
c. Определения переменных;
d. Целочисленные, строковые и односимвольные литералы;
e. Выражения численной, битовой и логической арифметики;
f. Выражения над одномерными массивами;
h. Выражения вызова функции.
2. Реализовать модуль, использующий средство синтаксического анализа для разбора языка в
соотв. с исходными данными (см. ниже).
a. Программный интерфейс модуля должен принимать строку с текстом и возвращать
структуру, описывающую соответствующее дерево разбора и коллекцию сообщений ошибке;
b. Результат работы модуля – дерево разбора – должно содержать иерархическое
представление для всех синтаксических конструкций, включая выражения, логически
представляющие собой иерархически организованные данные, даже если на уровне средства
синтаксического анализа для их разбора было использовано линейное представление
3. Реализовать тестовую программу для демонстрации работоспособности созданного модуля
a. Через аргументы командной строки программа должна принимать имя входного файла для
чтения и анализа, имя выходного файла записи для дерева, описывающего синтаксическую
структуру разобранного текста
b. Сообщения об ошибке должны выводиться тестовой программной (не модулем,
отвечающим за анализ!) в стандартный поток вывода ошибок.
4. Результаты тестирования представить в виде отчета, в который включить:
a. Задачи – путь достижения цели, что именно нужно было сделать для выполнения задания
(план хода вашей работы). Привести описание структур данных, представляющих результат
разбора текста.
b. Описание работы – внешнее описание созданной программы, состава модулей, способов
её использования, примеры входной и выходной информации (модули, интерфейсы, тесты).
Описать, какая дополнительная обработка потребовалась для результата разбора,
предоставляемого средством синтаксического анализа, чтобы сформировать результат работы
созданного модуля.
c. Аспекты реализации – внутреннее описание созданной программы, особенности
алгоритмов, примеры кода. Привести примеры исходных анализируемых текстов для всех
синтаксических конструкций разбираемого языка и соответствующие результаты разбора.
d. Результаты – что было сделано для выполнения задач кратко по пунктам
(созданные артефакты, результаты тестов, количественные оценки)
e. Выводы – что было достигнуто в отношении цели задания.
(что показали тесты, почему, как это было достигнуто, чему научились, качественные
оценки).
Исходные данные для модели:
identifier: "[a-zA-Z_][a-zA-Z_0-9]*"; // идентификатор
str: "\"[^\"\\]*(?:\\.[^\"\\]*)*\""; // строка, окруженная двойными кавычками
char: "'[^']'"; // одиночный символ в одинарных кавычках
hex: "0[xX][0-9A-Fa-f]+"; // шестнадцатеричный литерал
bits: "0[bB][01]+"; // битовый литерал
dec: "[0-9]+"; // десятичный литерал
bool: 'true'|'false'; // булевский литерал
list<item>: (item (',' item)*)?; // список элементов, разделённых запятыми
Грамматика:
source: sourceItem*;
typeRef: {
|builtin: 'bool'|'byte'|'int'|'uint'|'long'|'ulong'|'char'|'string';
|custom: identifier;
|array: typeRef '(' (',')* ')';
};
funcSignature: identifier '(' list<argDef> ')' ('as' typeRef)? {
argDef: identifier ('as' typeRef)?;
};
sourceItem: {
|funcDef: 'function' funcSignature statement* 'end' 'function';
};
statement: {
|var: 'dim' list<identifier> 'as' typeRef;// for static typing
|if: 'if' expr 'then' statement* ('else' statement*)? 'end' 'if';
|while: 'while' expr statement* 'wend';
|do: 'do' statement* 'loop' ('while'|'until') expr;
|break: 'break';
|expression: expr ';';
};
expr: { // присваивание через '='
|binary: expr binOp expr; // где binOp - символ бинарного оператора
|unary: unOp expr; // где unOp - символ унарного оператора
|braces: '(' expr ')';
|callOrIndexer: expr '(' list<expr> ')';
|place: identifier;
|literal: bool|str|char|hex|bits|dec;
};
Также необходимо следовать данным пунктам:
1 «Нет» статичности. Все структуры данных должны допускать создание множества их
экземпляров.
2 «Нет» «магическим» константам. Все значения должны либо вычисляться из
обрабатываемых
программой данных, либо задаваться с помощью аргументов командной строки или
конфигурационных файлов.
3 «Нет» бесконечным циклам. Все циклы должны иметь понятные условия выхода: не
допускается использовать, например, while (true), for (; ;) и т.д.
4 «Нет» утечке ресурсов. Все ресурсы, которые были использованы в программе и требуют
освобождения (закрытия), должны корректно освобождаться (закрываться) независимо от
возникновения ошибочных ситуаций или исключений. Например, открытый файл должен
быть закрыт после того, как он перестал использоваться в программе; аллоцированная
вручную память обязательно должна освобождаться.
5 «Нет» неожиданным завершениям программы. Все процессы, нити (threads) должны
корректно завершаться в результате выполнения работы, а не прерываться функциями вида
Abort/Exit.
6 «Нет» побайтовому вводу-выводу. Все данные должны обрабатываться частями (блоками)
известного размера, с учетом целесообразного размера буфера.