Код документа C, содержащий конечные автоматы - PullRequest
1 голос
/ 10 февраля 2020

Я написал C код, содержащий конечный автомат 1 . Сейчас я ищу способ для создания файла html, документирующего этот конечный автомат, например [2].

Я смотрел на доксиген [3]. Он может извлекать тексты, графы вызовов и тому подобное, но не может генерировать диаграммы состояний. Я посмотрел на Графвиз [4]. Он может генерировать графики конечных автоматов, но не может объединять текст и график в одном файле html. Я нашел препроцессор Doxygen [5], который утверждает, что может документировать конечные автоматы, но последнее обновление относится к 2009

Кто-нибудь знает систему, которая может извлекать как текст, так и диаграммы из исходного кода, или специально созданные комментарии в коде, которые активно разрабатываются?

Правка 1 Я не так ясно выразил свой вопрос, как следовало бы. Я хотел бы выяснить рабочий процесс, который позволяет мне документировать и проверять код C, который я создаю для продукта на основе микроконтроллера.

Я бы хотел, чтобы мои пользователи, не обладая знаниями программирования, могли быть в состоянии понять, что я собираюсь реализовать в C коде, так что есть большая вероятность, что код C, который я создаю, на самом деле то, что хочет пользователь.

До сих пор я придумал это рабочий процесс:

1) Я и пользователь садимся и обсуждаем, какие могут быть все неисправности, и что должна делать моя программа в ответ на них. Это хранится в электронной таблице.

2) Я преобразовываю электронную таблицу из шага 1 в один или несколько конечных автоматов. Это можно сделать ручкой и бумагой. Когда это будет сделано, я позволю пользователю проверить, соответствует ли конечный автомат электронной таблице.

3) Я пишу конечный автомат в понятной для машины форме и позволяю программе сгенерировать графическое представление конечного автомата. , Я позволяю пользователю проверить, является ли это тем же конечным автоматом, что и версия шага 2.

4) Я принимаю понятную машине форму конечного автомата и использую ее для написания модульных тестов для каждого состояния и перехода. о государственной машине. Я позволил сотруднику с навыками программирования проверить, соответствуют ли юнит-тесты конечному автомату.

5) Я пишу код C и настраиваю его так, чтобы он прошел все модульные тесты.

6) Готовый продукт тестируется в соответствии со сценарием, начиная с шага 1.

Записывая это, я понимаю, что в этом процессе много ручной работы, которая может выполняться автоматически. Знаете ли вы об инструментах, которые могут это сделать?

SM C [6], как полагает Fiddling Bits, выглядит многообещающе, но я не уверен, что он может сгенерировать C -файл, подобный опубликованному под 1 . Я также не уверен, смогу ли я совершить двустороннее путешествие, как это: я записываю конечный автомат в файл .sm, пусть SM C сгенерирует файл C. Я редактирую файл C, позволяю SM C обновить файл .sm, я редактирую файл .sm и позволяю SM C снова обновить файл C.

Edit 2 Я посмотрел на plantuml в соответствии с предложением Mar c, но это добавляет дополнительную сложность в инструменты, необходимые для генерации html страниц.

Я решил проблему с помощью команда \ dot [7] для вставки диаграммы graphvid в блок команд doxygen. См. [8] код C.

1 код C

typedef enum
{
    stIDLE=0,
    stDONE
} TRXSTATES;

TRXSTATES theState = stIDLE;

void execute (void)
{
    switch (theState)
    {
        case stIDLE:
        {
            theState = stDONE
            break;
        }
        case stDONE:
        {
            break;
        }
    }
}

[2] требуемая html страница

Some smart text about this state machine
+--------+       +--------+
+ stIDLE + ----> + stDONE +
+--------+       +--------+

[3] http://www.doxygen.nl/index.html

[4] http://graphviz.org/

[5] https://sites.google.com/site/abudden/doxygen-preprocessor

[6] http://smc.sourceforge.net/

[7] http://www.doxygen.nl/manual/commands.html#cmddot

[8] обновленный C код

/** \mainpage
 * Some smart text about this state machine
 * \dot
 * digraph statemachine {
 *      rankdir=LR
 *      node [shape=record, fontname=Helvetica, fontsize=10];
 *      stIdle [ label="Idle" ];
 *      stDone [ label="Done" ];
 *      stIdle -> stDone [ label ="Finished", arrowhead="open", style="solid" ];
 *  }
 *  \enddot
*/
typedef enum
{
    stIDLE=0,
    stDONE
} TRXSTATES;

TRXSTATES theState = stIDLE;

void execute (void)
{
    switch (theState)
    {
        case stIDLE:
        {
            theState = stDONE
            break;
        }
        case stDONE:
        {
            break;
        }
    }
}  

resulting html page

1 Ответ

2 голосов
/ 11 февраля 2020

Возможный способ - использовать plantuml для кодирования диаграмм в тексте, в doxygen.

Пример диаграммы:

https://dev.mysql.com/doc/dev/mysql-server/latest/structpfs__lock.html

Исходный код для этого, посмотрите на @startuml / @enduml

https://github.com/mysql/mysql-server/blob/8.0/storage/perfschema/pfs_lock.h

Диаграммы ведутся вручную, что позволяет также добавить примечания, комментарии и т. д. c, в результате чего получим c.

...