static void defineDotEdges(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * t, pANTLR3_STRING dotSpec) { // How many nodes are we talking about? // int nCount; int i; if (t == NULL) { // No tree, so do nothing // return; } // 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, define an edge from this parent, then process // and children of this child in the same way // for (i=0; i<nCount; i++) { pANTLR3_BASE_TREE child; char buff[128]; // Next child // child = adaptor->getChild(adaptor, t, i); // Create the edge relation // sprintf(buff, "\t\tn%p -> n%p\t\t// ", t, child); dotSpec->append8(dotSpec, buff); // Document the relationship // dotSpec->appendS(dotSpec, adaptor->getText(adaptor, t)); dotSpec->append8(dotSpec, " -> "); dotSpec->appendS(dotSpec, adaptor->getText(adaptor, child)); dotSpec->append8(dotSpec, "\n"); // Define edges for this child // defineDotEdges(adaptor, child, dotSpec); } // Done // return; }
static void toStringWork (pANTLR3_TREE_NODE_STREAM tns, pANTLR3_BASE_TREE p, pANTLR3_BASE_TREE stop, pANTLR3_STRING buf) { ANTLR3_UINT32 n; ANTLR3_UINT32 c; if (!p->isNilNode(p) ) { pANTLR3_STRING text; text = p->toString(p); if (text == NULL) { text = tns->ctns->stringFactory->newRaw(tns->ctns->stringFactory); text->addc (text, ' '); text->addi (text, p->getType(p)); } buf->appendS(buf, text); } if (p == stop) { return; /* Finished */ } n = p->getChildCount(p); if (n > 0 && ! p->isNilNode(p) ) { buf->addc (buf, ' '); buf->addi (buf, ANTLR3_TOKEN_DOWN); } for (c = 0; c<n ; c++) { pANTLR3_BASE_TREE child; child = p->getChild(p, c); tns->toStringWork(tns, child, stop, buf); } if (n > 0 && ! p->isNilNode(p) ) { buf->addc (buf, ' '); buf->addi (buf, ANTLR3_TOKEN_UP); } }