可能重复:
用于生成 json.org 上使用的铁路图的工具
SQLite 在他们的网站上有一些很棒的图表显示语言的语法,有人知道这些是如何制作的吗?
有没有从语法生成图表的工具?
这个例子看起来很像一个有限自动机——即正则表达式的图形等价物。如果您可以将您的语法表示为 RE(自然,并非所有语法都可以表示为 RE!),您可以使用Kleene 定理将其转换为 FA 图。
请注意,RE 所讨论的字母表不是单个字母,而是单词和标记。在上面的示例中,对应的 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
为一个盒子。()
为单个箭头。以图形方式执行此操作意味着跟踪框的大小和位置,包括不可见的框。每个子部分周围都有一个不可见的框。关于递归结构,需要注意三点:
这意味着您应该首先从底部开始计算每个部分的大小。然后,一旦你知道根的大小,你就可以开始定位部件,自上而下。