1

可能重复:
用于生成 json.org 上使用的铁路图的工具

SQLite 在他们的网站上有一些很棒的图表显示语言的语法,有人知道这些是如何制作的吗?

在此处输入图像描述

有没有从语法生成图表的工具?

4

1 回答 1

1

这个例子看起来很像一个有限自动机——即正则表达式的图形等价物。如果您可以将您的语法表示为 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将完成清晰的绘制工作。

FA 用于上述 RE

然而这和原来的不太一样,是吗?很好地呈现它是下一个挑战。我建议采用嵌套的 RE 表达式并递归地渲染它们,从叶子开始。

例如,要渲染(WHERE expr|())

  1. 两条备用路径。分别渲染:
    1. 渲染WHERE expr
      1. 渲染WHERE为盒子。
      2. 然后是一箭。
      3. 然后渲染expr为一个盒子。
    2. 渲染()为单个箭头。
  2. 找到最长的(第一个)并拉伸其他的以匹配它。
  3. 在每一端创建开始和结束节点。
  4. 绘制从开始节点到每个子部分的连接边,然后从每个子部分到结束节点。

以图形方式执行此操作意味着跟踪框的大小和位置,包括不可见的框。每个子部分周围都有一个不可见的框。关于递归结构,需要注意三点:

  1. 零件的大小取决于其子项的大小。
  2. 子部件的位置取决于其父部件的位置。
  3. 一切的位置(可能)取决于其他一切的大小。

这意味着您应该首先从底部开始计算每个部分的大小。然后,一旦你知道根的大小,你就可以开始定位部件,自上而下。

于 2012-04-27T10:10:54.583 回答