Pular para o conteúdo

Desenhar o grafo

O grafo de fluxo em DOT: blocos, arestas rotuladas, e o código que nunca roda tracejado.

Um grafo de fluxo lido como texto é difícil de acompanhar a partir de dez blocos. Comp.dot o escreve no formato do Graphviz, e o desenho mostra de uma vez o que o texto espalha: os ramos, o laço voltando, e o que nunca roda.

dataforge
adopt Arcane.Compilador as Comp

fonte := "action f(n):\n    total := 0\n    cycle i from 1 to n:\n        total += i\n    yield total\n    out \"nunca\"\n"
dot := Comp.dot(fonte, "f")
out dot

assert dot.starts_with("digraph fluxo {")
assert dot.contains('[label="volta"]')            // a aresta que fecha o laço
assert dot.contains("style=dashed")                // o 'out' depois do yield
text
IO.write("fluxo.dot", Comp.dot(IO.read("pedido.df")))
// no terminal:  dot -Tsvg fluxo.dot -o fluxo.svg
No desenhoQuer dizer
uma caixaum bloco básico: instruções que rodam sempre juntas
sim / naoos dois lados de uma condição
voltaa aresta que fecha um laço
erroo caminho de um monitor para o handle
caixa tracejada e cinzabloco que nenhum caminho alcança