static void checkConstruct(const std::string &ts) { vector<int> inorder, postorder; std::stringstream is(ts); std::stringstream os; BTreeBase<int> tree; //construct tree from string is >> tree; //get traval path traval_tree(tree.root(), inorder, true); traval_tree(tree.root(), postorder, false); //construct tree by inorder and postorder path Solution sol; BTreeBase<int> ctree( sol.buildTree(inorder, postorder)); //convert tree to string os << ctree; //check result std::string ss = os.str(); EXPECT_EQ(ts, ss); }
QString Expression::processConstant( const QString & expr, bool * isConstant ) { bool temp; if (!isConstant) isConstant = &temp; QString code; // Make a tree to put the expression in. BTreeBase *tree = new BTreeBase(); BTreeNode *root = new BTreeNode(); // parse the expression into the tree buildTree(expr,tree,root,0); // compile the tree into assembly code tree->setRoot(root); tree->pruneTree(tree->root()); //code = traverseTree(tree->root()); // Look to see if it is a number if( root->type() == number ) { code = root->value(); *isConstant = true; } else { code = ""; *isConstant = false; } // Note deleting the tree deletes all nodes, so the root // doesn't need deleting separately. delete tree; return code; }
void Expression::compileExpression( const QString & expression ) { // Make a tree to put the expression in. BTreeBase *tree = new BTreeBase(); BTreeNode *root = new BTreeNode(); // parse the expression into the tree buildTree(expression,tree,root,0); // compile the tree into assembly code tree->setRoot(root); tree->pruneTree(tree->root()); traverseTree(tree->root()); // Note deleting the tree deletes all nodes, so the root // doesn't need deleting separately. delete tree; return; }
void Expression::compileConditional( const QString & expression, Code * ifCode, Code * elseCode ) { if( expression.contains(QRegExp("=>|=<|=!")) ) { mistake( Microbe::InvalidComparison, expression ); return; } if( expression.contains(QRegExp("[^=><!][=][^=]"))) { mistake( Microbe::InvalidEquals ); return; } // Make a tree to put the expression in. BTreeBase *tree = new BTreeBase(); BTreeNode *root = new BTreeNode(); // parse the expression into the tree buildTree(expression,tree,root,0); // Modify the tree so it is always at the top level of the form (kwoerpkwoep) == (qwopekqpowekp) if ( root->childOp() != equals && root->childOp() != notequals && root->childOp() != gt && root->childOp() != lt && root->childOp() != ge && root->childOp() != le && root->childOp() != pin && root->childOp() != notpin && root->childOp() != read_keypad ) { BTreeNode *newRoot = new BTreeNode(); BTreeNode *oneNode = new BTreeNode(); oneNode->setChildOp(noop); oneNode->setType(number); oneNode->setValue("1"); newRoot->setLeft(root); newRoot->setRight(oneNode); newRoot->setType(unset); newRoot->setChildOp(ge); tree->setRoot(newRoot); root = newRoot; } // compile the tree into assembly code tree->setRoot(root); tree->pruneTree(tree->root(),true); // We might have just a constant expression, in which case we can just always do if or else depending // on whether it is true or false. if( root->childOp() == noop ) { if( root->value().toInt() == 0 ) m_pic->mergeCode( elseCode ); else m_pic->mergeCode( ifCode ); return; } // traverse tree with argument conditionalRoot true // so that 3 == x gets integrated with code for if, repeat until etc... m_ifCode = ifCode; m_elseCode = elseCode; traverseTree(tree->root(),true); // Note deleting the tree deletes all nodes, so the root // doesn't need deleting separately. delete tree; }