El objetivo de esta práctica es el diseño e implementación de un lenguaje de domino específico (DSL) usando Parse::Eyapp.
MULT(NUM,ADD(NUM,NUM))o
MULT\(*\)(NUM\(2\),ADD\(+\)(NUM\(3\),NUM\(4\)))deberían ser aceptadas.
Un término no es mas que una secuencia de nombres de nodo seguida de un paréntesis abrir y una lista de términos separados por comas, terminada por el correspondiente paréntesis cerrar. Los nombres de nodo admiten cualesquiera caracteres que no sean los paréntesis. Sin embargo, los nombres de nodo pueden contener paréntesis escapados.
pl@nereida:~/Lbook$ cat -n ast.pl 1 #!/usr/bin/perl -w 2 use strict; 3 use GraphViz; 4 5 my $g = GraphViz->new(); 6 7 $g->add_node('MULT(*)', shape => 'box', color => 'blue'); 8 $g->add_node('NUM(2)', shape => 'box', color => 'blue'); 9 $g->add_node("ADD(+)", shape => 'box', color => 'blue'); 10 $g->add_node("NUM(3)", shape => 'box', color => 'blue'); 11 $g->add_node("NUM(4)", shape => 'box', color => 'blue'); 12 13 $g->add_edge('MULT(*)' => "NUM(2)", label => 'left', color => 'blue'); 14 $g->add_edge('MULT(*)' => "ADD(+)", label => 'right', color => 'blue'); 15 $g->add_edge("ADD(+)" => "NUM(3)", label => 'left', color => 'blue'); 16 $g->add_edge("ADD(+)" => "NUM(4)", label => 'right', color => 'blue'); 17 18 open my $f, ">", "perlexamples/ast234.png"; 19 print $f $g->as_png; 20 close($f);Genera un fichero
png
(es posible generar otros formatos, si se prefiere)
conteniendo el gráfico del árbol:
.png
. Sigue un
ejemplo de llamada:
$ tree2png -t 'MULT(NUM,ADD(NUM,NUM))' -o ast.png
dot
como
lenguaje objeto. El lenguaje dot
permite generar gráficos
a partir de una descripción textual de un grafo.
Por ejemplo, a partir del programa dot
:
~/src/perl/graphviz$ cat -n hierarchy.dot 1 digraph hierarchy { 2 3 nodesep=1.0 // increases the separation between nodes 4 5 node [color=Red,fontname=Courier] 6 edge [color=Blue, style=dashed] //setup options 7 8 Boss->{ John Jack } // the boss has two employees 9 10 {rank=same; John Jack} //they have the same rank 11 12 John -> Al // John has a subordinate 13 14 John->Jack [dir=both] // but is still on the same level as Jack 15 }mediante el comando:
~/src/perl/graphviz$ dot hierarchy.dot -Tpng > h.pngproducimos la siguiente imagen: