User Tools

Site Tools


dsl:dot_language

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

dsl:dot_language [2019/05/10 05:53]
zhwiki created
dsl:dot_language [2019/05/11 01:38] (current)
zhwiki
Line 1: Line 1:
 ====== DOT 语言 ====== ====== DOT 语言 ======
  
 +Graphviz绘图工具使用Dot语言作为脚本语言。
  
-DOT 语言的主要语法定义。+===== Graphviz绘图工具 =====
  
-[[https://​graphviz.gitlab.io/​_pages/​doc/​info/​lang.html]] +[[http://​graphviz.org | Graphviz]] 绘图工具是用抽象图形和网络展结构化信息的工具
-Terminals are shown in bold font and nonterminals in italics.单引号表示本意词汇,圆括号表示分组,方括号表可选项,竖线分隔替代项+
  
-%%+Graphviz 有多个布局程序。他的布局程序使用文本文本描述图形,输出图像、SVG、PDF等用于网页或Postscript等。Graphviz 包括的布局有: 
 + 
 +  * dot - 产生层级结构的有向图。这个布局在同一个方向(上下、左右)布局边,尽量避免边的交叉,并使边的长度最短; 
 +  * neato - 弹性模型布局。这个布局算法的目标是最小化全局能量函数; 
 +  * fdp - 与 neato 类似的弹性模型布局。这个布局算法降低力而不是能量函数; 
 +  * sfdp - 多规模版本的 fdp 布局,适用于大规模图形; 
 +  * twopi - 径向布局。根据与根节点的距离,节点布局在围绕根节点的圆周上; 
 +  * circo - 环形布局。适用于多环形结构的图形。 
 + 
 +===== DOT语言的语法 ===== 
 + 
 +[[https://​graphviz.gitlab.io/​_pages/​doc/​info/​lang.html | DOT 语言]]的主要语法定义。 
 + 
 +单引号表示本意词汇,圆括号表示分组,方括号表示可选项,竖线分隔替代项。 
 + 
 +<​code>​
 graph : [ strict ] (graph | digraph) [ ID ] '​{'​ stmt_list '​}'​ graph : [ strict ] (graph | digraph) [ ID ] '​{'​ stmt_list '​}'​
-stmt_list :  [ stmt [ ';'​ ] stmt_list ]+stmt_list : [ stmt [ ';'​ ] stmt_list ]
 stmt : node_stmt stmt : node_stmt
      | edge_stmt      | edge_stmt
Line 15: Line 30:
      | ID '​='​ ID      | ID '​='​ ID
      | subgraph      | subgraph
-attr_stmt :  (graph | node | edge) attr_list +attr_stmt : (graph | node | edge) attr_list 
-attr_list :  '​['​ [ a_list ] '​]'​ [ attr_list ] +attr_list : '​['​ [ a_list ] '​]'​ [ attr_list ] 
-a_list ​ ID '​='​ ID [ (';'​ | ','​) ] [ a_list ] +a_list : ID '​='​ ID [ (';'​ | ','​) ] [ 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 ] +port : ':'​ ID [ ':'​ compass_pt ] 
- | ':'​ compass_pt +     ​| ':'​ compass_pt 
-subgraph ​ [ subgraph [ ID ] ] '​{'​ stmt_list '​}'​ +subgraph : [ subgraph [ ID ] ] '​{'​ stmt_list '​}'​ 
-compass_pt ​ (n | ne | e | se | s | sw | w | nw | c | _) +compass_pt : (n | ne | e | se | s | sw | w | nw | c | _) 
-%%+</​code>​
  
 其中, node, edge, graph, digraph, subgraph, strict 大小写不敏感。 其中, node, edge, graph, digraph, subgraph, strict 大小写不敏感。
Line 39: Line 54:
 ID 就是一个字符串,前两项不使用引号只是为了简单。 ID 就是一个字符串,前两项不使用引号只是为了简单。
  
-edgeop 在有向图中使用 -> ,在无向图中使用 -- 。+edgeop 在有向图中使用 ​%%->%% ,在无向图中使用 ​%%--%% 
  
-Dot 语言支持 C++-风格的注释,/​* */ 和 //​。同时,以 # 字符开始的行被认为是C预处理器输出行,也被忽略。+Dot 语言支持 C++-风格的注释,%%/* */%% 和 %%//%%。同时,以 # 字符开始的行被认为是C预处理器输出行,也被忽略。
  
 分号和逗号只是为了可读性,没有强制要求。元素之间可以插入任何数量的空格。 分号和逗号只是为了可读性,没有强制要求。元素之间可以插入任何数量的空格。
  
-===== 子图和图族 ​=====+==== 子图和图族 ====
  
 子图(Subgraph)在 Graphviz主要有三个作用。一是子图代表一个图形结构,其中的节点和边要求一起处理,同时也为边的操作提供了便捷方式; 子图(Subgraph)在 Graphviz主要有三个作用。一是子图代表一个图形结构,其中的节点和边要求一起处理,同时也为边的操作提供了便捷方式;
  
-%% +  ​A -> {B C}
-A -> {B C} +
-%%+
  
 等价于 等价于
  
-%% +  ​A -> B 
-A -> B +  A -> C
-A -> C +
-%%+
  
 二是子图提供了属性设置的上下文环境;如 二是子图提供了属性设置的上下文环境;如
  
-%% +  ​subgraph {  
-subgraph {  +  rank = same; A; B; C;  
-rank = same; A; B; C;  +  
- +
-%%+
  
 三是子图决定了图形的布局。 三是子图决定了图形的布局。
  
-===== 词汇和语义注释 ​=====+==== 词汇和语义注释 ====
  
 一个图必须声明为 **digraph** 或 **graph**。有向图必须使用 -> 声明边,而无向图使用 -- 声明边。 一个图必须声明为 **digraph** 或 **graph**。有向图必须使用 -> 声明边,而无向图使用 -- 声明边。
Line 76: Line 85:
 图的声明可以使用 **strict**,这样禁止在两个节点间创建多条边。比如 图的声明可以使用 **strict**,这样禁止在两个节点间创建多条边。比如
  
-%%+<​code>​
 strict graph {  strict graph { 
   a -- b   a -- b
Line 82: Line 91:
   b -- a [color=blue]   b -- a [color=blue]
  
-%%+</​code>​
  
 在节点 a,b间只会创建一个蓝色的边。 在节点 a,b间只会创建一个蓝色的边。
Line 90: Line 99:
 子图会继承父图的属性定义,但有时并不希望这样,所以,与其在图形开始处列出属性定义,在子图中重置属性定义,不如在子图定义时定义属性。 子图会继承父图的属性定义,但有时并不希望这样,所以,与其在图形开始处列出属性定义,在子图中重置属性定义,不如在子图定义时定义属性。
  
-===== 字符编码 ​=====+==== 字符编码 ====
  
 DOT 语言缺省使用 UTF-8 字符编码,也接受 Latin1 (ISO-8859-1) 字符集,需要使用 ''​charset''​ 属性指定。 DOT 语言缺省使用 UTF-8 字符编码,也接受 Latin1 (ISO-8859-1) 字符集,需要使用 ''​charset''​ 属性指定。
 +
 +==== 图形的属性 ====
 +
 +所有的[[https://​graphviz.gitlab.io/​_pages/​doc/​info/​attrs.html | 图形属性]]都使用键值对指定,属性名和属性值是大小写敏感的。例如指定abc节点的填充颜色:
 +
 +
 +  abc [fillcolor = red]
 +
 +
 +===== Graphviz命令行调用 =====
 +
 +所以的 Graphviz 程序都有相似的调用方法:
 +
 +  cmd [ flags ] [ input files ]
 +
 +如果没有输入文件,程序从标准输入读取。标志如下:
 +
 +  * -Gname[=value] ​   设置图形属性,缺省值 value = true;
 +  * -Nname[=value] ​   设置节点属性,缺省值 value = true;
 +  * -Ename[=value] ​   设置边属性,缺省值 value = true;
 +  * -Klayout ​   指定布局算法,会覆盖命令名,如运行 ''​dot -Kneato''​ 与运行 ''​neato''​相同; ​
 +  * -Tformat[:​renderer[:​formatter]] ​   设置输出文件格式,缺省输出格式化dot文件。可以指定渲染器和格式器,可以指定多个格式;
 +  * -V    输出版本信息并退出;
 +  * -llibrary ​   指定设备库;
 +  * -n[num] ​   设置neato 中的 no-op 标志;
 +  * -ooutfile ​   指定输出文件,缺省输出到标准输出;
 +  * -O    按照输入文件名自动产生输出文件,格式由T标志指定;
 +  * -P    Automatically generate a graph that shows the plugin configuration of the current executable. e.g. dot -P -Tps | lpr 
 +  * -q    禁止警告信息;
 +  * -s[scale] ​   设置输入比例,缺省为 72.0,如果使用 -n标志会被忽略; ​
 +  * -v    Verbose模式;
 +  * -x    在 neato 中,删除孤立的节点;
 +  * -y    缺省状态下坐标系为直角坐标系,Y轴向上,使用该标志Y轴向下;
 +  * -?    输出帮助信息并退出。
 +
dsl/dot_language.txt · Last modified: 2019/05/11 01:38 by zhwiki