Задан DSL, представляющий собой графическое описание алгоритмов при помощи блок-схем. Блок-схема представляет из себя блоки со входами и выходами, соединенные направленными линиями. Каждый блок может быть как элементарной операцией (арифметической, логической), так и более сложной составной функцией. Линии обозначают потоки данных между блоками.
Реализован прототип кодогенератора.
Проект использует систему сборки CMake
и написан на C++17. Сборка:
cmake .
cmake --build . -j3
Результатом является исполняемый файл codegen
:
./codegen example.xml # out.c (опционально)
Блок-схема всегда имеет единственный выход - Outport
, поэтому было
сделано решение использовать дерево-подобную структуру для
представления блоков.
Однако, DSL предполагает, что могут присутствовать циклические ссылки. По этой причине при кодогенерации для каждого блока хранится флаг, который служит для того, чтобы кодогенерация произошла для каждого блока один раз.
Реализация не зависит от порядка блоков во входном XML-файле и способна обрабатывать сложную блок-схему из тестового example.xml
.
Был реализован функционал для обработки вложенных блок-схем: ситуаций, когда блок сам по себе является другой блок-схемой. В тестовом примере не присутствовало такой ситуации и был придуман свой способ реализации.
Был добавлен новый тип блока: BlockCustom
. Он объявляется следующим образом:
<Block BlockType="Custom" Name="Dependency 1" SID="69">
<P Name="Filepath">custom.xml</P>
<P Name="OutputFile">custom.c</P>
</Block>
В параметрах блока задаются путь к дочерней блок-схеме и путь куда нужно генерировать .c файл для дочерней блок-схемы.
В коде на C был придуман следующий способ вызова дочерней
блок-схемы(переменная Dependency1
является "выходом"):
nwocg.Dependency1 = callModule("custom.c", nwocg.Add3);
Предложенный способ не является полноценным, но легко
адаптируется. Проверить можно используя файл exampleWithCustom.xml
:
./codegen exampleWithCustom.xml out.c
-
правильный вывод ошибок. На данный момент выбрасывается исключения с малым количеством информации об ошибке. Полагалось, что полноценный вывод ошибок не является задачей из-за нецелесообразности и сложности;
-
оптимизация генератора: используется не самые эффективные структуры данных. Снова полагалось, что этого не требуется в задаче;
-
запуск генерируемого кода в какой-либо среде.