Этот пример очень похож на конечный автомат - т. Е. Эквивалент графа регулярного выражения. Если вы можете представить свою грамматику в RE (естественно, не все грамматики будут представлены как REs!), Вы можете использовать Kleene's theorem, чтобы перевести его в граф FA.
Обратите внимание, что данный алфавит для REs - это не отдельные буквы, а слова и жетоны. В приведенном выше примере соответствующий RE выглядит следующим образом:
DELETE FROM qualified-table-name
(WHERE expr|()) /* "WHERE expr" is optional; the alternative branch is the empty expression "()" */
(
(ORDER BY ordering-term (, ordering-term)*|()) /* ", ordering-term" may be repeated */
LIMIT expr ((OFFSET|,) expr|()) /* can use "OFFSET" or "," */
|()
)
Это означает, что FA очень похож на вашу диаграмму. GraphViz выполнит непростую работу по разметке чертежа.
Однако это не совсем так же, как оригинал, так? Представлять это красиво - следующая задача. Я бы предложил взять вложенные выражения RE и рендерировать их рекурсивно, начиная с листьев.
Например, для визуализации (WHERE expr|())
:
- два альтернативных пути. Рендер каждый в отдельности:
- Рендер
WHERE expr
:
- Рендер
WHERE
как поле.
- Затем стрелка.
- Затем рендер
expr
как коробка.
- Render
()
как отдельная стрелка.
- Найти самый длинный (первый) и растянуть остальные, чтобы соответствовать ему.
- Создайте начальные и конечные узлы на каждом конце.
- Нарисуйте соединительные края от начального узла к каждой подчасти, затем от каждой подчасти к конечному узлу.
Выполнение этого графически означает отслеживание размеров и положений коробки, в том числе невидимых. На каждом подчастике есть невидимая коробка. Есть три вещи, чтобы отметить о рекурсивной структуры:
- размер компонента зависит от размеров его детей.
- местоположение подчасти зависит от местоположения его родителя.
- Местоположение всего (может) зависит от размеров всего остального.
Это означает, что вы должны сначала рассчитать размеры каждой детали, начиная с нижней. Затем, как только вы знаете размер корня, вы можете начать позиционирование частей сверху вниз.
Авторы программы, которая генерирует диаграммы железных дорог sqlite, объяснили это http://wiki.tcl.tk/21708, как указано в FAQ Sqlite http://www.sqlite.org/faq.html#q25 –
@BartKiers: проблема с решением, заданным в вопросе, на который вы ссылаетесь, заключается в отсутствии поддержки циклов на диаграмме. Объявление, которое имеет значение. –
@DanD .: Для некоторых, неизвестных человеку, своего рода причиной является tcl-код. Я надеялся, что для этой вещи есть общее решение :-( –