Fixed #1620 (tokenizer: simplify well known math functions)

This commit is contained in:
anuraggarg011 2012-09-03 18:51:15 +02:00 committed by Daniel Marjamäki
parent b156c727b0
commit bf11248a09
3 changed files with 66 additions and 0 deletions

View File

@ -1646,6 +1646,9 @@ bool Tokenizer::tokenize(std::istream &code,
// replace 'NULL' and similar '0'-defined macros with '0'
simplifyNull();
// replace 'sin(0)' to '0' and other similar math expressions
simplifyMathExpressions();
// combine "- %num%"
concatenateNegativeNumber();
@ -9218,6 +9221,32 @@ void Tokenizer::printUnknownTypes()
}
}
void Tokenizer::simplifyMathExpressions()
{
for (Token *tok = list.front(); tok; tok = tok->next()) {
if (Token::Match(tok,"exp ( 0 )") || Token::Match(tok,"cosh ( 0 )") || Token::Match(tok,"cos ( 0 )") || Token::Match(tok,"sqrt ( 1 )")) {
tok->deleteNext(3);
tok->str("1");
}
if (Token::Match(tok,"sinh ( 0 )") || Token::Match(tok,"sin ( 0 )") || Token::Match(tok,"sqrt ( 0 )") || Token::Match(tok,"ln ( 1 )")) {
tok->deleteNext(3);
tok->str("0");
}
if (Token::Match(tok,"pow ( sin ( %var% ) , 2 ) + pow ( cos ( %var% ) , 2 )")) {
tok->deleteNext(18);
tok->str("1");
}
if (Token::Match(tok,"pow ( sinh ( %var% ) , 2 ) - pow ( cosh ( %var% ) , 2 )")) {
tok->deleteNext(18);
tok->str("-1");
}
}
}
const std::string& Tokenizer::getSourceFilePath() const
{
if (list.getFiles().empty()) {

View File

@ -461,6 +461,11 @@ public:
*/
void simplifyMathFunctions();
/**
* Simplify e.g. 'sin(0)' into '0'
*/
void simplifyMathExpressions();
/**
* Modify strings in the token list by replacing hex and oct
* values. E.g. "\x61" -> "a" and "\000" -> "\0"

View File

@ -439,6 +439,8 @@ private:
TEST_CASE(platformWin64);
TEST_CASE(platformUnix32);
TEST_CASE(platformUnix64);
TEST_CASE(simplifyMathExpressions); //ticket #1620
}
std::string tokenizeAndStringify(const char code[], bool simplify = false, bool expand = true, Settings::PlatformType platform = Settings::Unspecified, const char* filename = "test.cpp", bool cpp11 = true) {
@ -7188,6 +7190,36 @@ private:
ASSERT_EQUALS(expected, tokenizeAndStringify(code, true, true, Settings::Unix64));
}
void simplifyMathExpressions() {//#1620
const char *code1 ="void foo() {\n"
"std::cout<<sin(0);\n"
"std::cout<<cos(0);\n"
"std::cout<<sinh(0);\n"
"std::cout<<cosh(0);\n"
"std::cout<<exp(0);\n"
"std::cout<<sqrt(0);\n"
"std::cout<<sqrt(1);\n"
"std::cout<<ln(1);\n"
"std::cout<<pow(sin(x),2)+pow(cos(x),2);\n"
"std::cout<<pow(sinh(x),2)-pow(cosh(x),2);\n"
"}";
const char *expected1 ="void foo ( ) {\n"
"std :: cout << 0 ;\n"
"std :: cout << 1 ;\n"
"std :: cout << 0 ;\n"
"std :: cout << 1 ;\n"
"std :: cout << 1 ;\n"
"std :: cout << 0 ;\n"
"std :: cout << 1 ;\n"
"std :: cout << 0 ;\n"
"std :: cout << 1 ;\n"
"std :: cout << -1 ;\n"
"}";
ASSERT_EQUALS(expected1, tokenizeAndStringify(code1));
}
};
REGISTER_TEST(TestTokenizer)