重複の可能性:
json.orgで使用される鉄道図を生成するためのツール
SQLiteのウェブサイトには言語の文法を示す素晴らしいグラフがいくつかありますが、これらがどのように作成されているか知っている人はいますか?
文法からグラフを生成するためのツールはありますか?
重複の可能性:
json.orgで使用される鉄道図を生成するためのツール
SQLiteのウェブサイトには言語の文法を示す素晴らしいグラフがいくつかありますが、これらがどのように作成されているか知っている人はいますか?
文法からグラフを生成するためのツールはありますか?
この例は、有限オートマトンによく似ています。つまり、正規表現に相当するグラフです。文法を正規表現に表すことができる場合 (当然、すべての文法が正規表現として表現できるわけではありません!)、クリーネの定理を使用してそれを FA グラフに変換できます。
RE の対象となるアルファベットは 1 文字ではなく、単語とトークンであることに注意してください。上記の例では、対応する 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
します。()
単一の矢印としてレンダリングします。これをグラフィカルに行うということは、目に見えないボックスを含め、ボックスのサイズと位置を追跡することを意味します。各サブパーツの周りには目に見えないボックスがあります。再帰構造については、次の 3 つの点に注意してください。
これは、各パーツのサイズを下から順に計算する必要があることを意味します。次に、ルートのサイズがわかったら、トップダウンでパーツの配置を開始できます。