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; }
/** Use the adaptor implementation to add a child node with the supplied token */ static void addChildToken (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_COMMON_TOKEN child) { if (t != NULL && child != NULL) { adaptor->addChild(adaptor, t, adaptor->create(adaptor, child)); } }
static pANTLR3_BASE_TREE dbgBecomeRootToken (pANTLR3_BASE_TREE_ADAPTOR adaptor, void * newRoot, pANTLR3_BASE_TREE oldRoot) { pANTLR3_BASE_TREE t; t = (pANTLR3_BASE_TREE)adaptor->becomeRoot(adaptor, adaptor->create(adaptor, (pANTLR3_COMMON_TOKEN)newRoot), oldRoot); adaptor->debugger->becomeRoot(adaptor->debugger,t, oldRoot); return t; }
static void dbgAddChildToken (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_COMMON_TOKEN child) { pANTLR3_BASE_TREE tc; if (t != NULL && child != NULL) { tc = (pANTLR3_BASE_TREE)adaptor->create(adaptor, child); adaptor->addChild(adaptor, t, tc); adaptor->debugger->addChild(adaptor->debugger, t, tc); } }
static pANTLR3_BASE_TREE createTypeText (pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_UINT8 text) { pANTLR3_COMMON_TOKEN fromToken; /* Create the new token */ fromToken = adaptor->createToken(adaptor, tokenType, text); /* Return a new node based upon this token */ return (pANTLR3_BASE_TREE)adaptor->create(adaptor, fromToken); }
/** Use the super class supplied create() method to create a new node * from the supplied token. */ static pANTLR3_BASE_TREE createTypeToken (pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken) { /* Create the new token */ fromToken = adaptor->createTokenFromToken(adaptor, fromToken); /* Set the type of the new token to that supplied */ fromToken->setType(fromToken, tokenType); /* Return a new node based upon this token */ return (pANTLR3_BASE_TREE)adaptor->create(adaptor, fromToken); }
static pANTLR3_BASE_TREE dbgNil (pANTLR3_BASE_TREE_ADAPTOR adaptor) { pANTLR3_BASE_TREE t; t = (pANTLR3_BASE_TREE)adaptor->create (adaptor, NULL); adaptor->debugger->createNode (adaptor->debugger, t); return t; }
/// Sends the required debugging events for duplicating a tree /// to the debugger. /// static void simulateTreeConstruction(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE tree) { ANTLR3_UINT32 n; ANTLR3_UINT32 i; pANTLR3_BASE_TREE child; // Send the create node event // adaptor->debugger->createNode(adaptor->debugger, tree); n = adaptor->getChildCount(adaptor, tree); for (i = 0; i < n; i++) { child = (pANTLR3_BASE_TREE)adaptor->getChild(adaptor, tree, i); simulateTreeConstruction(adaptor, child); adaptor->debugger->addChild(adaptor->debugger, tree, child); } }
static pANTLR3_BASE_TREE createTypeTokenText (pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken, pANTLR3_UINT8 text) { /* Create the new token */ fromToken = adaptor->createTokenFromToken(adaptor, fromToken); /* Set the type of the new token to that supplied */ fromToken->type = tokenType; /* Set the text of the token accordingly */ fromToken->setText8(fromToken, text); /* Return a new node based upon this token */ return adaptor->create(adaptor, fromToken); }
static pANTLR3_BASE_TREE errorNode (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_TOKEN_STREAM ctnstream, pANTLR3_COMMON_TOKEN startToken, pANTLR3_COMMON_TOKEN stopToken, pANTLR3_EXCEPTION e) { // Use the supplied common tree node stream to get another tree from the factory // TODO: Look at creating the erronode as in Java, but this is complicated by the // need to track and free the memory allocated to it, so for now, we just // want something in the tree that isn't a NULL pointer. // return adaptor->createTypeText(adaptor, ANTLR3_TOKEN_INVALID, (pANTLR3_UINT8)"Tree Error Node"); }
pANTLR3_BASE_TREE dupTreeTT (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_BASE_TREE parent) { pANTLR3_BASE_TREE newTree; pANTLR3_BASE_TREE child; pANTLR3_BASE_TREE newSubTree; ANTLR3_UINT32 n; ANTLR3_UINT32 i; if (t == NULL) { return NULL; } newTree = (pANTLR3_BASE_TREE)t->dupNode(t); // Ensure new subtree root has parent/child index set // adaptor->setChildIndex (adaptor, newTree, t->getChildIndex(t)); adaptor->setParent (adaptor, newTree, parent); n = adaptor->getChildCount (adaptor, t); for (i=0; i < n; i++) { child = (pANTLR3_BASE_TREE)adaptor->getChild (adaptor, t, i); newSubTree = (pANTLR3_BASE_TREE)adaptor->dupTreeTT (adaptor, child, t); adaptor->addChild (adaptor, newTree, newSubTree); } return newTree; }
pANTLR3_BASE_TREE dbgDupTree (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE tree) { pANTLR3_BASE_TREE t; // Call the normal dup tree mechanism first // t = (pANTLR3_BASE_TREE)adaptor->dupTreeTT(adaptor, tree, NULL); // In order to tell the debugger what we have just done, we now // simulate the tree building mechanism. THis will fire // lots of debugging events to the client and look like we // duped the tree.. // simulateTreeConstruction(adaptor, t); return t; }
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; }
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]; pANTLR3_STRING text; int j; // Next child // child = (pANTLR3_BASE_TREE)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 // text = adaptor->getText(adaptor, t); 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, " -> "); 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"); // Define edges for this child // defineDotEdges(adaptor, child, dotSpec); } // Done // return; }
/// 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; }
/** Use the adaptor interface to set a new tree node with the supplied token * to the root of the tree. */ static pANTLR3_BASE_TREE becomeRootToken (pANTLR3_BASE_TREE_ADAPTOR adaptor, void * newRoot, pANTLR3_BASE_TREE oldRoot) { return (pANTLR3_BASE_TREE)adaptor->becomeRoot(adaptor, adaptor->create(adaptor, (pANTLR3_COMMON_TOKEN)newRoot), oldRoot); }
/** Create and return a nil tree node (no token payload) */ static pANTLR3_BASE_TREE nilNode (pANTLR3_BASE_TREE_ADAPTOR adaptor) { return (pANTLR3_BASE_TREE)adaptor->create(adaptor, NULL); }
/** Return a duplicate of the entire tree (implementation provided by the * BASE_TREE interface.) */ static pANTLR3_BASE_TREE dupTree (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t) { return (pANTLR3_BASE_TREE)adaptor->dupTreeTT(adaptor, t, NULL); }