本文整理汇总了C++中ASTNode::getChild方法的典型用法代码示例。如果您正苦于以下问题:C++ ASTNode::getChild方法的具体用法?C++ ASTNode::getChild怎么用?C++ ASTNode::getChild使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ASTNode
的用法示例。
在下文中一共展示了ASTNode::getChild方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: UnitFormulaFormatter
/*
* Checks that the units of the function are consistent
* for a function returning value with same units as argument(s)
*
* If inconsistent units are found, an error message is logged.
*/
void
ArgumentsUnitsCheck::checkSameUnitsAsArgs (const Model& m,
const ASTNode& node,
const SBase & sb, bool inKL,
int reactNo)
{
/* check that node has children */
if (node.getNumChildren() == 0)
{
return;
}
UnitDefinition * ud;
UnitDefinition * tempUD = NULL;
unsigned int n;
unsigned int i = 0;
UnitFormulaFormatter *unitFormat = new UnitFormulaFormatter(&m);
ud = unitFormat->getUnitDefinition(node.getChild(i), inKL, reactNo);
/* get the first child that is not a parameter with undeclared units */
while (unitFormat->getContainsUndeclaredUnits() &&
i < node.getNumChildren()-1)
{
delete ud;
i++;
unitFormat->resetFlags();
ud = unitFormat->getUnitDefinition(node.getChild(i), inKL, reactNo);
}
/* check that all children have the same units
* unless one of the children is a parameter with undeclared units
* which is not tested */
for (n = i+1; n < node.getNumChildren(); n++)
{
unitFormat->resetFlags();
tempUD = unitFormat->getUnitDefinition(node.getChild(n), inKL, reactNo);
if (!unitFormat->getContainsUndeclaredUnits())
{
if (!UnitDefinition::areIdenticalSIUnits(ud, tempUD))
{
logInconsistentSameUnits(node, sb);
}
}
delete tempUD;
}
delete unitFormat;
delete ud;
for (n = 0; n < node.getNumChildren(); n++)
{
checkUnits(m, *node.getChild(n), sb, inKL, reactNo);
}
}
示例2: logMathConflict
/*
* Checks that the second argument of a piecewise returns a boolean
*
* If not, an error message is logged.
*/
void
PieceBooleanMathCheck::checkPiece (const Model& m, const ASTNode& node,
const SBase & sb)
{
unsigned int numChildren = node.getNumChildren();
unsigned int numPieces = numChildren;
if ((numChildren % 2) != 0) numPieces--;
for (unsigned int n = 1; n < numPieces; n += 2)
{
// if we have a mangled node for some reason
// usually we have read an incorrect node
// need to be sure there is a child
// NOTE: piecewise hits this issue because old behaviour
// meant it lost the piece and otherwise qualifiers
ASTNode * child = node.getChild(n);
if (child != NULL)
{
// need to pass the model here in case we have used a functionDefinition
// as the piece child
if (!child->returnsBoolean(&m))
{
logMathConflict(node, sb);
}
}
}
}
示例3: if
/**
* Constructor that makes a ConverterASTNode from an ASTNode.
*/
ConverterASTNode::ConverterASTNode(const ASTNode &templ): ASTNode(templ.getType())
{
if (this->getType() == AST_RATIONAL)
{
this->mDenominator = templ.getDenominator();
this->mInteger = templ.getNumerator();
}
else if (this->getType() == AST_REAL || this->getType() == AST_REAL_E)
{
this->mExponent = templ.getExponent();
this->mReal = templ.getMantissa();
}
if (this->getType() == AST_PLUS || this->getType() == AST_MINUS || this->getType() == AST_TIMES || this->getType() == AST_DIVIDE || this->getType() == AST_POWER)
{
this->mChar = templ.getCharacter();
}
else if (this->getType() == AST_INTEGER)
{
this->mInteger = templ.getInteger();
}
if ((!this->isOperator()) && (!this->isNumber()))
{
this->setName(templ.getName());
}
unsigned int counter;
for (counter = 0; counter < templ.getNumChildren(); counter++)
{
this->addChild(new ConverterASTNode(*templ.getChild(counter)));
}
};
示例4: UnitDefinition
/**
* Checks that the units of the arguments
* of the function are dimensionless
* and that there is only one argument
*
* If inconsistent units are found, an error message is logged.
*/
void
ArgumentsUnitsCheckWarnings::checkDimensionlessArgs (const Model& m,
const ASTNode& node,
const SBase & sb,
bool inKL, int reactNo)
{
/* check that node has children */
if (node.getNumChildren() == 0)
{
return;
}
UnitDefinition *dim = new UnitDefinition(m.getSBMLNamespaces());
Unit *unit = new Unit(m.getSBMLNamespaces());
unit->setKind(UNIT_KIND_DIMENSIONLESS);
unit->initDefaults();
UnitDefinition * tempUD;
dim->addUnit(unit);
UnitFormulaFormatter *unitFormat = new UnitFormulaFormatter(&m);
tempUD = unitFormat->getUnitDefinition(node.getChild(0), inKL, reactNo);
if (tempUD->getNumUnits() != 0 &&
!UnitDefinition::areEquivalent(dim, tempUD))
{
logInconsistentDimensionless(node, sb);
}
delete tempUD;
delete dim;
delete unit;
delete unitFormat;
}
示例5: if
/**
* Checks that the arguments of the branches of a piecewise are consistent
*
* If not, an error message is logged.
*/
void
PiecewiseValueMathCheck::checkPiecewiseArgs (const Model& m, const ASTNode& node,
const SBase & sb)
{
unsigned int numChildren = node.getNumChildren();
/* arguments must return consistent types */
for (unsigned int n = 0; n < numChildren; n += 2)
{
if (returnsNumeric(m, node.getChild(n)) &&
!returnsNumeric(m, node.getLeftChild()))
{
logMathConflict(node, sb);
}
else if (node.getChild(n)->isBoolean() &&
!node.getLeftChild()->isBoolean())
{
logMathConflict(node, sb);
}
}
}
示例6: checkSpecialCases
/**
* Checks that the functions have either one or two arguments
*/
void NumberArgsMathCheck::checkSpecialCases(const Model& m,
const ASTNode& node, const SBase & sb)
{
if (node.getNumChildren() < 1 || node.getNumChildren() > 2)
{
logMathConflict(node, sb);
}
for (unsigned int n = 0; n < node.getNumChildren(); n++)
{
checkMath(m, *node.getChild(n), sb);
}
}
示例7: hasUnambiguousPackageInfixGrammar
bool ArraysASTPlugin::hasUnambiguousPackageInfixGrammar(const ASTNode *child) const
{
ASTBase* function = const_cast<ASTBase*>(getParentASTObject());
if (function == NULL) return false;
if (function->getType() != AST_ORIGINATES_IN_PACKAGE) return false;
if (function->getPackageName() != "arrays") return false;
// cast the function to an ASTNode
ASTNode* newAST = dynamic_cast<ASTNode*>(function);
if (newAST == NULL)
{
return false;
}
const ArraysASTPlugin* aap = static_cast<const ArraysASTPlugin*>(function->getPlugin("arrays"));
switch(aap->getASTType()) {
case AST_LINEAR_ALGEBRA_SELECTOR:
if (newAST->getNumChildren() == 0) return true;
if (newAST->getChild(0) == child) return false; //The *first* child of the selector needs parentheses in some situations!
return true; //All other children are separated by commas, and thus don't need parentheses.
case AST_LINEAR_ALGEBRA_VECTOR_CONSTRUCTOR:
#if (0)
case AST_LINEAR_ALGEBRA_MATRIX_CONSTRUCTOR:
case AST_LINEAR_ALGEBRA_DETERMINANT:
case AST_LINEAR_ALGEBRA_TRANSPOSE:
case AST_LINEAR_ALGEBRA_VECTOR_PRODUCT:
case AST_LINEAR_ALGEBRA_SCALAR_PRODUCT:
case AST_LINEAR_ALGEBRA_OUTER_PRODUCT:
case AST_LINEAR_ALGEBRA_MATRIXROW_CONSTRUCTOR:
#endif
case AST_QUALIFIER_CONDITION:
case AST_LOGICAL_EXISTS:
case AST_LOGICAL_FORALL:
case AST_QUALIFIER_LOWLIMIT:
case AST_STATISTICS_MEAN:
case AST_STATISTICS_MEDIAN:
case AST_STATISTICS_MODE:
case AST_STATISTICS_MOMENT:
case AST_QUALIFIER_MOMENTABOUT:
case AST_SERIES_PRODUCT:
case AST_STATISTICS_SDEV:
case AST_SERIES_SUM:
case AST_QUALIFIER_UPLIMIT:
case AST_STATISTICS_VARIANCE:
return true; //Everything is either a function or has unambiguous syntax.
case AST_ARRAYS_UNKNOWN:
return false;
}
return false;
}
示例8: logMathConflict
/*
* Checks that the arguments of numeric functions are consistent
*
* If not, an error message is logged.
*/
void
NumericArgsMathCheck::checkNumericArgs (const Model& m, const ASTNode& node,
const SBase & sb)
{
unsigned int n;
for (n = 0; n < node.getNumChildren(); n++)
{
if (!returnsNumeric(m, node.getChild(n)))
{
logMathConflict(node, sb);
}
}
}
示例9: logMathConflict
/*
* Checks that the arguments to logical operators are all boolean
*
* If not, an error message is logged.
*/
void
LogicalArgsMathCheck::checkMathFromLogical (const Model&, const ASTNode& node,
const SBase & sb)
{
unsigned int n;
for (n = 0; n < node.getNumChildren(); n++)
{
if (!node.getChild(n)->isBoolean())
{
logMathConflict(node, sb);
}
}
}
示例10: getChild
ASTBase*
ASTLambdaFunctionNode::getChild (unsigned int n) const
{
/* HACK TO REPLICATE OLD AST */
/* do not return a node with the bvar type
* return the child of the bvar type
*/
if (ASTFunctionBase::getNumChildren() <= n)
{
return NULL;
}
if (ASTFunctionBase::getChild(n)->getType() == AST_QUALIFIER_BVAR)
{
ASTBase * base = ASTFunctionBase::getChild(n);
ASTNode * bvar = dynamic_cast<ASTNode*>(base);
//if (base->getFunction() != NULL)
//{
// bvar = static_cast<ASTFunction*>(base->getFunction());
//}
//else
//{
// bvar = static_cast<ASTFunction*>(base);
//}
if (bvar != NULL)
{
if (bvar->getNumChildren() > 0)
{
return bvar->getChild(0);
}
else
{
return NULL;
}
}
else
{
return NULL;
}
}
else
{
return ASTFunctionBase::getChild(n);
}
}
示例11: getChild
ASTBase*
ASTNaryFunctionNode::getChild (unsigned int n) const
{
if (this->getType() != AST_FUNCTION_ROOT)
{
return ASTFunctionBase::getChild(n);
}
else
{
/* HACK TO REPLICATE OLD AST */
/* do not return a node with the degree type
* return the child of the degree
*/
if (ASTFunctionBase::getNumChildren() <= n)
{
return NULL;
}
if (ASTFunctionBase::getChild(n)->getType() == AST_QUALIFIER_DEGREE)
{
ASTBase * base = ASTFunctionBase::getChild(n);
ASTNode * degree = dynamic_cast<ASTNode*>(base);
if (degree != NULL)
{
if (degree->getNumChildren() > 0)
{
return degree->getChild(0);
}
else
{
return NULL;
}
}
else
{
return NULL;
}
}
else
{
return ASTFunctionBase::getChild(n);
}
}
}
示例12: if
bool
ArraysASTPlugin::isWellFormedNode(int type) const
{
bool valid = hasCorrectNumberArguments(type);
ASTBase* function = const_cast<ASTBase*>(getMath());
// so getMath will only return teh node if it is a vector or matrix
if (function == NULL)
{
function = const_cast<ASTBase*>(getParentASTObject());
if (function == NULL)
{
return false;
}
}
// cast the function to an ASTNode
ASTNode * newAST = dynamic_cast<ASTNode*>(function);
// double check we are working with the right thing
if (newAST == NULL)
{
return false;
}
else if (newAST->getExtendedType() != type)
{
return false;
}
unsigned int numChildren = newAST->getNumChildren();
unsigned int i = 0;
// check number of arguments
while (valid && i < numChildren)
{
valid = newAST->getChild(i)->isWellFormedNode();
i++;
}
return valid;
}
示例13: ASTNode
pair<string, list<string> >
MMOMath::_generateAlgebraic (pair<list<string>, ASTNode*> function,
list<string> args, ASTNode *node)
{
ASTNode *repNode = new ASTNode (*function.second);
_processNode (repNode);
list<string>::iterator defArgs = function.first.begin ();
list<string> variables;
for (list<string>::iterator it = args.begin (); it != args.end (); it++)
{
repNode->renameSIdRefs (*defArgs, *it);
defArgs++;
}
string ret = MMOUtils::getInstance ()->getExp (repNode);
_getVariables (repNode, &variables);
int childs = node->getNumChildren (), i;
for (i = 0; i < childs; i++)
{
node->removeChild (0);
}
if (_type == MATH_ZERO_CROSSING)
{
node->setType (repNode->getType ());
childs = repNode->getNumChildren ();
for (i = 0; i < childs; i++)
{
node->addChild (new ASTNode (*repNode->getChild (i)));
}
}
else
{
node->setType (AST_NAME);
node->setName (ret.c_str ());
node->setId ("REPLACED_FUNCTION");
}
delete repNode;
return (pair<string, list<string> > (ret, variables));
}
示例14: logMathConflict
/*
* Checks that the second argument of a piecewise returns a boolean
*
* If not, an error message is logged.
*/
void
PieceBooleanMathCheck::checkPiece (const Model&, const ASTNode& node,
const SBase & sb)
{
unsigned int numChildren = node.getNumChildren();
unsigned int numPieces = numChildren;
#ifdef LIBSBML_USE_LEGACY_MATH
if ((numChildren % 2) != 0) numPieces--;
#else
numPieces = 2 * node.getNumPiece();
if (numPieces > numChildren)
{
// the piecewise is not correct
return;
}
#endif
for (unsigned int n = 1; n < numPieces; n += 2)
{
// if we have a mangled node for some reason
// usually we have read an incorrect node
// need to be sure there is a child
// NOTE: piecewise hits this issue because old behaviour
// meant it lost the piece and otherwise qualifiers
ASTNode * child = node.getChild(n);
if (child != NULL)
{
if (!child->returnsBoolean())
{
logMathConflict(node, sb);
}
}
}
}
示例15: visitMatrix
void ArraysASTPlugin::visitMatrix( const ASTNode *parent,
const ASTNode *node,
StringBuffer_t *sb,
const L3ParserSettings* settings) const
{
//Note: if there is one or zero rows, or if any of the rows have zero children, a matrix is declared as a function, and 'visitMatrix' won't be called.
unsigned int numChildren = node->getNumChildren();
StringBuffer_appendChar(sb, '{');
for (unsigned int child=0; child<numChildren; child++) {
ASTNode* row = node->getChild(child);
if (child>0) {
StringBuffer_appendChar(sb, ';');
StringBuffer_appendChar(sb, ' ');
}
for (unsigned int c2=0; c2<row->getNumChildren(); c2++) {
if (c2>0) {
StringBuffer_appendChar(sb, ',');
StringBuffer_appendChar(sb, ' ');
}
L3FormulaFormatter_visit(row, row->getChild(c2), sb, settings);
}
}
StringBuffer_appendChar(sb, '}');
}