#example 21 Jul 2004 http://www.cs.ucl.ac.uk/staff/W.Langdon (EQ D1 (NOT (IFLTE D1 D2 D3 D4)))
graphviz/bin/dot example.dot -Tgif > lisp2dot_example.gif
//Created by lisp2dot.awk Revision: 1.2 $ from file example.txt digraph simpleDotFile { n000 [label=EQ]; n001 [label=D1]; n000 -> n001; n002 [label=NOT]; n000 -> n002; n003 [label=IFLTE]; n002 -> n003; n004 [label=D1]; n003 -> n004; n005 [label=D2]; n003 -> n005; n006 [label=D3]; n003 -> n006; n007 [label=D4]; n003 -> n007; }
#nawk script to extract connectivity from tree gp # #WBL 21 July 2004 created $Revision: 1.2 $" #http://www.cs.ucl.ac.uk/staff/W.Langdon/lisp2dot.html # #Inputs: file containing program as text #Example gawk -f lisp2dot.awk example.txt > example.dot #dot file documentation http://www.graphviz.org/cgi-bin/man?dot #dot interpreter http://java.ist.unomaha.edu/~payne/dot/ BEGIN { #Arity is given by function name via these four strings NOT brackets #all non-terminals from GProc1.8 sym.cc r1.124 #You may need to edit this file or override by command line. if(arity1=="") arity1 =",NOT,SMNOT,XC,YC,ANN,Int,Frac,INT,FRAC"; if(arity2=="") arity2 =",ADD,SUB,MUL,DIV,AND,OR,NAND,NOR,XOR,EQ,APPROX,DIF,GT,GTEQ,LT,LTEQ,SMAND,SMOR,SMEQ,SMDIF,SMGE,SMLE,Max,Min,MaxA,MinA"; if(arity3=="") arity3 =""; if(arity4=="") arity4 =",IFLTE,"; ##else arity0, ie terminal } (FNR==1) { printf("//Created by lisp2dot.awk %s",substr("$Revision: 1.2 $",2)); printf(" from file %s\n",FILENAME); } ($1=="poly0" && (n1=index($0,"="))>1) { #GProc start of program code = substr($0,n1+1); } (index($0,"#")==0 && ($1!="poly0") ) { code = sprintf("%s %s",code,$0); } END{ # print code; print "digraph simpleDotFile {"; l=split(code,inst,"[ \t\(\)]"); #remove brackets and layout pc=0; parent=-1; args=1; #sanity check only for(i=1;i<=l;i++) { if(length(inst[i])>0) { node_name[pc]=inst[i]; node_nxt[pc]=0; node_arity[pc]=arity(node_name[pc]); args += node_arity[pc]-1; # printf("//i=%3d pc=%3d %2d %d %5s %3d\n", \ # i, \ # pc, \ # index(arity2,sprintf(",%s,",node_name[pc])),\ # node_arity[pc], \ # sprintf(",%s,",node_name[pc]), \ # parent); if(args<0) print "ERROR badly formed tree. Check arity1-4? args",args," i=",i," pc=",pc,inst[i]; node_back[pc]=parent; node_nxt[parent]++; node_child[parent,node_nxt[parent]]=pc; if(node_arity[pc]>0) parent=pc; else { for(j=parent; node_nxt[j]>=node_arity[j] && j>=0; ){ j=node_back[j]; parent=j; # printf("//j=%3d parent=%3d\n",j,parent); } } pc++; } } if(args!=0) print "ERROR2 badly formed tree. Check arity1-4? args",args," i=",i," pc=",pc,inst[i]; print_label(0); for(p=0;p<pc;p++) { for(i=1;i<=node_arity[p];i++) { q=node_child[p,i]; print_label(q); printf("%s -> %s;\n",id(p),id(q)); } } print "}"; } function print_label(pc) { printf("%s [label=%s];\n",id(pc),node_name[pc]); } function id(pc) { return sprintf("n%03d",pc); } function arity(name) { t_ = sprintf(",%s,",name); # printf("//t_'%s'\n",t_); if(index(arity1,t_)>0) return 1; if(index(arity2,t_)>0) return 2; if(index(arity3,t_)>0) return 3; if(index(arity4,t_)>0) return 4; return 0; }
gp/mackey_glass/lisp2dat.awk
.
W.B.Langdon 27 August 2004 (24 June 2006)