SQLite有一些很棒的图表显示了他们网站上语言的语法,有谁知道这些是如何制作的?
是否有用于从语法生成图形的工具?
答案 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将做一个可以轻松绘制的工作。
然而,这与原版并不完全相同,是吗?提出它是下一个挑战。我建议采用嵌套的RE表达式并从叶子开始递归渲染它们。
例如,要渲染(WHERE expr|())
:
WHERE expr
:
WHERE
渲染为方框。expr
渲染为方框。()
渲染为单箭头。以图形方式执行此操作意味着跟踪框大小和位置,包括隐形框。每个子部分都有一个隐形框。关于递归结构有三点需要注意:
这意味着您应该首先从底部开始计算每个零件的尺寸。然后,一旦知道根的大小,就可以从上到下开始定位部件。