tokenizer: simplify redundant paranthesis

This commit is contained in:
Daniel Marjamäki 2009-01-26 16:38:08 +00:00
parent 9fb11bbfcc
commit ca0f007ca4
3 changed files with 187 additions and 147 deletions

View File

@ -915,6 +915,7 @@ void Tokenizer::simplifyTokenList()
modified |= simplifyFunctionReturn(); modified |= simplifyFunctionReturn();
modified |= simplifyKnownVariables(); modified |= simplifyKnownVariables();
modified |= removeReduntantConditions(); modified |= removeReduntantConditions();
modified |= simplifyRedundantParanthesis();
} }
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -1367,6 +1368,39 @@ bool Tokenizer::simplifyKnownVariables()
return ret; return ret;
} }
bool Tokenizer::simplifyRedundantParanthesis()
{
bool ret = false;
for (Token *tok = _tokens; tok; tok = tok->next())
{
if (Token::simpleMatch(tok, "( ("))
{
int parlevel = 0;
for (Token *tok2 = tok; tok2; tok2 = tok2->next())
{
if (tok2->str() == "(")
++parlevel;
else if (tok2->str() == ")")
{
--parlevel;
if (parlevel == 1)
{
if (Token::simpleMatch(tok2, ") )"))
{
tok->deleteNext();
tok2->deleteNext();
}
break;
}
}
}
}
}
return ret;
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Helper functions for handling the tokens list // Helper functions for handling the tokens list
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@ -1,146 +1,152 @@
/* /*
* Cppcheck - A tool for static C/C++ code analysis * Cppcheck - A tool for static C/C++ code analysis
* Copyright (C) 2007-2009 Daniel Marjamäki, Reijo Tomperi, Nicolas Le Cam, * Copyright (C) 2007-2009 Daniel Marjamäki, Reijo Tomperi, Nicolas Le Cam,
* Leandro Penz, Kimmo Varis * Leandro Penz, Kimmo Varis
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/ * along with this program. If not, see <http://www.gnu.org/licenses/
*/ */
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
#ifndef tokenizeH #ifndef tokenizeH
#define tokenizeH #define tokenizeH
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
#include <list> #include <list>
#include <string> #include <string>
#include <map> #include <map>
#include <vector> #include <vector>
#include "settings.h" #include "settings.h"
#include "errorlogger.h" #include "errorlogger.h"
#include "token.h" #include "token.h"
class Tokenizer class Tokenizer
{ {
private: private:
// Deallocate lists.. // Deallocate lists..
void DeallocateTokens(); void DeallocateTokens();
public: public:
Tokenizer(); Tokenizer();
~Tokenizer(); ~Tokenizer();
/** /**
* Tokenize code * Tokenize code
* @param code input stream for code * @param code input stream for code
* @param FileName The filename * @param FileName The filename
*/ */
void tokenize(std::istream &code, const char FileName[]); void tokenize(std::istream &code, const char FileName[]);
/** Set variable id */ /** Set variable id */
void setVarId(); void setVarId();
/** Simplify tokenlist */ /** Simplify tokenlist */
void simplifyTokenList(); void simplifyTokenList();
// Helper functions for handling the tokens list.. // Helper functions for handling the tokens list..
static void deleteTokens(Token *tok); static void deleteTokens(Token *tok);
static const char *getParameterName(const Token *ftok, int par); static const char *getParameterName(const Token *ftok, int par);
static bool SameFileName(const char fname1[], const char fname2[]); static bool SameFileName(const char fname1[], const char fname2[]);
std::string fileLine(const Token *tok) const; std::string fileLine(const Token *tok) const;
// Return size. // Return size.
int SizeOfType(const char type[]) const; int SizeOfType(const char type[]) const;
void initTokens(); void initTokens();
const std::vector<std::string> *getFiles() const; const std::vector<std::string> *getFiles() const;
void fillFunctionList(); void fillFunctionList();
const Token *GetFunctionTokenByName(const char funcname[]) const; const Token *GetFunctionTokenByName(const char funcname[]) const;
const Token *tokens() const; const Token *tokens() const;
#ifndef UNIT_TESTING #ifndef UNIT_TESTING
private: private:
#endif #endif
/** /**
* Finds matching "end" for "start". * Finds matching "end" for "start".
* @param tok The start tag * @param tok The start tag
* @param start e.g. "{" * @param start e.g. "{"
* @param end e.g. "}" * @param end e.g. "}"
* @return The end tag that matches given parameter or 0 if not found. * @return The end tag that matches given parameter or 0 if not found.
*/ */
static const Token *findClosing(const Token *tok, const char *start, const char *end); static const Token *findClosing(const Token *tok, const char *start, const char *end);
void addtoken(const char str[], const unsigned int lineno, const unsigned int fileno); void addtoken(const char str[], const unsigned int lineno, const unsigned int fileno);
/** Add braces to an if-block /** Add braces to an if-block
* @return true if something is modified * @return true if something is modified
* false if nothing is done. * false if nothing is done.
*/ */
bool simplifyIfAddBraces(); bool simplifyIfAddBraces();
/** Simplify conditions /** Simplify conditions
* @return true if something is modified * @return true if something is modified
* false if nothing is done. * false if nothing is done.
*/ */
bool simplifyConditions(); bool simplifyConditions();
/** Remove reduntant code, e.g. if( false ) { int a; } should be /** Remove reduntant code, e.g. if( false ) { int a; } should be
* removed, because it is never executed. * removed, because it is never executed.
* @return true if something is modified * @return true if something is modified
* false if nothing is done. * false if nothing is done.
*/ */
bool removeReduntantConditions(); bool removeReduntantConditions();
/** Simplify casts /** Simplify casts
* @return true if something is modified * @return true if something is modified
* false if nothing is done. * false if nothing is done.
*/ */
bool simplifyCasts(); bool simplifyCasts();
/** Simplify function calls - constant return value /** Simplify function calls - constant return value
* @return true if something is modified * @return true if something is modified
* false if nothing is done. * false if nothing is done.
*/ */
bool simplifyFunctionReturn(); bool simplifyFunctionReturn();
/** /**
* A simplify function that replaces a variable with its value in cases * A simplify function that replaces a variable with its value in cases
* when the value is known. e.g. "x=10; if(x)" => "x=10;if(10)" * when the value is known. e.g. "x=10; if(x)" => "x=10;if(10)"
* *
* @param token The token list to check and modify. * @return true if modifications to token-list are done.
* @return true if modifications to token-list are done. * false if no modifications are done.
* false if no modifications are done. */
*/ bool simplifyKnownVariables();
bool simplifyKnownVariables();
/**
void InsertTokens(Token *dest, Token *src, unsigned int n); * Remove redundant paranthesis: "((x))" => "(x)"
* @return true if modifications to token-list are done.
Token *_tokensBack; * false if no modifications are done.
std::map<std::string, unsigned int> _typeSize; */
std::vector<const Token *> _functionList; bool simplifyRedundantParanthesis();
std::vector<std::string> _files;
Token *_tokens; void InsertTokens(Token *dest, Token *src, unsigned int n);
};
Token *_tokensBack;
//--------------------------------------------------------------------------- std::map<std::string, unsigned int> _typeSize;
#endif std::vector<const Token *> _functionList;
std::vector<std::string> _files;
Token *_tokens;
};
//---------------------------------------------------------------------------
#endif

View File

@ -75,7 +75,7 @@ private:
// TODO TEST_CASE(simplify_function_parameters); // TODO TEST_CASE(simplify_function_parameters);
// TODO TEST_CASE(reduce_redundant_paranthesis); // Ticket #61 TEST_CASE(reduce_redundant_paranthesis); // Ticket #61
} }