//--------------------------------------------------------------------------- void __fastcall TCDirectoryOutline::BuildSubTree(long RootItem) { BuildOneLevel(RootItem); TOutlineNode *RootNode = Items[RootItem]; for (long TempRoot = RootNode->getFirstChild(); TempRoot != InvalidIndex; TempRoot = RootNode->GetNextChild(TempRoot)) BuildSubTree(TempRoot); }
float Parser::BuildSubTree(ExpressionInterval expression, int delimiter) { int k = expression._start; bool isFound = false; float lhs = 0, rhs = 0, result = 0; if(delimiter < _operators.size() && (expression._end < strlen(_inputString) && expression._start <= expression._end)) { while(k <= expression._end && isFound == false) { if(StrCompare(_inputString+k, _operators[delimiter]->_symbol,1)) { switch(_operators[delimiter]->_arity) { case 2: lhs = BuildSubTree(ExpressionInterval(expression._start,k-1),delimiter+1); break; case 1: default: break; } rhs = BuildSubTree(ExpressionInterval(k+1,expression._end),0); isFound = true; } k++; } if(!isFound) { result = BuildSubTree(expression,delimiter+1); } else { result = _operators[delimiter]->Fire(lhs,rhs); } } else { result = Leaf(expression); } return result; }
float Parser::ParseInput(char *in) { NewInput(in); unsigned len = strlen(in); float solution; if(len>1) { solution = BuildSubTree(ExpressionInterval(0,len-1),0); } else if(len == 1) { solution = Leaf(ExpressionInterval(0,0)); } return solution; }