DOT language

  • 「文法」を説明するための、「文法の書式」について
    • 1行ごとに何かが書いてある
      • たとえば、次のような1行は"hogeとは*****と書かれたものである"と言う意味
hoge:*****
    • 正規表現的記法
      • "*****"の書き方を表現するためのルールは以下の通り
      • "( )" はグループ化している。(から)までは色々書かれているけれど、1つの要素が書かれているところですよ、という意味
        • たとえば (graph|digraph)と言うのは、"graph"か"digraph"と書くところですよ、という意味。( ) は実際のDOT文書には現れない
      • "[ ]" はオプショナル(書いても書かなくてもよいこと)を表す
      • " | " は選択肢の間の区切り
  • 「文法」が扱う要素について
  • 以上で、文法が解るはずなので、1行ずつ「読んで」みる

graph:[strict](graph|digraph)[ID]'{'stmt_list'}'

  • 「graphとは」
    • "strict"は書いても書かなくてもよい(strictは自身へのエッジを許さないグラフを表している。エッジ重複も許さない(ようだ))
    • "graph"か"digraph"のどちらかを書く
    • IDというのは文字列(で作った名称)のこと(で、どんな文字列が許されているかは別途定義がある)で、書いても書かなくてもよいが、どこかでgraphとして参照するときはつけておかないと困る
    • "{ }"は書かないといけない
    • "{ **** }"の"****にはstmt_listというのが入る。ただしstmt_listとは何かはまだ定義が無いが、以降で定義される

stmt_list:[stmt[';'][stmt_list]]

  • 「stmt_listとは」
    • 空(から)でもよい
    • stmtが一つあってもよい。ただしstmtが何であるかの定義は後述される
    • stmtが並んでいてもよい
    • stmtの区切りはなくてもよいし、つけるなら";"を使う

stmt:node_stmt | edge_stmt | attr_stmt | ID '=' ID |subgraph

  • 「stmtとは」
    • 5つのいずれかである。node_stmt,edge_stmt,attr_stmt,ID=ID,subgraph がその5つ。それぞれ後述される
    • (それらの説明はアルファベット順のようだ。途中にさらに詳しく説明するための用語が登場しそれについてもアルファベット順で定義が加えられている)

attr_stmt:(graph | node | edge) attr_list

  • 「attr_stmtとは」
    • "graph"または"node"または"edge"で始まり、その後にattr_listが続いたもので、属性のリストをアイテムに与えるためのもの
    • すべてのgraph,node,edgeに一括して属性を与えるためのもの

attr_list:'['[a_list] ']' [attr_list]

  • 「attr_listとは」
    • [ ]で囲まれたもので、属性リストを与える
      • [ ]の中身は空(から)でもよい
      • [ ]の中身は何かを入れるならa_listを入れる。a_listの定義は後述
      • [ ]で囲まれたものを1個以上連ねてもよい

a_list : ID '=' [','][a_list]

  • 「a_listとは」
    • ID = ID と書いたもの、もしくは、それを連ねたものであって、区切り文字を使うなら","を使う
    • ここでIDと言うのは非常に自由度の大きい文字列であって、アイテムの固有名詞を作ったり、グラフオブジェクトの属性(colorとか)を決めたり、その属性の値を定めたりするのに使う
      • 色々な属性がグラフ・ノード・エッジ、サブグラフ、クラスターサブグラフに定められており、ここに一覧表がある

edge_stmt:(node_id|subgraph)edgeRHS [attr_list]

  • 「edge_stmtとは」
    • node_idもしくはsubgraphで始まり
    • edgeRHSが続く
    • attr_listを続けてもよい

edgeRHS : edgeop (node_id | subgraph) [ edgeRHS ]

  • 「edgeRHSとは」
    • edgeop で始まり
    • node_id もしくはsubgraphが続く
    • edgeRHSをつなげてもよい(つなげるとパスができる)

node_stmt: node_id [ attr_list]

  • 「node_stmtとは」
    • node_idで始まり、attr_listをつけてもよい

node_id: ID [port]

  • 「node_idとは」
    • ID(文字列)である
    • portをつけてもよい

port: ':' ID [ ':' compass_pt ] | ':' compass_pt

  • 「portとは」
    • :で始まりIDが続いたものに:を区切りとしてcompass_ptをつなげたもの、もしくは:にcompass_ptを続けたもの

subgraph:[ subgraph [ID] ] '{' stmt_list '}'

  • 「subgraphとは」
    • { }でstmt_listを囲んだものであって
    • そのまえに宣言をつけるならsubgraphという宣言をつける
    • subgraphにIDをつけてもよい
      • subgraphのIDが"cluster"で始まると、それはGraphvizが視覚化するときに、塊として囲って表示する、という仕様になっており、特別にcluster subgraphと呼ばれる。あくまでDOT languageではsubgraphがあるのであって、cluster subgraphという概念はない

compass_pt: (n | ne | e | se | s | sw | w | nw | c| _)

  • compass_ptとは」描図のための(ノードの)位置・方向を定めるもので
    • n...nw,c,_のいずれかである