/// Produce a DOT specification for graphviz // static pANTLR3_STRING makeDot (pANTLR3_BASE_TREE_ADAPTOR adaptor, void * theTree) { // The string we are building up // pANTLR3_STRING dotSpec; dotSpec = adaptor->strFactory->newStr ( adaptor->strFactory, // Default look and feel // (pANTLR3_UINT8) "digraph {\n\n" "\tordering=out;\n" "\tranksep=.4;\n" "\tbgcolor=\"lightgrey\"; node [shape=box, fixedsize=false, fontsize=12, fontname=\"Helvetica-bold\", fontcolor=\"blue\"\n" "\twidth=.25, height=.25, color=\"black\", fillcolor=\"white\", style=\"filled, solid, bold\"];\n\n" "\tedge [arrowsize=.5, color=\"black\", style=\"bold\"]\n\n" ); // First produce the node defintions // defineDotNodes(adaptor, theTree, dotSpec); dotSpec->append8(dotSpec, "\n"); defineDotEdges(adaptor, theTree, dotSpec); // Terminate the spec // dotSpec->append8(dotSpec, "\n}"); // Result // return dotSpec; }
/// Produce a DOT specification for graphviz // static pANTLR3_STRING makeDot (pANTLR3_BASE_TREE_ADAPTOR adaptor, void * theTree) { // The string we are building up // pANTLR3_STRING dotSpec; char buff[64]; pANTLR3_STRING text; int j; dotSpec = adaptor->strFactory->newStr8 ( adaptor->strFactory, // Default look and feel // (pANTLR3_UINT8) "digraph {\n\n" "\tordering=out;\n" "\tranksep=.4;\n" "\tbgcolor=\"lightgrey\"; node [shape=box, fixedsize=false, fontsize=12, fontname=\"Helvetica-bold\", fontcolor=\"blue\"\n" "\twidth=.25, height=.25, color=\"black\", fillcolor=\"white\", style=\"filled, solid, bold\"];\n\n" "\tedge [arrowsize=.5, color=\"black\", style=\"bold\"]\n\n" ); if (theTree == NULL) { // No tree, so create a blank spec // dotSpec->append8(dotSpec, "n0[label=\"EMPTY TREE\"]\n"); return dotSpec; } sprintf(buff, "\tn%p[label=\"", theTree); dotSpec->append8(dotSpec, buff); text = adaptor->getText(adaptor, theTree); for (j = 0; j < (ANTLR3_INT32)(text->len); j++) { switch(text->charAt(text, j)) { case '"': dotSpec->append8(dotSpec, "\\\""); break; case '\n': dotSpec->append8(dotSpec, "\\n"); break; case '\r': dotSpec->append8(dotSpec, "\\r"); break; default: dotSpec->addc(dotSpec, text->charAt(text, j)); break; } } dotSpec->append8(dotSpec, "\"]\n"); // First produce the node defintions // defineDotNodes(adaptor, theTree, dotSpec); dotSpec->append8(dotSpec, "\n"); defineDotEdges(adaptor, theTree, dotSpec); // Terminate the spec // dotSpec->append8(dotSpec, "\n}"); // Result // return dotSpec; }
static void defineDotNodes(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * t, pANTLR3_STRING dotSpec ) { // How many nodes are we talking about? // int nCount; int i; pANTLR3_BASE_TREE child; char buff[64]; pANTLR3_STRING text; int j; // Count the nodes // nCount = adaptor->getChildCount(adaptor, t); if (nCount == 0) { // This will already have been included as a child of another node // so there is nothing to add. // return; } // For each child of the current tree, define a node using the // memory address of the node to name it // for (i = 0; i<nCount; i++) { // Pick up a pointer for the child // child = (pANTLR3_BASE_TREE)adaptor->getChild(adaptor, t, i); // Name the node // sprintf(buff, "\tn%p[label=\"", child); dotSpec->append8(dotSpec, buff); text = adaptor->getText(adaptor, child); for (j = 0; j < (ANTLR3_INT32)(text->len); j++) { switch(text->charAt(text, j)) { case '"': dotSpec->append8(dotSpec, "\\\""); break; case '\n': dotSpec->append8(dotSpec, "\\n"); break; case '\r': dotSpec->append8(dotSpec, "\\r"); break; default: dotSpec->addc(dotSpec, text->charAt(text, j)); break; } } dotSpec->append8(dotSpec, "\"]\n"); // And now define the children of this child (if any) // defineDotNodes(adaptor, child, dotSpec); } // Done // return; }