void SRExpressionsParser::logicalAnd(double* r) { double t = 0; Token op; bitwiseOr(r); op=token; while((!strcmp(op.value(),"&&"))) { parse(); bitwiseOr(&t); if (!strcmp(op.value(),"&&")) *r = (int)*r && (int)t; } }
/** * Evaluates a logical and expression (a && b) by recursively calling the * functions for evaluating expressions with higher precedence. * * @param[out] ret: the integer value the logical and expression evaluates to * * @return: whether at the current location the expression can be evaluated */ bool MacroParser::logicalAnd(int64_t *ret) { int64_t term2 = 0; if (bitwiseOr(ret)) { for (;;) { if (_scanner.atSymbol(AND_AND)) { if (bitwiseOr(&term2)) { *ret = *ret && term2; } else { return false; } } else { return true; } } } return false; }
void matchOr() { givenACodeSampleToTokenize bitwiseOr("|"); ASSERT_EQUALS(true, Token::Match(bitwiseOr.tokens(), "%or%")); givenACodeSampleToTokenize logicalOr("||"); ASSERT_EQUALS(true, Token::Match(logicalOr.tokens(), "%oror%")); ASSERT_EQUALS(false, Token::Match(logicalOr.tokens(), "%or%")); ASSERT_EQUALS(false, Token::Match(bitwiseOr.tokens(), "%oror%")); ASSERT_EQUALS(true, Token::Match(logicalOr.tokens(), "&&|%oror%")); ASSERT_EQUALS(true, Token::Match(logicalOr.tokens(), "%oror%|&&")); }
void matchOr() const { givenACodeSampleToTokenize bitwiseOr("|", true); ASSERT_EQUALS(true, Token::Match(bitwiseOr.tokens(), "%or%")); ASSERT_EQUALS(true, Token::Match(bitwiseOr.tokens(), "%op%")); ASSERT_EQUALS(false, Token::Match(bitwiseOr.tokens(), "%oror%")); givenACodeSampleToTokenize bitwiseOrAssignment("|="); ASSERT_EQUALS(false, Token::Match(bitwiseOrAssignment.tokens(), "%or%")); ASSERT_EQUALS(true, Token::Match(bitwiseOrAssignment.tokens(), "%op%")); ASSERT_EQUALS(false, Token::Match(bitwiseOrAssignment.tokens(), "%oror%")); givenACodeSampleToTokenize logicalOr("||", true); ASSERT_EQUALS(false, Token::Match(logicalOr.tokens(), "%or%")); ASSERT_EQUALS(true, Token::Match(logicalOr.tokens(), "%op%")); ASSERT_EQUALS(true, Token::Match(logicalOr.tokens(), "%oror%")); ASSERT_EQUALS(true, Token::Match(logicalOr.tokens(), "&&|%oror%")); ASSERT_EQUALS(true, Token::Match(logicalOr.tokens(), "%oror%|&&")); givenACodeSampleToTokenize logicalAnd("&&", true); ASSERT_EQUALS(true, Token::simpleMatch(logicalAnd.tokens(), "&&")); ASSERT_EQUALS(true, Token::Match(logicalAnd.tokens(), "&&|%oror%")); ASSERT_EQUALS(true, Token::Match(logicalAnd.tokens(), "%oror%|&&")); }