可能重複:
Tool for generating railroad diagram used on json.orgSQLite上的圖形如何製作?
的SQLite有一些真棒曲線圖,顯示在其網站上的語言的語法,沒有人知道如何這些,怎麼辦?
是否有來自grammas生成圖形的工具嗎?
可能重複:
Tool for generating railroad diagram used on json.orgSQLite上的圖形如何製作?
的SQLite有一些真棒曲線圖,顯示在其網站上的語言的語法,沒有人知道如何這些,怎麼辦?
是否有來自grammas生成圖形的工具嗎?
這個例子看起來很像有限自動機 - 即正則表達式的等價圖。如果您可以將您的語法重複到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
作爲一個框。()
。以圖形方式做這件事意味着跟蹤箱子的大小和位置,包括不可見的箱子。每個子部分都有一個不可見的框。有三件事情需要注意的遞歸結構:
這意味着你應該首先計算每個部分的大小,從底部開始。然後,一旦你知道了根的大小,你就可以開始定位這些部分,自上而下。
生成sqlite鐵路圖的程序的作者已經解釋了http://wiki.tcl.tk/21708,如Sqlite常見問題http://www.sqlite.org/faq.html#q25 – 2012-04-27 10:35:14
@BartKiers:你提到的問題給出的解決方案的問題是圖中不支持循環。廣告,使所有的差異。 – 2012-04-27 10:44:46
@DanD .:對於某些人來說,不知道的是,有些理由的答案是tcl代碼。我希望有這樣一種通用的解決方案:-( – 2012-04-27 10:46:24