{
  "title": "CS4114 Formal Languages and Automata",
  "desc": "CS4114 Formal Languages and Automata",
  "build_dir": "Books",
  "code_dir": "SourceCode/",
  "code_lang": {
    "Java": {
      "ext": [
        "java"
      ],
      "label": "Java",
      "lang": "java"
    },
    "Java_Generic": {
      "ext": [
        "java"
      ],
      "label": "Java (Generic)",
      "lang": "java"
    }
  },
  "lang": "en",
  "build_JSAV": false,
  "build_cmap": false,
  "suppress_todo": false,
  "assumes": "recursion",
  "dispModComp": true,
  "glob_exer_options": {
    "JXOP-debug": "true"
  },
  "chapters": {
    "Preface": {
      "Intro": {
        "long_name": "How to Use this System",
        "sections": {}
      }
    },
    "Introduction": {
      "PIFLA/FLIntro": {
        "long_name": "About this Course and this Book",
        "sections": {
          "Introduction": {},
          "Prerequisites": {},
          "How this Book Works": {},
          "What We Will Do": {}
        }
      },
      "PIFLA/FLOverview": {
        "long_name": "Overview",
        "sections": {
          "Languages, Grammars, and Machines": {},
          "Language Hierarchy": {},
          "The Power of Machines": {},
          "Application: Compilers": {},
          "Some Mindbending Ideas": {}
        }
      },
      "PIFLA/MajorConcepts": {
        "long_name": "Introduction to Formal Languages",
        "sections": {
          "Introduction": {},
          "Languages": {},
          "Grammars": {},
          "Practicing Grammars": {
            "CharacterizeLang1": {
              "long_name": "Characterizing a Language, Problem 1",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/FLA/CharacterizeLang1.html",
              "mod_name": "MajorConcepts",
              "threshold": 1
            },
            "CharacterizeLang2": {
              "long_name": "Characterizing a Language, Problem 2",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/FLA/CharacterizeLang2.html",
              "mod_name": "MajorConcepts",
              "threshold": 1
            }
          },
          "Automata": {}
        }
      },
      "PIFLA/IntroGrammarEx": {
        "long_name": "Grammar Exercises",
        "sections": {
          "Grammar Exercises": {}
        }
      }
    },
    "Mathematical Background": {
      "PIFLA/SetNotationFLAFS": {
        "long_name": "Set Notation",
        "sections": {
          "Introduction to Sets": {
            "SetDefFS": {
              "long_name": "SetDefFS",
              "required": true,
              "points": 1.0,
              "threshold": 1.0,
              "type": "ff",
              "links": [
                "AV/PIFLA/Background/SetDefFS.css"
              ],
              "scripts": [
                "DataStructures/PIFrames.js",
                "AV/PIFLA/Background/SetDefFS.js"
              ],
              "mod_name": "SetNotationFLAFS"
            }
          },
          "Set Common Notation": {
            "SetNotationFS": {
              "long_name": "SetNotationFS",
              "required": true,
              "points": 2.0,
              "threshold": 1.0,
              "type": "ff",
              "links": [
                "AV/PIFLA/Background/SetNotationFS.css"
              ],
              "scripts": [
                "DataStructures/PIFrames.js",
                "AV/PIFLA/Background/SetNotationFS.js"
              ],
              "mod_name": "SetNotationFLAFS"
            }
          }
        }
      },
      "PIFLA/SetNotation": {
        "long_name": "Set Notation",
        "sections": {
          "Introduction to Sets": {}
        }
      },
      "PIFLA/Relations": {
        "long_name": "Relations",
        "sections": {
          "Relations": {},
          "Equivalence Classes and Partial Orders": {}
        }
      },
      "Background/Proofs": {
        "long_name": "Mathematical Proof Techniques",
        "sections": {
          "Mathematical Proof Techniques": {}
        }
      },
      "PIFLA/MathProof": {
        "long_name": "Mathematical Proof Techniques",
        "sections": {
          "Mathematical Proof Types": {
            "MathProofFS": {
              "long_name": "MathProofFS",
              "required": true,
              "points": 2.0,
              "threshold": 1.0,
              "type": "ff",
              "links": [
                "AV/PIFLA/Background/MathProofFS.css"
              ],
              "scripts": [
                "DataStructures/PIFrames.js",
                "AV/PIFLA/Background/MathProofFS.js"
              ],
              "mod_name": "MathProof"
            }
          },
          "Mathematical Induction": {
            "InductionIntroFS": {
              "long_name": "InductionIntroFS",
              "required": true,
              "points": 2.0,
              "threshold": 1.0,
              "type": "ff",
              "links": [
                "AV/PIFLA/Background/InductionIntroFS.css"
              ],
              "scripts": [
                "DataStructures/PIFrames.js",
                "AV/PIFLA/Background/InductionIntroFS.js"
              ],
              "mod_name": "MathProof"
            }
          },
          "Induction Proof Examples": {
            "InductionExamp1FS": {
              "long_name": "InductionExamp1FS",
              "required": true,
              "points": 2.0,
              "threshold": 1.0,
              "type": "ff",
              "links": [
                "AV/PIFLA/Background/InductionExamp1FS.css"
              ],
              "scripts": [
                "DataStructures/PIFrames.js",
                "AV/PIFLA/Background/InductionExamp1FS.js"
              ],
              "mod_name": "MathProof"
            },
            "InductRegionsFS": {
              "long_name": "InductRegionsFS",
              "required": true,
              "points": 2.0,
              "threshold": 1.0,
              "type": "ff",
              "links": [
                "AV/PIFLA/Background/InductRegionsFS.css"
              ],
              "scripts": [
                "DataStructures/PIFrames.js",
                "AV/PIFLA/Background/InductRegionsFS.js"
              ],
              "mod_name": "MathProof"
            },
            "InductFactFS": {
              "long_name": "InductFactFS",
              "required": true,
              "points": 2.0,
              "threshold": 1.0,
              "type": "ff",
              "links": [
                "AV/PIFLA/Background/InductFactFS.css"
              ],
              "scripts": [
                "DataStructures/PIFrames.js",
                "AV/PIFLA/Background/InductFactFS.js"
              ],
              "mod_name": "MathProof"
            }
          }
        }
      }
    },
    "Finite Acceptors": {
      "PIFLA/DFA": {
        "long_name": "DFA: Deterministic Finite Acceptors",
        "sections": {
          "Introduction to the DFA": {},
          "Some Examples": {},
          "Advanced Concepts": {},
          "Limits to DFAs": {}
        }
      },
      "PIFLA/DFAExercises1": {
        "long_name": "DFA exercises",
        "sections": {
          "DFA exercises": {}
        }
      },
      "PIFLA/DFAExercises2": {
        "long_name": "DFA exercises",
        "sections": {
          "DFA exercises": {}
        }
      },
      "PIFLA/DFAExercises3": {
        "long_name": "DFA exercises",
        "sections": {
          "DFA exercises": {}
        }
      },
      "PIFLA/NFA": {
        "long_name": "NFA: Non-Deterministic Finite Automata",
        "sections": {
          "Non-Deterministic Finite Automata": {},
          "NFA vs. DFA: Which is more powerful?": {},
          "NFA to DFA Conversion Example": {},
          "Conclusions": {}
        }
      },
      "PIFLA/NFAExercises": {
        "long_name": "NFA exercises",
        "sections": {
          "NFA to DFA": {},
          "Create NFA": {}
        }
      },
      "PIFLA/NFAExercises2": {
        "long_name": "More NFA exercises",
        "sections": {
          "NFA to DFA": {},
          "Create NFA": {}
        }
      },
      "PIFLA/DFAMinimization": {
        "long_name": "Minimizing the Number of States in a DFA",
        "sections": {
          "Minimizing the Number of States in a DFA": {},
          "Minimization Example 1": {},
          "Minimization Example 2": {},
          "Decideability": {}
        }
      },
      "PIFLA/MinimizationEx": {
        "long_name": "DFA Minimization Exercises",
        "sections": {
          "DFA Minimization Exercises": {
            "DFAMinEx3": {
              "long_name": "DFA minimization exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/OpenFLAP/exercises/FLAssignments/FA/DFAMinEx3.html",
              "mod_name": "MinimizationEx",
              "threshold": 0.9
            },
            "DFAMinEx4": {
              "long_name": "DFA minimization exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/OpenFLAP/exercises/FLAssignments/FA/DFAMinEx4.html",
              "mod_name": "MinimizationEx",
              "threshold": 0.9
            }
          }
        }
      }
    },
    "Regular Languages": {
      "PIFLA/RegEx": {
        "long_name": "Regular Expressions",
        "sections": {}
      },
      "PIFLA/RegExExercises": {
        "long_name": "Regular Expressions Exercises",
        "sections": {
          "Exercise 1": {},
          "Exercise 2": {},
          "Exercise 3": {},
          "Exercise 4": {}
        }
      },
      "PIFLA/RegExExercises2": {
        "long_name": "More Regular Expressions Exercises",
        "sections": {
          "Exercise 1": {},
          "Exercise 2": {},
          "Exercise 3": {},
          "Exercise 4": {}
        }
      },
      "PIFLA/RegExPower": {
        "long_name": "The Power of Regular Expressions",
        "sections": {
          "Every Regular Expression has an Equivalent NFA": {},
          "Converting a Regular Expression to a NFA": {},
          "Regular Expression to Minimized DFA Example": {},
          "Converting NFAs to Regular Expressions": {},
          "Summary": {}
        }
      },
      "PIFLA/RegularGrammars": {
        "long_name": "Regular Grammars",
        "sections": {
          "Introduction to Regular Grammars": {
            "RegularGrammarFS": {
              "long_name": "RegularGrammarFS",
              "required": true,
              "points": 2.0,
              "threshold": 1.0,
              "type": "ff",
              "links": [
                "AV/PIFLA/Regular/RegularGrammarFS.css"
              ],
              "scripts": [
                "DataStructures/PIFrames.js",
                "AV/PIFLA/Regular/RegularGrammarFS.js"
              ],
              "mod_name": "RegularGrammars"
            }
          },
          "Converting Regular Grammars to NFAs": {
            "RGtoNFAFS": {
              "long_name": "RGtoNFAFS",
              "required": true,
              "points": 2.0,
              "threshold": 1.0,
              "type": "ff",
              "links": [
                "DataStructures/FLA/FLA.css",
                "AV/PIFLA/Regular/RGtoNFAFS.css"
              ],
              "scripts": [
                "DataStructures/FLA/FA.js",
                "DataStructures/PIFrames.js",
                "DataStructures/FLA/GrammarMatrix.js",
                "AV/PIFLA/Regular/RGtoNFAFS.js"
              ],
              "mod_name": "RegularGrammars"
            }
          },
          "Converting NFAs to Regular Grammars": {
            "NFAtoRGFS": {
              "long_name": "NFAtoRGFS",
              "required": true,
              "points": 2.0,
              "threshold": 1.0,
              "type": "ff",
              "links": [
                "DataStructures/FLA/FLA.css",
                "AV/PIFLA/Regular/NFAtoRGFS.css"
              ],
              "scripts": [
                "DataStructures/FLA/FA.js",
                "DataStructures/PIFrames.js",
                "AV/PIFLA/Regular/NFAtoRGFS.js"
              ],
              "mod_name": "RegularGrammars"
            }
          },
          "Converting between Left-linear and Right-linear Grammars": {
            "LLGrammarFS": {
              "long_name": "LLGrammarFS",
              "required": true,
              "points": 2.0,
              "threshold": 1.0,
              "type": "ff",
              "links": [
                "DataStructures/FLA/FLA.css",
                "AV/PIFLA/Regular/LLGrammarFS.css"
              ],
              "scripts": [
                "lib/underscore.js",
                "DataStructures/FLA/FA.js",
                "DataStructures/PIFrames.js",
                "DataStructures/FLA/AddQuestions.js",
                "AV/PIFLA/Regular/LLGrammarFS.js"
              ],
              "mod_name": "RegularGrammars"
            }
          },
          "RegEx and Regular Grammars": {
            "RegEXtoRegGrammarFS": {
              "long_name": "RegEXtoRegGrammarFS",
              "required": true,
              "points": 2.0,
              "threshold": 1.0,
              "type": "ff",
              "links": [
                "AV/PIFLA/Regular/RegEXtoRegGrammarFS.css"
              ],
              "scripts": [
                "DataStructures/FLA/FA.js",
                "DataStructures/PIFrames.js",
                "AV/PIFLA/Regular/RegEXtoRegGrammarFS.js"
              ],
              "mod_name": "RegularGrammars"
            },
            "RegEXtoLeftRegGrammarFS": {
              "long_name": "RegEXtoLeftRegGrammarFS",
              "required": true,
              "points": 2.0,
              "threshold": 1.0,
              "type": "ff",
              "links": [
                "AV/PIFLA/Regular/RegEXtoLeftRegGrammarFS.css"
              ],
              "scripts": [
                "DataStructures/FLA/FA.js",
                "DataStructures/PIFrames.js",
                "AV/PIFLA/Regular/RegEXtoLeftRegGrammarFS.js"
              ],
              "mod_name": "RegularGrammars"
            }
          },
          "Summary": {}
        }
      },
      "PIFLA/RegGrammarShort": {
        "long_name": "Regular Grammars",
        "sections": {
          "Introduction to Regular Grammars": {},
          "Converting Regular Grammars to NFAs": {},
          "Converting NFAs to Regular Grammars": {},
          "Converting between Left-linear and Right-linear Grammars": {},
          "Summary": {}
        }
      },
      "PIFLA/RegGramEx1": {
        "long_name": "Regular Grammars Exercises",
        "sections": {
          "Regular Grammars Exercises": {}
        }
      },
      "PIFLA/RegGramEx2": {
        "long_name": "More Regular Grammar Exercises",
        "sections": {
          "More Regular Grammar Exercises": {}
        }
      },
      "PIFLA/RegClosure": {
        "long_name": "Closure Properties of Regular Languages",
        "sections": {
          "Closure Concept": {},
          "Closure Properties of Regular Languages - Basic Operations": {},
          "Right quotient": {},
          "Homomorphism": {},
          "Some Decideable Questions about Regular Languages": {},
          "Summary: How do we prove that a language is regular?": {}
        }
      },
      "VisFormalLang/DFAproperties": {
        "long_name": "Properties",
        "sections": {
          "Introduction": {},
          "Properties and Proving: Problem 1": {},
          "Properties and Proving - Problem 2": {}
        }
      }
    },
    "Identifying Non-regular Languages": {
      "PIFLA/NonRegular": {
        "long_name": "Identifying Non-regular Languages",
        "sections": {
          "Identifying Non-regular Languages": {},
          "The Concept of Pumping": {},
          "The Pumping Lemma": {},
          "Some Pumping Lemma Examples": {},
          "The Pumping Lemma Adversary Game": {},
          "Using Closure Properties to Prove L is Not Regular": {},
          "Questions to Think About": {}
        }
      }
    },
    "Context-Free Grammars and Languages": {
      "PIFLA/CFG1": {
        "long_name": "Context-Free Grammars Part 1",
        "sections": {
          "Context-Free Languages": {},
          "String Derivation": {},
          "Derivation Trees": {},
          "Derivation Trees Example": {},
          "Practice question 1": {},
          "Membership Problem": {},
          "Practice question 2": {}
        }
      },
      "PIFLA/CFG2": {
        "long_name": "Context-Free Grammars Part 2",
        "sections": {
          "Ambiguity": {},
          "Precedence Practice": {},
          "Unambiguous grammar parse tree Example": {},
          "Why Context Free?": {}
        }
      },
      "PIFLA/BNF": {
        "long_name": "Writing Compilers",
        "sections": {
          "Backus-Naur Form": {},
          "Extended BNF": {}
        }
      },
      "PIFLA/CFGExercises": {
        "long_name": "CFG exercises",
        "sections": {
          "CFG exercises": {}
        }
      },
      "PIFLA/CFGTransformations": {
        "long_name": "Transforming Grammars",
        "sections": {
          "Transforming Grammars": {},
          "Remove Useless Productions": {},
          "Remove Lambda Productions": {},
          "Remove Unit Productions": {},
          "Chomsky Normal Form (CNF)": {},
          "Greibach Normal Form (GNF)": {}
        }
      },
      "PIFLA/CFGTransEx": {
        "long_name": "Transforming Grammars Exercises",
        "sections": {
          "Transforming Grammars Exercises": {}
        }
      }
    },
    "Pushdown Automata": {
      "PIFLA/PDA": {
        "long_name": "Pushdown Automata",
        "sections": {
          "PDA: Pushdown Automata": {},
          "Transitions Types for PDAs": {},
          "PDA Acceptace Models - Final State Acceptace": {},
          "PDA Acceptace Models - Empty Stack Acceptace": {},
          "Equivalence of Acceptance Definitions": {},
          "Something to Think About": {}
        }
      },
      "PIFLA/PDAExercises": {
        "long_name": "PDA Exercises",
        "sections": {
          "PDA Exercises": {}
        }
      },
      "PIFLA/PDACFL": {
        "long_name": "PDAs and Context Free Languages",
        "sections": {
          "PDAs and Context Free Languages": {},
          "Convert a CFG to a NPDA": {},
          "Convert a NPDA to a CFG": {}
        }
      },
      "PIFLA/DPDA": {
        "long_name": "Deterministic Pushdown Automata",
        "sections": {
          "Deterministic Pushdown Automata": {},
          "Proof there exists a CFL that is not a DCFL": {},
          "Grammars for Deterministic Context-free Languages": {}
        }
      }
    },
    "Properties of Context-free Languages": {
      "PIFLA/CFLProp": {
        "long_name": "Proving that a Language is not Context-Free",
        "sections": {
          "Introduction": {},
          "Closure Properties for Context-Free Languages": {},
          "A Pumping Lemma for Context-Free Languages": {},
          "Using the CFL Pumping Lemma to Prove a Language Not CFL: Example 1": {},
          "Pumping Lemma Example 2": {},
          "Pumping Lemma Example 3": {},
          "Pumping Lemma Example 4": {}
        }
      }
    },
    "Turing Machines": {
      "PIFLA/TuringMachines": {
        "long_name": "Introduction to Turing Machines",
        "sections": {
          "A General Model of Computation": {},
          "Turing Machines": {},
          "Interpreting Turing Machines": {},
          "Turing-Decidable vs. Turing-Acceptable Languages": {}
        }
      },
      "PIFLA/TuringMachinesAdv": {
        "long_name": "Turing Machines: Advanced Topics",
        "sections": {
          "Making More Complicated Machines": {},
          "Unrestricted and Context Sensitive Grammars": {},
          "Simple Arithmetic... and Beyond": {},
          "Turing's Thesis and Algorithms": {},
          "Turing Machine Extensions": {}
        }
      },
      "PIFLA/TMExercises": {
        "long_name": "Turing Machine Exercises",
        "sections": {
          "Exercise 1": {},
          "Exercise 2": {},
          "Exercise 3": {},
          "Exercise 4": {},
          "Exercise 5": {},
          "Exercise 6": {},
          "Exercise 7": {},
          "Exercise 8": {},
          "Exercise 9": {}
        }
      },
      "PIFLA/TMExercisesS22": {
        "long_name": "Turing Machine Exercises",
        "sections": {
          "Exercise 1": {},
          "Exercise 2": {},
          "Exercise 3": {},
          "Exercise 4": {},
          "Exercise 5": {}
        }
      }
    },
    "Limits to Computing": {
      "PIFLA/LimCompFLA": {
        "long_name": "Limits to Computing",
        "sections": {
          "Limits to Computing": {}
        }
      },
      "PIFLA/Reduction": {
        "long_name": "Reductions",
        "sections": {
          "Reductions": {},
          "Reduction Examples": {},
          "Bounds Theorems": {}
        }
      },
      "PIFLA/NPComplete": {
        "long_name": "NP-Completeness",
        "sections": {
          "Hard Problems": {},
          "Proving that a Problem is NP-Complete": {},
          "Coping with NP-Complete Problems": {}
        }
      },
      "PIFLA/Impossible": {
        "long_name": "Unsolveable Problems",
        "sections": {
          "Unsolveable Problems": {},
          "The Halting Problem is Unsolvable": {}
        }
      }
    },
    "Parsing": {
      "VisFormalLang/ParseIntro": {
        "long_name": "Parsing Introduction",
        "sections": {
          "Introduction": {}
        }
      },
      "VisFormalLang/LLParsing": {
        "long_name": "LL Parsing",
        "sections": {
          "LL Parsing": {}
        }
      },
      "VisFormalLang/LRParsing": {
        "long_name": "LR Parsing",
        "sections": {
          "LR Parsing": {
            "LRparseDFA2CON": {
              "type": "dgm",
              "mod_name": "LRParsing"
            }
          }
        }
      },
      "VisFormalLang/CYKParsing": {
        "long_name": "CYK Parsing",
        "sections": {
          "CYK Parsing": {}
        }
      },
      "VisFormalLang/Compiler": {
        "long_name": "Structure of a Compiler",
        "sections": {
          "What is a compiler?": {},
          "Language Processing System": {},
          "Overview of General Compiler": {},
          "Phases of Compilation": {}
        }
      }
    },
    "Appendix": {
      "Glossary": {
        "long_name": "Glossary",
        "sections": {}
      }
    }
  }
}