e20-co523-C-Lite-Interpreter

C-Lite Interpreter Design Decisions

CO523 Project Specification §5: Design Discussion

Lexical Analysis

Decision 1: Hand-Written Lexer vs Parser Generator

Decision 2: Explicit EOF Token

Decision 3: Source Location Tracking

Syntax Analysis

Decision 4: Recursive Descent Parser

Decision 5: Operator Precedence Hierarchy

Decision 6: Declarations in Blocks

Semantic Evaluation

Decision 7: Visitor Pattern for Interpretation

Decision 8: Stack-Based Symbol Table

Decision 9: C-Style Truthiness

Decision 10: Type Coercion on Assignment

Decision 11: Uninitialized Variable Detection

Decision 12: Integer Division

Error Handling Strategy

Decision 13: Fail-Fast vs Error Collection

Decision 14: Exception Hierarchy

Testing Strategy

Decision 15: TDD Approach

Decision 16: Test Coverage Goals

Performance Considerations

Decision 17: Time Complexity

Decision 18: Memory Management

Known Limitations

Limitation 1: Recursion Depth for Deep ASTs

Issue: Python’s default recursion limit (~1000 frames) is exceeded by deeply nested expression trees (e.g., 1000-term addition chain).

Root Cause: Recursive visitor pattern (visit_binary_op calls itself for each nested BinaryOp node).

Impact: Programs with deeply nested expressions (>500 levels) may fail with RecursionError.

Mitigation Strategies:

  1. Increase recursion limit: sys.setrecursionlimit(3000) (used in stress tests)
  2. Iterative evaluation: Replace recursive visitor with stack-based evaluation (complex, not implemented)
  3. Expression flattening: Optimize AST during parsing to reduce depth (not implemented)

Trade-off Analysis:

Production Systems: JVM, CPython use stack-based evaluation or increase recursion limits for interpreter loops.

Limitation 2: No Loop Constructs

Issue: C-Lite does not support while or for loops (Project Spec §3).

Impact: Cannot express iterative algorithms directly.

Future Extension: Add loop constructs with proper termination analysis (Week 6: Control Structures).

Limitation 3: No Error Recovery

Issue: Parser uses fail-fast strategy (stops on first error).

Impact: Only first syntax error reported per compilation.

Trade-off: Simpler implementation vs. better user experience.

References