A Full-Featured Compiler with Advanced Code Quality Analysis
This is a complete Mini Compiler project for CSE 430 (Compiler Design Lab) at University of Asia Pacific. The compiler implements all phases of compilation from lexical analysis to code generation, with a unique Code Quality Analyzer feature that provides automatic code quality assessment.
- Developed by: Nazmul Hoosain Nadim (ID: 22101203)
- Submitted to: Md. Shaiful Islam Ph.D., Assistant Professor, CSE Department
- Institution: University of Asia Pacific
- Phase 1: Lexical Analysis (Tokenization)
- Phase 2-4: Parser & Semantic Analysis
- Phase 5: Code Generation (Intel 8086 Assembly)
- Phase 6: GUI Interface
- Phase 7: Code Quality Analyzer ⭐ (Main Feature!)
The Code Quality Analyzer automatically detects and reports:
- Division by Zero - Detects literal zero divisions that will crash the program
- Dead Code - Identifies unreachable code after unconditional jumps/returns
- Infinite Loops - Detects loops with unchanging conditions using data-flow analysis
- Type Mismatches - Catches int/float type inconsistencies
- Duplicate Code - Finds repeated instruction sequences (3+ consecutive instructions)
- Write-Only Variables - Variables assigned but never used
- Overwritten Values - Values overwritten before being read
- Deeply Nested Conditions - Warns about >2 levels of nesting
- Naming Issues - Single-letter names, ALL_CAPS, very long names
- Performance Tips - Multiplication by 2 (use bit-shift), division by powers of 2, print() in loops
- Function Call Depth - Reports function definitions and call hierarchies, detects recursion
- Deduction Formula:
- Each Error: -15 points
- Each Warning: -7 points
- Each Suggestion: -2 points
- Each Unused Variable: -3 points
- Grade Scale: A (90+), B (80+), C (70+), D (55+), F (<55)
┌──────────────────────────┐
│ RAW SOURCE CODE │ (Your code)
└────────────┬─────────────┘
│
▼
┌──────────────────────────────────────────────────────┐
│ PHASE 1: LEXER (lexer.py) │
│ ├─ Input: Source code string │
│ ├─ Process: Tokenization using regex patterns │
│ └─ Output: Token stream (INT, ID, NUMBER, etc) │
└────────────┬──────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────┐
│ PHASE 2-4: PARSER (parser.py) │
│ ├─ Input: Tokens from Lexer │
│ ├─ Process: BNF Grammar parsing, semantic analysis │
│ └─ Output: ├─ Symbol Table (all variables info) │
│ └─ 3-Address Code (intermediate code) │
└────────────┬──────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────┐
│ PHASE 5: CODE GENERATOR (code_generator.py) │
│ ├─ Input: 3-Address Code │
│ ├─ Process: Convert to Intel 8086 Assembly │
│ └─ Output: Assembly language code │
└────────────┬──────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────┐
│ PHASE 7: CODE QUALITY ANALYZER ⭐ (timeline.py) │
│ ├─ Input: Symbol Table + 3AC Code │
│ ├─ Process: Multi-level analysis (data-flow, │
│ │ control-flow, patterns) │
│ └─ Output: Quality report with 0-100 score │
└────────────┬──────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────┐
│ GUI (gui.py) - Display All Phases │
│ Tabs: Tokens | Symbol Table | 3AC | Assembly | │
│ Diagnostics | Quality Report │
└──────────────────────────────────────────────────────┘
# Build complete variable statistics from Symbol Table + 3AC
var_tracker = {
'variable_name': {
'type': 'int',
'times_read': 5,
'times_written': 2,
'used': True,
'first_write_line': 15
}
}Source: Extracted from parser_obj.symbol_table and parser_obj.intermediate_code
The analyzer traces how variables flow through the code:
- Tracks each assignment (write)
- Tracks each usage (read)
- Traces temporary variables back to original user variables
- Detects which variables affect loop conditions
🔴 Error Check Examples:
-
Division by Zero Detection
for instr in intermediate_code: if instr['op'] == '/' and instr['arg2'] == 0: report_error("DIVISION BY ZERO")
- Based on: Direct 3AC instruction analysis
- Example:
result = x / 0→ ERROR
-
Infinite Loop Detection
# Find backward jumps (loops) for goto in ic: if goto['target'] < goto['index']: # backward jump loop_body = ic[loop_start : goto] cond_var = extract_condition(loop_body) if cond_var_not_modified(loop_body): report_error("INFINITE LOOP")
- Based on: Data-flow + Control-flow analysis
- Example:
while(x < 5) { print(x); }(x never changes) → ERROR
-
Dead Code Detection
for instr in ic: if instr['op'] in ('return', 'goto'): if next_instr not in ('label', 'func_start'): report_error("DEAD CODE")
- Based on: Control-flow analysis
- Example: Code after return statement → ERROR
🟡 Warning Examples:
-
Write-Only Variables
for var in var_tracker: if var['times_written'] > 0 and var['times_read'] == 0: report_warning("WRITE-ONLY: " + var)
-
Duplicate Code
# Match instruction patterns for start in range(len(instructions)): pattern = instructions[start : start+3] if pattern_seen_before(pattern): report_warning("DUPLICATE CODE")
score = 100
score -= len(errors) * 15 # -15 per error
score -= len(warnings) * 7 # -7 per warning
score -= len(suggestions) * 2 # -2 per suggestion
score -= len(unused_vars) * 3 # -3 per unused var
score = max(0, score) # Floor at 0
if score >= 90: grade = 'A'
elif score >= 80: grade = 'B'
elif score >= 70: grade = 'C'
elif score >= 55: grade = 'D'
else: grade = 'F'mini_compiler_project/
├── main.py # Entry point
├── gui.py # GUI interface (Phase 6)
├── lexer.py # Phase 1: Lexical Analysis
├── parser.py # Phases 2-4: Parsing & Semantic
├── symbol_table.py # Symbol table management
├── code_generator.py # Phase 5: Code Generation
├── timeline.py # Phase 7: Code Quality Analyzer ⭐
├── passcode.txt # Sample perfect code (100% score)
├── git-readme # This file
└── .venv/ # Virtual environment
| File | Phase | Purpose |
|---|---|---|
lexer.py |
1 | Tokenizes source code into token stream |
parser.py |
2-4 | Parses tokens, builds symbol table, generates 3AC |
symbol_table.py |
2-4 | Manages variable information (type, scope, etc) |
code_generator.py |
5 | Converts 3AC to Intel 8086 Assembly |
timeline.py |
7 | Code Quality Analyzer - main feature! |
gui.py |
6 | Displays all compilation phases in tabs |
- Python 3.8+
- tkinter (usually included with Python)
- PLY (Python Lex-Yacc) library
# Clone or download the project
cd mini-compiler
# Create virtual environment
python3 -m venv .venv
# Activate virtual environment
source .venv/bin/activate # On Windows: .venv\Scripts\activate
# Install dependencies
pip install ply
# Run the compiler
python main.pypython main.py- Write or paste code in the left panel
- Click "Compile" button
- View results in tabs:
- Tokens - Lexical analysis output
- Symbol Table - All declared variables
- 3AC - Intermediate code representation
- Assembly - Generated 8086 assembly
- Diagnostics - Compilation errors (if any)
- Quality Report - Code quality analysis ⭐
int principal;
int rate;
int year;
int compound_interest;
int total_amount;
principal = 1000;
rate = 5;
year = 2;
compound_interest = principal * rate;
total_amount = compound_interest + principal;
total_amount = total_amount * year;
print(total_amount);
int count;
count = 0;
while(count < 3) {
count = count + 1;
}
print(count);
if(total_amount > 1000) {
print(total_amount);
}
int result;
result = principal + rate;
print(result);Score: 98/100 | Grade: A ✅
int- Integer variables
if (condition) { ... }if (condition) { ... } else { ... }while (condition) { ... }for (int i = 0; i < n; i = i + 1) { ... }
- Arithmetic:
+,-,*,/,% - Comparison:
<,<=,>,>=,==,!= - Assignment:
=
- Function declaration:
func int name(int param1, int param2) { ... return x; } - Function calls:
result = function(arg1, arg2);
print(variable)- Output values
int x;
int y;
x = 10;
y = 20;
int result;
result = x / 0;
while(x < 5) {
print(x);
}Phase 1 (Lexer):
Tokens: INT, ID(x), SEMICOLON, INT, ID(y), SEMICOLON, ...
Phase 2-4 (Parser):
Symbol Table:
x: int, global, read=1, write=1
y: int, global, read=0, write=1
result: int, global, read=0, write=1
3AC Code:
(1) t1 = 10
(2) x = t1
(3) t2 = 20
(4) y = t2
(5) t3 = x / 0 ← Division by zero!
(6) result = t3
(7) L1: if_false (x < 5) goto L2
(8) print(x)
(9) goto L1 ← Infinite loop!
(10) L2: ...
Phase 7 (Quality Analyzer):
🔴 ERRORS (2 found) [-15 pts each]
[1] DIVISION BY ZERO (line 6): 't3 = x / 0'
[2] INFINITE LOOP (line 7): Loop condition depends on 'x',
but loop body never updates it
🟡 WARNINGS (0 found)
🟢 SUGGESTIONS (1 found) [-2 pts each]
[1] Single-letter variable 'x' - use descriptive name
📊 SCORE CALCULATION:
100 - (2 errors × 15) - (0 warnings × 7) - (1 suggestion × 2)
= 100 - 30 - 0 - 2
= 68/100 (Grade D)
- Perfect Code (98/100) - In
passcode.txt - Custom code - Write your own in the GUI
| Check | Input Source | Analysis Type |
|---|---|---|
| Dead Code | 3AC Code (control-flow) | Pattern matching |
| Infinite Loop | 3AC + Data-flow | Graph analysis |
| Division by Zero | 3AC (literals) | Direct detection |
| Duplicate Code | 3AC (instructions) | Pattern matching |
| Write-only Vars | var_tracker | Statistics |
| Naming Issues | Symbol Table | Pattern matching |
| Performance | 3AC | Pattern recognition |
| Call Depth | 3AC (func markers) | Graph building |
- Data-Flow Analysis - Traces how variables flow through code
- Control-Flow Analysis - Tracks program execution paths
- Pattern Matching - Identifies code patterns and issues
- Static Analysis - All analysis done at compile-time
- Comprehensive Quality Analyzer - Not just syntax checking, but semantic and quality analysis
- Data-Flow Tracking - Advanced technique to trace variable usage patterns
- Infinite Loop Detection - Sophisticated algorithm to detect non-terminating loops
- Scoring System - Quantifiable code quality metrics
- GUI Interface - Visual representation of all compilation phases
- Educational Focus - Clear demonstration of all compiler phases
- passcode.txt - Sample perfect code achieving 98/100 score
- Code comments - Throughout source files for clarity
-
What is it?
- Complete compiler with 7 phases
- Main feature: Automatic code quality analysis
-
How does it work?
- Parser generates Symbol Table + 3AC Code
- Quality Analyzer performs multi-level static analysis
- Reports errors, warnings, suggestions with scoring
-
What makes it advanced?
- Data-flow analysis for infinite loop detection
- Call graph building for recursion detection
- Variable statistics tracking
- Quantifiable quality scoring system
-
Real-world relevance?
- Similar to modern linters (ESLint, Pylint)
- Based on real compiler techniques
- Educational demonstration of all compiler phases
Project: CSE 430 - Compiler Design Lab
University: University of Asia Pacific
Developer: Nazmul Hoosain Nadim (22101203)
Submitted to: Md. Shaiful Islam Ph.D.
main.py
├─ gui.py
│ ├─ lexer.py
│ ├─ parser.py
│ ├─ symbol_table.py
│ ├─ code_generator.py
│ └─ timeline.py (Code Quality Analyzer)
│
├─ parser.py
│ ├─ lexer.py
│ └─ symbol_table.py
│
└─ timeline.py
└─ (Uses parser output only)
Your compiler achieves:
- 100% Lexical Analysis - Complete tokenization
- 100% Syntax Analysis - Full BNF grammar implementation
- 100% Semantic Analysis - Type checking, scope management
- 100% Code Generation - 3AC to Assembly conversion
- 100% Code Quality Analysis - Advanced multi-level checking
Potential improvements for future versions:
- Support for more data types (float, char, string)
- More complex expressions and operators
- Array and pointer support
- Optimization passes on 3AC
- Advanced code flow analysis
- Integration with version control
For questions about this project:
- Developer: Nazmul Hoosain Nadim
- ID: 22101203
- E-mail: nhnadim006@gmail.com
- Institution: University of Asia Pacific
- Course: CSE 430 - Compiler Design Lab
Last Updated: May 24, 2026
Project Status: ✅ Complete & Functional
This README was generated for CSE 430 Mini Compiler Project submission.