强制Graphviz报告重复节点错误

3

我注意到Graphviz可以处理重复的节点名称(即使它们带有唯一标签),而不会有任何警告。例如,考虑下面这个简单的图形,在使用circo渲染后如下图所示:

graph { 
      a [label="a1"]
      a [label="a2"]
      b
      c
      d
      e
      a -- b; 
      b -- c; 
      a -- c; 
      d -- c; 
      e -- c; 
      e -- a; 
}

一个只包含两个重复节点的简单图形 a

我希望上面的图形有两个节点:a1和a2。所以我知道我应该用唯一的名称实例化它们(与我上面所做的不同)。但是在一个大的图形中,我可能没有注意到我错误地使用相同的名称实例化了两个不同的节点。因此,如果我这样做,我希望强制 Graphviz 抱怨或以某种方式提醒我,也许是通过警告或错误消息。

我该如何实现呢?


一个节点在dot文件中出现多次是完全合法的。即使你认为不是,节点在第一次出现时会隐式地被创建,没有显式的节点创建。没有办法区分“想要的”创建和“不想要的”创建。此外,如果你担心节点名称错误,那么你如何找到名称错误且没有冲突的节点呢? - stefan
1个回答

2
所有的graphviz程序都会自动合并重名节点,我无法找到任何方法让它们在合并时发出警告。然而,我们只需要找到那些单独声明节点的情况,而不是当声明边时隐含声明节点的情况(在这种情况下重复是正常和预期的),因此我们只需找到所有节点名称并识别重复项即可。
如果每行仅声明一个节点,则可以使用以下脚本完成:
#!/bin/sh
sed -n 's/^[\t ][\t ]*\([_a-zA-Z][_a-zA-Z0-9]*\) *\(\[.*\)*;*$/\1/ p' | \
sort | uniq -c | awk '$$1>1'

如果我们将这个脚本命名为findDupNodes,那么我们可以按照以下方式运行它:
$ findDupNodes <duplicates.gv
      2 a

该脚本查找节点名称,这些名称可以由它们自己或以[开头的属性列表声明,对它们进行排序,计算每个声明的次数(使用uniq -c)并过滤掉仅声明一次的节点。
一个单行上可以声明多个节点(例如a; b; c; d;),但是此脚本不处理该情况,也不处理其他一些情况--其中大部分可能需要完整的xdot语言解析器。
尽管如此,该脚本应该能够找到许多可能出现在手写的graphviz脚本中的重复节点名称。

我永远不会在一行上声明多个节点,所以这个脚本对我来说非常有效。非常感谢! - Kevin Ford The Submariner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接