Courses/ThlLog2016
From LRDE
This page contains the log of the topics that of the [[THL-Course][THL - Language Theory]] for class EPITA 2016 (i.e., from Oct 2016 to Nov 2016). A majority of the students have already followed [[THLR-Course][THLR - Rational Language Theory]]. This course is a preamble to
* [[TYLA-Course][TYLA - Concepts of Programming Languages]] * [[CMP1-Course][CMP1 - Compiler Construction 1]] * [[CMP2-Course][CMP2 - Compiler Construction 2]].
Below, the star symbol (*) designates topics that were not covered for lack of time.
Courses: %TOC%
---+ 1&2: 2010-09-30: Introduction (30min), Languages and Automata (2h30)
1 Presentation of the Lectures (THL-Course, CMP1-Course, TYLA-Course, CMP2-Course) 1 Why studying languages 2 Computers 3 Compilers/Interpreters 3 Formal languages (XML, <nop>LaTeX, SQL, etc.) 3 Intrusion Detection Systems 2 Biotechs 3 Fuzzy matching 2 Natural Language Processing 1 Bases 2 Alphabet 2 Word 2 Language 1 Examples 2 a^n 2 a^n b^n 2 binary numbers 2 prime binary numbers 2 C programs 2 French 1 Infinite words 2 traces 2 Omega-words 1 Concatenation 2 Concatenation 2 Epsilon 2 Noncommutativity (*) 3 xy = yx => \exists u: x = u^i, y = u^j 2 Free Monoid 2 Power 2 Length 1 Relations (*) 2 Prefix, Suffix, Factor, Subword 1 Distance between words (*) 2 Longest prefix length 2 Suffix, Factor, Subword 2 Editing distance 1 Order on words (*) 2 Prefix, Suffix etc. 2 Total order: lexicographic 2 Total well founded order: alphabetic (aka radical, military) 1 Operations on Languages 2 Union 2 Intersection 2 Complementation 2 Concatenation 2 Pref, Suf, Fac, Sub (1) 2 Quot (L_{/w} = w^-1 L = {v \in \sigma^\star : wv \in L}) (*) 2 Power 2 Kleene 1 Defining Languages thanks to Set Operations: Rat 1 Examples 2 a^n 2 binary numbers 2 floats (*) 2 a^n b^n ? 1 Rational Expressions 1 Real World Rational Expressions(*) 2 Syntactic Sugar 2 Syntaxes (*grep, *lex, AWK, Perl, Emacs etc.) (*) 2 Toying with Grep (*) 2 A <nop>RegExp for Pascal {} comments (*) 2 A <nop>RegExp for C strings (*) 2 A <nop>RegExp for C comments (*) 2 A <nop>RegExp for nested {} comments (*) 2 Changing Massively Identifiers thanks to Perl (*) 1 Matching <nop>RegExps: Naive Automata 2 Thompson 2 Epsilon-NFA 1 Epsilon transitions 2 Backward closure 2 Elimination 2 Nondeterministic Automata
---+ 3: 2008-10-18: Deterministic Automata, Rational Languages (1h30)
1 Understanding Nondeterministic Computations 2 Perfect Fork 2 The Oracle 2 <nop>BackTracking: exponential time 1 Determinization 2 Eliminating nondeterminism 2 Deterministic Automata 2 Exponential Space vs Linear Time 1 Trimmed Automaton 2 Reachability 2 Usefulness 1 Interpreting the states of a DFA for (a|n)*a(a|b)(a|b) 2 Can an automaton understand a^nb^n? 2 The Pumping Lemma 2 !RegExps are not enough 1 Computing the language of an automaton (*) 1 Rational is Recognizable 1 Rational Languages Stability (*) 1 transposition (reversing a language) (*) 1 intersection (*) 1 complementation, importance of determinism and completion (*) 1 Prefix, Suffix, and Factor (*) 1 Subwords(*) 1 Minimization (*) 2 Distinguishable states
(*) One can reach an accepting state on some string, but not the other. Accepting states are not required to be equal. 2 Indistinguishable, equivalent states (*) 2 Minimizing a DFA. (*) 1 Rational Languages Tests (*) 2 Emptiness test 2 Membership test 2 Equivalence test (using the state equivalence table)
---+ 4: 2008-10-14: Grammars, Chomsky's Hierarchy (1h30)
1 Is there a perfect system? (*) 2 Cardinality of languages 2 Cardinality of the set of languages 2 A Language Specification System is a language 2 Cardinality mismatch 1 Naive Rewriting Systems (Semi Thue Systems) (*) 1 Naive Grammars for Small Natural Language Subset 1 Terminal, Nonterminal 1 A Grammar to Generate "a^n b^n c^n" 2 A -> aABC 2 A -> abC 2 CB -> BC 2 bB -> bb 2 bC -> bc 2 cC -> cc 1 Type 0 Generative Grammars 1 Recursively Enumerable 2 If a language is type 0, then it is recursively enumerable (*) 2 If a language is recursively enumerable, then it is type 0 (not proved) (*) 1 Derivation, "Derivation Graph", Sentential Form, Protosentences 1 A Grammar Generating 'Dick, Ceriel, and Noam' Sentences 2 Sentence -> Name | List End 2 Name -> ceriel | dick | noam 2 List -> Name | Name ',' List 2 ',' Name End -> and Name 1 Type 1 Monotonic Grammars 2 Sentence -> Name | List 2 Name -> ceriel | dick | noam 2 List -> <nop>EndName | Name ',' List 2 ',' <nop>EndName -> and Name
---+ 5: 2012-10-22: Grammars, Chomsky's Hierarchy (2h)
1 If a language is monotonous, it is recursive (*) 1 The converse does not hold 1 Type 1 Context Sensitive Grammars 2 Sentence -> Name | List 2 Name -> ceriel | dick | noam 2 List -> <nop>EndName | Name Comma List 2 Comma <nop>EndName -> and <nop>EndName 2 and <nop>EndName -> and Name 2 Comma -> ',' 1 Back to "a^n b^n c^n" 2 S -> abc 2 S -> aSQ 2 bQc -> bbcc 2 cQ -> Qc 1 Reback to "a^n b^n c^n" 2 S -> abC 2 S -> aSQ 2 bQC -> bbCC 2 CQ -> CX 2 CX -> QX 2 QX -> QC 2 C -> c 1 A context sensitive grammar is Monotonous 1 A monotonous grammar can be transformed into context sensitive 1 Type 2 Context Free Grammars 2 Sentence -> Name | List and Name 2 Name -> ceriel | dick | noam 2 List -> Name ',' List | Name 1 Type 3 Rational Grammars 2 Sentence -> ceriel | dick | noam | List 2 List -> ceriel <nop>ListTail | dick <nop>ListTail | noam <nop>ListTail 2 <nop>ListTail -> ',' List | and ceriel | and dick | and noam 1 Linear is Rational 1 Type 4 Finite Choice Grammars 1 Chomsky Hierarchy 1 (Weakly) Equivalent Grammars
---+ 6: 2012-10-22: Grammars, Chomsky's Hierarchy (2h)
1 Computation Models (FSM, PDA, LBTM, TM) 1 Computation Power (P, NP) 1 Interpreting the Various Types as Levels of Correctness 2 Lexically Correct 2 Syntactically Correct 2 "Semantically" Correct 2 Terminating Programs 2 Correct Programs (i.e., that solve the given problem) 1 Case of the Epsilon-productions 2 Type 1 + A -> epsilon = Type 0 2 Type 2 + A -> epsilon = Type 2 2 Type 3 + A -> epsilon = Type 3
---+ 5: 2008-11-02: Context Free Grammars (1h30)
1 Context Free Grammars 2 S -> a S b | epsilon 1 Backus Naur Form (*) 1 Extended Backus Naur Form (*) 1 Tiger Grammar (*) 1 Arithmetics I 2 S -> S + S 2 S -> n 1 Rightmost Derivation 1 Derivation Trees 1 Ambiguities 1 How to fix ambiguities 1 Arithmetics II 2 S -> S + S 2 S -> S * S 2 s -> n 1 Disambiguation 1 Completion: unary minus, and parentheses 2 E -> E + T | T 2 T -> T * F | F 2 F -> n | (E) | -F 1 The dangling else (*) 1 Hygiene (*) 2 Undefined Nonterminals 2 Unused Nonterminals 2 Nonproductive Nonterminals 2 Useless Nonterminals 2 Loops
---+ 6: 2008-10-27: Parsing: LL (2h)
1 Writing a simple parser for shell 2 inst -> 'if' expr 'then' inst 'fi' 2 inst -> 'print' 'foo' 2 expr -> true | false 1 Looking for a criterion, the first token of rules 1 Making it more complex 2 inst -> 'if' expr 'then' inst 'fi' 2 inst -> 'print' 'foo' 2 expr -> cond 2 cond -> true | false 1 Looking for a criterion, FIRST of an LHS 1 Error Recovery 1 Making it worse 2 inst -> 'if' expr 'then' inst 'fi' 2 inst -> 'print' 'foo' 2 expr -> neg cond 2 neg -> 'not' neg | epsilon 2 cond -> true | false 1 Looking for a criterion: FIRST, FOLLOW, and NULLABLE 1 Computing FIRST, FOLLOW and NULLABLE for the above grammar 1 Writing the (strong)-LL(1) table 2 For all A -> alpha | | *First (alpha)* | | *A* | A -> alpha | 2 For all A -> alpha st. NULLABLE(alpha) | | *Follow (A)* | | *A* | A -> alpha | 1 Applying the theory to 2 grammar 3 Z -> X Y Z 3 Z -> d 3 Y -> c 3 Y -> epsilon 3 X -> Y 3 X -> a 2 Tables Nullable = { X, Y } | Symbol | Nullable | First | Follow | | Z | N | acd | $ | | Y | Y | c | acd | | X | Y | ac | acd | 2 Parser | | a | c | d | | S | 0/ | 0/ | 0/ | | Z | 1/ | 1/ | 1&2/ | | Y | /4 | 3/4 | /4 | | X | 6/5 | 5/5 | /5 |
---+ 7: 2012-11-15: Parsing: LL(1) (2h)
1 Applying the LL algorithms onto arithmetics 2 Left Recursion 2 Left Factorization 2 Write the table 2 Insist on the fact that there is no problem with unary/binary -/+. 1 Critique the parser 2 Associativities are wrong, repairing them is intricate. 2 Show the corresponding C code 2 Introducing Rational Expression in Grammars: EBNF 2 Writing the LL parser for the arithmetics 2 Picturing CFG as collections of automata (*) 2 Where is the hidden memory? (automata => rational, but there are `(' `)'). (*) 1 Tabular vs. Code (*) 2 Register Pressure (no longer very true) 2 Optimizations 2 Prefetching 2 Swich vs. Function Pointer table 2 Virtual Tables vs. Switch (Eiffel vs. C++) (*)
1 Understanding how LL works: decisions are taken at the *beginning* of the rule. 1 Trying to imagine a means to overcome this limitation 1 Recognizing balanced expressions 2 S -> '(' S ')' 2 S -> 'n' 1 Isolating two main actions: shifting/reducing. 1 Adding $, end of input 1 Characterizing the reducible stacks 1 Finding Rational Expressions Characterizing these Stacks 1 Building the automaton directly, without rational expressions
---+ 8: 2012-11-22: Parsing: LR(0), SLR(1), LR(1)
1 A more difficult grammar 2 E -> E '-' 'n' | 'n' 2 Don't forget the S -> E $ rule. 1 Another 2 E -> 'n' '-' E | 'n' 2 Don't forget the S -> E $ rule. 1 Comparing the two automata, computed directly 2 The first one is a tree 2 The second has a cycle 2 How should that be interpreted (finite stack for the first one). 2 Hence LR seems to prefer left assoc. 1 Writing the automata as tables 2 The second automaton has a conflict 2 Introducing the concept of Look-ahead: SLR(1) 2 Back to left rec. vs. right rec.: (S)LR does the two, but *prefers* left. 2 (recursive) LL *cannot* do left assoc. 1 Going Even Further: The "R/L-value" grammar 2 S -> V = E 2 S -> E 2 E -> V 2 V -> id 2 V -> * E 1 SLR(1): the "R/L-value" grammar above does not work, why? 1 LR(1) grammars 2 Using look-ahead for real 2 LR(1) items, computing LR(1) automatons 2 Compute the LR(1) automaton for the "R/L-value" grammar 1 Some sizes of LR(1) automata 2 arithmetics. A small grammar but unambiguous. There are 5 terminals, 3 non terminals, and 6 rules. 2 medium. A medium size grammar comprising 41 terminals, 38 non terminals, and 93 rules. 2 programming. A real size grammar of a programming language, composed of 82 terminals, 68 non terminals, and 234 rules. | |*LR(1)*| *LR(1)* |*LALR(1)*|*LALR(1)*|*DRLR(1)*|*DRLR(1)*| |*Grammar* |*St.* |*Entries*| *St.* |*Entries*| *St.* |*Entries*| |arithmetics|22 | 71 | 12 | 26 | 8 | 23 | |medium |773 | 6,874 | 173 | 520 | 118 | 781 | |programming|1,000+ | 15,000+ | 439 | 3,155 | 270 | 3,145 |
1 LR(1) automata too big: LALR(1) 2 Compute the LR(1) automaton for the "R/L-value" 2 Merging states 2 Reduce the LR(1) automaton for the "R/L-value" grammar to LALR(1) 2 In practice: do not compute the LR(1) automaton 1 Ambiguous arithmetics: 2 E -> E + E 2 E -> E * E 2 E -> n 1 Compute the automaton 1 Yes, of course it's ambiguous 1 Fill the table 1 Using the precedence 1 Using `%left', `%right', `%nonassoc' for associativities 1 This automaton is better 2 Nicer grammar 2 Smaller automaton 2 Fewer transitions
---+ 11: 2012-11-26: Yacc/Bison, Lex/Flex
1 Architecture of a Compiler 2 Scanner (char stream -> token stream) 2 Parser (token stream -> synthetic representation of the input) 2 The rest (checks, translations) 1 Introduction to scanner/parser generators 2 Lex/Flex 2 Yacc/Bison 1 Introduction to Flex 2 Scanning keywords 2 Scanning integers: yytext 2 Scanning identifiers: yytext + yyleng + yylval 2 Identifier vs. keyword: the "meta rules (longest match, first rule) 2 The case of white spaces 2 A catch-all rule to avoid the default rule (ECHO) 2 Comments are white spaces, so skip them similarly 2 What about nested comments: write a more powerful regexp. 2 Of course, *it is not possible* 2 Using start conditions to handle the nested comments 2 Using start conditions to handle escapes in strings 1 Introduction to Bison 2 Writing a simple grammar without actions 2 Writing calc: =%left= and so forth 2 Dealing with ambiguous grammars: learn to read Bison's report 2 Writing actions 1 Interface Flex & Bison 2 Write a flex scanner for arithmetics 2 Write a bison parser for arithmetics 2 Put pieces of calculator to work 1 Error recovery
---+ Week 7: 2012-11-26: In depth use of Flex/Bison
1 =errok= in error recovery 1 Location Tracking (=%locations=) 1 Making a pure parser 1 =%pure-parser= 1 =%parse-param= 1 Adjusting the scanner: =YY_DECL= & pointers 1 Addressing Grammar Conflicts 1 Fixing the Dangling else Shift/Reduce: <verbatim> cat >1-if.y <<-EOF %% exp: "if" exp "then" exp | "if" exp "then" exp "else" exp | "exp" ; %% EOF </verbatim> 1 Fixing a split operator Shift/Reduce <verbatim> cat >2-split.y <<-EOF %% exp: exp "(" ")" exp | "exp" ; %% EOF </verbatim> 1 Understanding the mysterious Reduce/Reduce <verbatim> cat >3-promac.y <<-EOF %% sentence: "proc" argument '.' | "proc" parameter ';' | "macro" argument ';' | "macro" parameter '.' ; argument: "id"; parameter: "id"; %% EOF </verbatim>
---+ 2012-11-29: First two hours of CCMP: Deterministic languages, GLR
1 Fixing Reduce/Reduce problems: lvalues <verbatim> cat >5-lvalues.y <<-EOF %% exp: typeid "[" exp "]" "of" exp | lvalue ; lvalue: "id" | lvalue "[" exp "]" ; typeid: "id" ; %% EOF </verbatim>
1 An Example of Grammar that is not LR(1) 2 G -> G R 2 G -> R 2 R -> id ':' D 2 D -> L id 2 D -> epsilon 1 Writing a few words, trying to "parse" the words by hand 1 Where can the decision be taken? 1 LR(2) 1 What is this grammar about? 1 The Yacc paradox 1 How to solve it? 1 This technique (bi-word) scales up (tri-words, k-words) ``hence an LR(k) language is LR(1) 1 Of course, not true for grammars 1 Hierarchy of parsing techniques 1 Hierarchy of language difficulties 1 GLR 1 Presentation of Tiger Project 1 Making groups ([[1][Groups]]) 1 Choosing the right book ([[2][Modern-Compiler-Implementation]]) 1 Assignments and the web site (http://tiger.lrde.epita.fr)