SQLite上的图表如何制作?

时间:2012-04-27 09:16:38

标签: sqlite graph grammar

  

可能重复:
  Tool for generating railroad diagram used on json.org

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

enter image description here

是否有用于从语法生成图形的工具?

1 个答案:

答案 0 :(得分:1)

这个例子看起来很像有限自动机 - 即正则表达式的图形等价物。如果您可以将您的语法重复为RE(当然,并非所有语法都可以表示为RE!),您可以使用Kleene's theorem将其转换为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 for above RE

然而,这与原版并不完全相同,是吗?提出它是下一个挑战。我建议采用嵌套的RE表达式并从叶子开始递归渲染它们。

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

  1. 两条备用路径。分别渲染每个:
    1. 渲染WHERE expr
      1. WHERE渲染为方框。
      2. 然后是箭头。
      3. 然后将expr渲染为方框。
    2. ()渲染为单箭头。
  2. 找到最长的(第一个)并拉伸其他的以匹配它。
  3. 在每端创建开始和结束节点。
  4. 绘制从起始节点到每个子部分的连接边,然后从每个子部分到结束节点。
  5. 以图形方式执行此操作意味着跟踪框大小和位置,包括隐形框。每个子部分都有一个隐形框。关于递归结构有三点需要注意:

    1. 部件的尺寸取决于其子尺寸。
    2. 子部分的位置取决于其父级的位置。
    3. 所有内容(可能)的位置取决于其他所有内容的大小。
    4. 这意味着您应该首先从底部开始计算每个零件的尺寸。然后,一旦知道根的大小,就可以从上到下开始定位部件。