2012-04-27 23 views
2

可能重複:
Tool for generating railroad diagram used on json.orgSQLite上的圖形如何製作?

的SQLite有一些真棒曲線圖,顯示在其網站上的語言的語法,沒有人知道如何這些,怎麼辦?

enter image description here

是否有來自grammas生成圖形的工具嗎?

+1

生成sqlite鐵路圖的程序的作者已經解釋了http://wiki.tcl.tk/21708,如Sqlite常見問題http://www.sqlite.org/faq.html#q25 – 2012-04-27 10:35:14

+0

@BartKiers:你提到的問題給出的解決方案的問題是圖中不支持循環。廣告,使所有的差異。 – 2012-04-27 10:44:46

+0

@DanD .:對於某些人來說,不知道的是,有些理由的答案是tcl代碼。我希望有這樣一種通用的解決方案:-( – 2012-04-27 10:46:24

回答

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. 繪製從起始節點到每個子部分的連接邊,然後從每個子部分到結束節點。

以圖形方式做這件事意味着跟蹤箱子的大小和位置,包括不可見的箱子。每個子部分都有一個不可見的框。有三件事情需要注意的遞歸結構:

  1. 大小的一部分取決於其子女的大小。
  2. 位置的子部分取決於其父項的位置。
  3. 一切(可能)的位置取決於其他的大小。

這意味着你應該首先計算每個部分的大小,從底部開始。然後,一旦你知道了根的大小,你就可以開始定位這些部分,自上而下。