110 likes | 128 Views
Explore the evolution and core concepts of programming languages in compiler design, including imperative and declarative languages, static/dynamic distinction, and parameter passing techniques. Learn about the steps in compiler construction, from scanning to code generation, and the significance of symbol tables. Understand the importance of scanners and parsers in transitioning source code to target languages, using deterministic finite-state machines and regular expressions. Gain insight into syntax-directed translation, LL(1) and LALR(1) grammars, and top-down parsing methods, essential in compiler development.
E N D
CPSC 388 – Compiler Design and Construction Midterm Review
History and Basics of Programming Languages • Advances in Programming languages • Imperative and Declarative Languages • Static/Dynamic Distinction • Environments and States • Static Scope and Block Structure • Explicit Access Control • Dynamic Scope • Parameter Passing • Aliasing
Software • Make • JLex • Java_cup • Java • Javac
Structure of Compiler • Compilers Translate Source Language to Target Language • Compilers have several steps • Scanner • Parser • Semantic Analyzer • Intermediate Code Generator • Optimizer • Code Generator • Symbol Table Used To Keep Track of Names Used in Program • Front End and Back End Simplify Compiler Design • Introduction of new languages • Introduction of new hardware
Scanning • General: what does a scanner do; how does it fit into the design of a compiler? • Underlying Model: Finite-State Machines • Implementing a Scanner using a transition table • Specification of a scanner: • Regular Expressions • JLex Specifications
Finite State Machines • Deterministic Finite State Machine • Non-deterministic Finite State Machine • Conversion from NFA to DFA
Regular Expressions, Regular Definitions, and JLex • Syntax and semantics of RE • Base operators and extended operators • Character Classes • Conversion from RE to NFA • JLex specification • Use of RE • Associated Action • Macros • Matching rules
Context-Free Grammars • Leftmost, Rightmost derivations • Parse Trees • Expression Grammars • Precedence • Associativity • List Grammars • Ambiguous Grammars • Recursive Grammars (left recursive, right recursive)
Syntax-Directed Translation • “plain” translations • Writing rules of the form S1.trans=… • Java_cup translations • Using “:xx” to name the translation associated with a symbol defining translations by assigning to RESULT
Parsing, LL(1) and LALR(1) grammars • General: what does a parser do; how does it fit into the design of a compiler? • Top-Down Parsing • predictive parsing (using a stack and a parse table) • left factoring • removing left recursion • First and Follow sets (how to compute and why they are important) • building the parse table
Textbook Sections Covered • Chapter 1 Introduction • Chapter 3 Lexical Analysis • 3.1, 3.3, 3.6, 3.7.1, 3.7.4 • Chapter 4 Syntax Analysis • 4.1, 4.2, 4.3, 4.4, 4.8, • Chapter 5 Syntax-Directed Translation • 5.1, 5.2, 5.3