I. Introduction
Software maintenance is a crucial activity in the software development life cycle. Boehm [2] found through his research that the maintenance costs can be up to ten times those of an initial development and also Parikh and Zvegintzov [12] pointed out that it consumes 50% of all computer and human resources. Due to the increase in the complexity and size of the software systems, maintenance has become a challenging issue for software engineers. The situation becomes awful, when the software lacks proper documentation on the changes that are performed during system evolution. As a consequence, it becomes practically difficult to maintain the software in future. The replacement of such software with a new one is also not a feasible option, as it does not guarantee the full functionality. The practices such as reverse engineering and reengineering have emerged to handle such software systems. As the source code is the only exact replication of the system available to software developers and maintainers, the reverse engineering community is working towards the development of methods to extract the high-level structural information from the source code directly. Such methods are inclined to focus on design recovery through software clustering, program slicing, source code analysis etc.