This document discusses semantic analysis of C programs. It describes the stages of compiler design and focuses on the semantic analysis phase. The goals of semantic analysis are to check if the code forms sensible instructions, functions always return values, there are no unreachable statements, return types match function headers, and expressions are compatible with datatypes. The design of the system uses LEX, YACC, and Python to perform semantic analysis on an input C program and detect any semantic errors. Examples of semantic errors related to return values, unreachable code, and expression compatibility with datatypes are provided. Semantic analysis is important as it makes code more meaningful, flexible, and error-free while enabling more potential for optimization.