Structure and function of Compiler
Any compiler must perform two major tasks
- analysis of the source program
- synthesis of a machine language program
Fig: Structure of a compiler
Scanner
- the scanner begins the analysis of the source program by reading the input, character by character, and grouping characters into individual words and symbols (tokens)
- RE (Regular Expression)
- NFA (Non-deterministic finite automata)
- DFA (Deterministic finite automata)
- LXA
Parser
- Given a format syntax specification (typically as a context-free grammar [CFG]), the parser reads tokens and groups them into units as specified by the productions of the CFG being used.
- As syntactic structure is recognized, the parser either calls corresponding semantic routines directly or builds a syntax tree.
- CFG (Context Free Grammar)
- BNF (Backus-Naur Form)
- GAA (Grammar Analysis Algorithms)
- LL, LR, SLR, LALR Parsers
- YACC
Semantic Routines
- perform two functions
- check the static semantics of each construct
- Do the actual translation
- heart of the compiler
- syntax Directed Translation
- semantic Processing Techniques
- IR (intermediate Representation)
Optimizer
- The IR generated by the semantic routines is analyzed and transformed into functionally equivalent but improved IR code
- This phase can be very complex and slow
- peehole optimization
- loop optimization, register allocation, code scheduling
- register and temporary management
- peehole optimization
Code Generator
- interpretive code generation
- generating code from Tree/Dag
- Grammar-Based code generator