DOT language
- 「文法」を説明するための、「文法の書式」について
- 1行ごとに何かが書いてある
- たとえば、次のような1行は"hogeとは*****と書かれたものである"と言う意味
- 1行ごとに何かが書いてある
hoge:*****
-
- 正規表現的記法
- "*****"の書き方を表現するためのルールは以下の通り
- "( )" はグループ化している。(から)までは色々書かれているけれど、1つの要素が書かれているところですよ、という意味
- たとえば (graph|digraph)と言うのは、"graph"か"digraph"と書くところですよ、という意味。( ) は実際のDOT文書には現れない
- "[ ]" はオプショナル(書いても書かなくてもよいこと)を表す
- " | " は選択肢の間の区切り
- 正規表現的記法
- 「文法」が扱う要素について
- 終端記号と非終端記号(終端記号と非終端記号(Wiki)
- ボールドは終端記号、イタリックは非終端記号
- リテラル文字
- シングルクオーテーションで囲んで示してある
- { } [ ] ; : =
- 終端記号と非終端記号(終端記号と非終端記号(Wiki)
- 以上で、文法が解るはずなので、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とは」
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
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,_のいずれかである