(* Content-type: application/vnd.wolfram.mathematica *) (*** Wolfram Notebook File ***) (* http://www.wolfram.com/nb *) (* CreatedBy='Mathematica 10.1' *) (*CacheID: 234*) (* Internal cache information: NotebookFileLineBreakTest NotebookFileLineBreakTest NotebookDataPosition[ 158, 7] NotebookDataLength[ 42867, 1257] NotebookOptionsPosition[ 33479, 960] NotebookOutlinePosition[ 35508, 1016] CellTagsIndexPosition[ 35430, 1011] WindowFrame->Normal*) (* Beginning of Notebook Content *) Notebook[{ Cell[CellGroupData[{ Cell[BoxData[ TogglerBox[1, {1-> OverlayBox[{ TagBox[GridBox[{ { GraphicsBox[RasterBox[CompressedData[" 1:eJxTTMoPSmNiYGAo5gASQYnljkVFiZXBLECOU2VJahIzkCEFxAJADBL8//8/ Qfzo0SP2GzduCF29elXs/Pnz0sgYn747d+5wA9VoArE/EB8B4uPoGJu+Fy9e MF+4cEENKB8AxBeB+AMQ/wXif+gYi1tBdvoB8QUg/ghV9x8XRtb7/PlzFqje t1D7cOrDpv/ixYvqUHuJ0ousHxpWAVA3E6UXWT80nC8S8i82/Q8ePOAgx26Y /uvXrwsD2UdJ8Tey/kuXLolD0wNJbofpB6YVSUr0n4ek5QHTT6n7KQ0/SuOP 0vRDafqlRv6BxgPZ+Ret/HhHrBl4yi9QWHwiFB7Yyk+QO6B+CTxPYvmJjG/f vs17nozyG1f9cR6t7gBhAPeiQ4A= "], {{0, 26}, {16, 0}}, {0, 255}, ColorFunction->RGBColor], BaseStyle->"ImageGraphics", ImageSize->Magnification[1], ImageSizeRaw->{16, 26}, PlotRange->{{0, 16}, {0, 26}}], GraphicsBox[RasterBox[CompressedData[" 1:eJzt2d9OVFcUB2DSNmkfQRFEiRQ1gCK1vW4fwT6BJu1tE9uk8fUUERE9aECC qLGYEmKkErWxtont2mGdcDLVOpNgZijfJB9hzp+99j6zb9b5Hb3ww7nvP+rr 6/vxs/hz7vzPX1+8eP7St5/El28u/fTdhY/jn/6w8GlfXzlYVdWhDgyEwXT4 HQYbBho6qQMAAOxt/Q0HWxxo0TzX3xij7juGwpFwNAyHY2EkfB6OhxPhZBgL 42EinAqnw2SYSl+Es+HL9FWb6uvP5hj1eJNZ41TWHM85nMw5Hc85juSch3MN R3JNdf/UfGbtPqf6WdW6/XsDAADsV7vd/7b2vqPV2/veuuc9k6Za1Mfr3vVt feto9e+eVb9KL2tmz81M+n25dadZ9bU2zYXbYSmshNXwoOF+uJfn7obFcKfa /twMN8L1MNtBTQAAYO+ZSVfTdLqSLreoj0/n9eXe0jeUHmQ+3AoL1XZ/UfqR 5Wq77yg9yMPwS3gcfg0b4Ul4Gn4LW+F5eBl+D6/CH+F1+DP99Q71+dd5z6sc 42WOuZU1nmbNjZzD45zTw5zjSs55KdewkGuazzXONp5Xu8+pflb185rpgd8d AABgv/kQ/W/J4krGVvrIkruVDO5RWAvr1U7fuxmeVTt9b/Ei1d+38prNaqdv Xc+xHuXY97LWYtbWr9Jryj4sGXPJmkvmXD7l/UrZsyWTLu9dyj4u72Ca2fVq nivvY8renuug5ps2/b2L2q0JAADwX3azT/kQuv18AAAA2Pv0rOxn3djz3X6f BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAADsHW/a1I2aAAAAAAAAsJ91OyOEburGnr/W prlwOyyFlbAaHjTcD/fy3N2wGO5U25+b4Ua4HmY7qAkAAAAAAAC9aCZdTdPp Srrcoj4+ndeXe0tuVjK4+XCr2s7iSsa2XG3nbiWDexTWwnrYCE/CZngWtsLz 9CLV37fyms28ZyPHWMsxH2SN5ax5O+cwn3Oabayv3XXVa6vXN9MDvxN7W9mH JWMuWXPJnMunZNBlz5ZMumTTZR+XrLqZXa/muZJtl70910HNQx0YCIPp8DsM Ngw0dFIHAAAAAAAAel1/w8EWB1o0z/U3xqhzt6FwNAyHY2EkjIYT4WQYC+Nh IpwOk+FMmmpRH5/Mayfy3rEc60SOPZK1hrP2ULWT9zXX2O666rXVuv378P/S zJ6bmfT7cuuOsup/AFmW9vs= "], {{0, 26}, {2000, 0}}, {0, 255}, ColorFunction->RGBColor], BaseStyle->"ImageGraphics", ImageSize->Magnification[1], ImageSizeRaw->{2000, 26}, PlotRange->{{0, 2000}, {0, 26}}], GraphicsBox[RasterBox[CompressedData[" 1:eJy9lstOwkAUhhthQUJcuUBl5cr4GPoABvEJINGtCZoYng4Il4Z7gXAJYUHY QAi3GlYQPZ5/4pCm0pYC2uSDaXvmn5lzzpzpVfQl/HyiKMqrj3/CkffbWCwS f/TyzV387Snq4cYlc87gYbVaDbpB07SLRqMR6Pf7PiJSnOA+6h7kmBBz0+12 Tx30v/bgk9GZOvPAa7oejUYeC306AIz1wWjM/WAw8B9ZX4L1TDHGcDj02ulX KpUNbt79jKHBV1b66Fcul3fCYgzEJNTr9fxmfaldKpWoUChQPp8X/8ViUWB8 BhuLMRCPGvJqmz76QWOxWFCtVqNsNku5XE6AdqfToclkImxga7cGuT/M+uw/ ms/ntF6vqdlsUjKZFKCNC/pynTZxyLbb7bNt/sHcMpkMzWYzoVev1wW4xuOx WAdsbGIAH6ncJ7BNH/6FRjqdJl3XSV7T6VSsA76CDWxt9oSKOmLOH/RBLKEP LVVVN/qJRGKjDxsnfSZoN3/4CPNfrVa/5n+IvtH/iDHu9/G/2T/G/JT5A41U KiXm3Wq1xBhcx5zy0zK+Mj+Xy6XIf5n7EuQ/9sYh+Wneqy73r+3+2rX2OPh+ a31wqpHG5xbatvXtCDjW5wO1Z9UdzheXyPMRPrc6H49yvpvn/Y/fJ3/6ffUN AyH/6w== "], {{0, 26}, {24, 0}}, {0, 255}, ColorFunction->RGBColor], BaseStyle->"ImageGraphics", ImageSize->Magnification[1], ImageSizeRaw->{24, 26}, PlotRange->{{0, 24}, {0, 26}}]} }, AutoDelete->False, GridBoxItemSize->{"Columns" -> {Automatic, Scaled[0.6], Automatic}}, GridBoxSpacings->{"Columns" -> {{0}}, "Rows" -> {{0}}}], "Grid"], PaneBox[ StyleBox[ RowBox[{ "Background", " ", "images", " ", "and", " ", "text", " ", "colors", " ", "have", " ", "been", " ", "adjusted", " ", "for", " ", "editing", " ", RowBox[{"purposes", "."}]}], LineBreakWithin->False, FontFamily->"Helvetica", FontSize->12, FontColor->GrayLevel[0.4]], Alignment->Center, ImageSize->Scaled[0.5], ScrollPosition->{0., 0.}]}, Alignment->{Center, Center}], 2->""}, "1"]], "SlideShowNavigationBar", \ "FirstSlide", CellMargins->{{0, 0}, {0, 0}}, CellFrameLabelMargins->2, CellSize->{Inherited, 30}, TextAlignment->Center, CellTags->"SlideShowHeader"], Cell[TextData[{ "Building a Parser Generator in ", StyleBox["Mathematica", FontSlant->"Italic"], " " }], "Title", CellChangeTimes->{ 3.559948400406288*^9, {3.623149007393018*^9, 3.623149017953622*^9}}], Cell["Abdul Dakkak ", "Subtitle", CellChangeTimes->{{3.623149020315757*^9, 3.6231490292542677`*^9}, { 3.623155692573316*^9, 3.62315569510808*^9}, {3.62316263996581*^9, 3.623162640238049*^9}}] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell["This talk is about one thing", "Section", CellChangeTimes->{{3.623149042053*^9, 3.6231490472092953`*^9}, { 3.623149146035948*^9, 3.6231491476930428`*^9}}], Cell[CellGroupData[{ Cell["How to manage complexity in projects", "Subsection", CellChangeTimes->{{3.623149075311902*^9, 3.6231490851734667`*^9}, { 3.623149151010232*^9, 3.6231491524743156`*^9}}], Cell["\<\ We will try to motivate that by showing a simple parser generator\ \>", "Subsubsection", CellChangeTimes->{{3.623149158804678*^9, 3.623149175470631*^9}}] }, Open ]] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell["How does complexity arise?", "Section", CellChangeTimes->{{3.623149042053*^9, 3.6231490472092953`*^9}, { 3.623149226744564*^9, 3.6231492329269176`*^9}, 3.623155699753375*^9}], Cell[TextData[StyleBox["A hard problem to solve", FontColor->GrayLevel[0.5]]], "Subsection", CellChangeTimes->{{3.623149065775357*^9, 3.623149069116548*^9}, { 3.6231491170972924`*^9, 3.623149130258045*^9}, {3.62314923874225*^9, 3.62314924259247*^9}, {3.6231493210819597`*^9, 3.623149329024414*^9}}], Cell["A hard problem to express on a computer", "Subsection", CellChangeTimes->{{3.623149075311902*^9, 3.6231490851734667`*^9}, { 3.6231492456866474`*^9, 3.6231492516379876`*^9}}], Cell["Not thinking about the problem well enough", "Subsection", CellChangeTimes->{{3.623149075311902*^9, 3.6231490851734667`*^9}, { 3.6231492456866474`*^9, 3.6231492717291365`*^9}}], Cell["Not having a good foundation / good tools", "Subsection", CellChangeTimes->{{3.623149075311902*^9, 3.6231490851734667`*^9}, { 3.6231492456866474`*^9, 3.6231492973146*^9}, {3.6231494824421887`*^9, 3.623149484528308*^9}}], Cell["Not being able to reason about the code", "Subsection", CellChangeTimes->{{3.623149075311902*^9, 3.6231490851734667`*^9}, { 3.6231492456866474`*^9, 3.6231492973146*^9}, {3.6231494824421887`*^9, 3.623149484528308*^9}, {3.6231499326369386`*^9, 3.623149937045191*^9}}] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell["Not thinking about the problem well enough", "Section", CellChangeTimes->{{3.623149042053*^9, 3.6231490472092953`*^9}, { 3.6231493649514685`*^9, 3.623149371111821*^9}}], Cell[CellGroupData[{ Cell["Programming should start away from your computer", "Subsection", CellChangeTimes->{{3.623149065775357*^9, 3.623149069116548*^9}, { 3.6231491170972924`*^9, 3.623149130258045*^9}, {3.6231493728459206`*^9, 3.6231493804183536`*^9}}], Cell["Spend a few hours / days thinking about the problem", "Subsubsection", CellChangeTimes->{{3.623149388525817*^9, 3.6231494054807873`*^9}}], Cell["\<\ Look at other solutions \[LongDash] good source of inspirations / techniques\ \>", "Subsubsection", CellChangeTimes->{{3.623149388525817*^9, 3.6231494345434494`*^9}, 3.623155701081411*^9}], Cell["Maybe you figure out that this is not a problem after all", \ "Subsubsection", CellChangeTimes->{{3.623149388525817*^9, 3.623149459511877*^9}}] }, Open ]] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell["Not having a good foundation / good tools", "Section", CellChangeTimes->{{3.623149042053*^9, 3.6231490472092953`*^9}, 3.6231493649514685`*^9, {3.6231494871924605`*^9, 3.623149487436475*^9}}], Cell["How to solve a problem", "Subsection", CellChangeTimes->{{3.623149065775357*^9, 3.623149069116548*^9}, { 3.6231491170972924`*^9, 3.623149130258045*^9}}], Cell["How to manage complexity", "Subsection", CellChangeTimes->{{3.623149075311902*^9, 3.6231490851734667`*^9}}] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell["What\[CloseCurlyQuote]s a Parser Generator", "Section", CellChangeTimes->{{3.623149042053*^9, 3.6231490472092953`*^9}, 3.6231493649514685`*^9, {3.6231494871924605`*^9, 3.623149511342842*^9}}], Cell["\<\ Given a language grammar, it generates a finite state machine that either \ accepts or rejects the language given a string\ \>", "Subsection", CellChangeTimes->{{3.623149065775357*^9, 3.623149069116548*^9}, { 3.6231491170972924`*^9, 3.623149130258045*^9}, {3.6231495175141945`*^9, 3.6231495428186426`*^9}, {3.623149667366766*^9, 3.623149679180442*^9}}], Cell[CellGroupData[{ Cell["You probably use them all the time:", "Subsection", CellChangeTimes->{{3.623149075311902*^9, 3.6231490851734667`*^9}, { 3.6231496827236443`*^9, 3.6231497266591573`*^9}}], Cell[BoxData[ RowBox[{"StringMatchQ", "[", RowBox[{"\"\\"", ",", RowBox[{"\"\\"", "..."}]}], "]"}]], "Input", CellChangeTimes->{{3.62314972845426*^9, 3.623149750745535*^9}}] }, Open ]], Cell[CellGroupData[{ Cell["Is represented by the following state automaton", "Subsection", CellChangeTimes->{{3.623149075311902*^9, 3.6231490851734667`*^9}, { 3.6231496827236443`*^9, 3.6231497266591573`*^9}, {3.623149760150073*^9, 3.623149772850799*^9}}], Cell[BoxData[ RowBox[{"toGraph", "[", RowBox[{"lower", "[", RowBox[{"pattern", "[", "\"\\"", "]"}], "]"}], "]"}]], "Input", CellChangeTimes->{{3.623149546953879*^9, 3.6231496539249973`*^9}}] }, Open ]], Cell["Famous applications are lex/yacc", "Subsection", CellChangeTimes->{{3.623149075311902*^9, 3.6231490851734667`*^9}, { 3.6231496827236443`*^9, 3.623149688508975*^9}, {3.62315346282961*^9, 3.623153463981826*^9}}] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell["What are they used for?", "Section", CellChangeTimes->{{3.623149042053*^9, 3.6231490472092953`*^9}, 3.6231493649514685`*^9, {3.6231494871924605`*^9, 3.623149511342842*^9}, { 3.623149848585131*^9, 3.6231498587087097`*^9}}], Cell["\<\ Recall that a programming language is defined as: Parser \[Rule] Abstract Syntax Tree \[Rule] Low Level Representation \[Rule] \ Optmization \[Rule] Code Generation\ \>", "Subsection", CellChangeTimes->{{3.623149065775357*^9, 3.623149069116548*^9}, { 3.6231491170972924`*^9, 3.623149130258045*^9}, {3.6231495175141945`*^9, 3.6231495428186426`*^9}, {3.623149667366766*^9, 3.623149679180442*^9}, { 3.623153477132001*^9, 3.623153530000795*^9}, {3.623162663355361*^9, 3.623162683803452*^9}}] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[TextData[{ "Defining a parser generator in ", StyleBox["Mathematica", FontSlant->"Italic"], " " }], "Section", CellChangeTimes->{{3.623149042053*^9, 3.6231490472092953`*^9}, 3.6231493649514685`*^9, {3.6231494871924605`*^9, 3.623149511342842*^9}, { 3.623149848585131*^9, 3.6231498801709375`*^9}}], Cell["\<\ Given a language grammar, it generates a finite state machine that either \ accepts or rejects the language given a string\ \>", "Subsection", CellChangeTimes->{{3.623149065775357*^9, 3.623149069116548*^9}, { 3.6231491170972924`*^9, 3.623149130258045*^9}, {3.6231495175141945`*^9, 3.6231495428186426`*^9}, {3.623149667366766*^9, 3.623149679180442*^9}}] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell["Defining the architecture", "Section", CellChangeTimes->{{3.623149042053*^9, 3.6231490472092953`*^9}, 3.6231493649514685`*^9, {3.6231494871924605`*^9, 3.623149511342842*^9}, { 3.623149848585131*^9, 3.6231498801709375`*^9}, {3.6231500315865984`*^9, 3.623150033958734*^9}}], Cell[CellGroupData[{ Cell[TextData[{ "Language Definition \[Rule] Symbolic form of the definition \[Rule] \ Instruction bytecode \[Rule] Optimizations \[Rule] A ", StyleBox["Mathematica", FontSlant->"Italic"], " Virtual Machine" }], "Subsection", CellChangeTimes->{{3.623149065775357*^9, 3.623149069116548*^9}, { 3.6231491170972924`*^9, 3.623149130258045*^9}, {3.6231495175141945`*^9, 3.6231495428186426`*^9}, {3.623149667366766*^9, 3.623149679180442*^9}, { 3.62315005294382*^9, 3.623150100785556*^9}, 3.623155710348975*^9}], Cell["This architecture gives us a few nice features", "Subsubsection", CellChangeTimes->{{3.623150109350046*^9, 3.6231501447660713`*^9}, 3.6231504544627852`*^9}] }, Open ]] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell["The Parser\[CloseCurlyQuote]s Virtual Machine", "Section", CellChangeTimes->{{3.623149042053*^9, 3.6231490472092953`*^9}, 3.6231493649514685`*^9, {3.6231494871924605`*^9, 3.623149511342842*^9}, { 3.623149848585131*^9, 3.6231498801709375`*^9}, {3.6231503250453835`*^9, 3.6231503477656827`*^9}}], Cell[TextData[{ "This is a virtual machine defined in ", StyleBox["Mathematica", FontSlant->"Italic"], " that simulates what a computer would do" }], "Subsection", CellChangeTimes->{{3.623149065775357*^9, 3.623149069116548*^9}, { 3.6231491170972924`*^9, 3.623149130258045*^9}, {3.6231495175141945`*^9, 3.6231495428186426`*^9}, {3.623149667366766*^9, 3.623149679180442*^9}, { 3.623150333649875*^9, 3.623150380680565*^9}, {3.6231504188477488`*^9, 3.62315042570514*^9}}], Cell["\<\ Contains instructions like: save environment, jump to a location, increment \ the program counter, deal with captures, ....\ \>", "Subsection", CellChangeTimes->{{3.623149065775357*^9, 3.623149069116548*^9}, { 3.6231491170972924`*^9, 3.623149130258045*^9}, {3.6231495175141945`*^9, 3.6231495428186426`*^9}, {3.623149667366766*^9, 3.623149679180442*^9}, { 3.623150333649875*^9, 3.6231504430701337`*^9}}], Cell[CellGroupData[{ Cell["The chain of instructions can be complicated", "Subsection", CellChangeTimes->{{3.623149065775357*^9, 3.623149069116548*^9}, { 3.6231491170972924`*^9, 3.623149130258045*^9}, {3.6231495175141945`*^9, 3.6231495428186426`*^9}, {3.623149667366766*^9, 3.623149679180442*^9}, { 3.623150333649875*^9, 3.6231504430701337`*^9}, {3.6231536832325153`*^9, 3.6231536944430313`*^9}}], Cell[BoxData[ RowBox[{"toString", "[", RowBox[{"lower", "[", "binexp", "]"}], "]"}]], "Input", CellChangeTimes->{{3.623153726387965*^9, 3.6231537646047707`*^9}, { 3.623153819529367*^9, 3.623153820214517*^9}}], Cell[BoxData[ RowBox[{"toGraph", "[", RowBox[{"lower", "[", "binexp", "]"}], "]"}]], "Input", CellChangeTimes->{{3.623153830392095*^9, 3.623153835322194*^9}}] }, Open ]] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[TextData[{ "Language Definition \[Rule] Symbolic form of the definition \[Rule] \ Instruction bytecode \[Rule] Optimizations \[Rule] A ", StyleBox["Mathematica", FontSlant->"Italic"], " Virtual Machine" }], "Section", CellChangeTimes->{{3.623149042053*^9, 3.6231490472092953`*^9}, 3.6231493649514685`*^9, {3.6231494871924605`*^9, 3.623149511342842*^9}, { 3.623149848585131*^9, 3.6231498801709375`*^9}, {3.6231500315865984`*^9, 3.623150033958734*^9}, 3.623150179774074*^9, 3.6231557152745743`*^9}], Cell["\<\ You can define the initial grammar symbolically and bootstrap your parser \ generator (the symbolic form is what I will be showing here)\ \>", "Subsubsection", CellDingbat->"\[FilledSquare]", CellChangeTimes->{{3.623150148323275*^9, 3.6231502639008856`*^9}}], Cell[CellGroupData[{ Cell["\<\ Lowering to bytecode means handling less cases (less code / less bugs)\ \>", "Subsubsection", CellDingbat->"\[FilledSquare]", CellChangeTimes->{{3.623150148323275*^9, 3.623150246232875*^9}, { 3.623150464124338*^9, 3.6231504742709184`*^9}, 3.623155721265231*^9}], Cell[BoxData[ RowBox[{"toString", "[", RowBox[{"lower", "[", RowBox[{"zeroormore", "[", RowBox[{"pattern", "[", "\"\\"", "]"}], "]"}], "]"}], "]"}]], "Input", CellChangeTimes->{{3.6231502469189143`*^9, 3.623150311618615*^9}}], Cell[BoxData[ RowBox[{"toString", "[", RowBox[{"lower", "[", RowBox[{"oneormore", "[", RowBox[{"pattern", "[", "\"\\"", "]"}], "]"}], "]"}], "]"}]], "Input", CellChangeTimes->{{3.6231502469189143`*^9, 3.62315030348715*^9}}] }, Open ]], Cell[CellGroupData[{ Cell["Optimizations are done symbolically", "Subsubsection", CellDingbat->"\[FilledSquare]", CellChangeTimes->{{3.623150148323275*^9, 3.623150246232875*^9}, { 3.623150464124338*^9, 3.623150496084166*^9}}], Cell[BoxData[ RowBox[{"optimizeast", "[", RowBox[{"vm", ",", RowBox[{"zeroormore", "[", RowBox[{"zeroormore", "[", "\"\\"", "]"}], "]"}]}], "]"}]], "Input", CellChangeTimes->{{3.6231504977312603`*^9, 3.6231505218846416`*^9}}] }, Open ]], Cell[TextData[{ "Bytecode can be easily interpreted in ", StyleBox["Mathematica", FontSlant->"Italic"], " or synthesize C code from it" }], "Subsubsection", CellDingbat->"\[FilledSquare]", CellChangeTimes->{{3.623150148323275*^9, 3.623150246232875*^9}, { 3.623150464124338*^9, 3.623150496084166*^9}, {3.6231506421505203`*^9, 3.6231506669209375`*^9}, 3.623155724984558*^9}], Cell["\<\ Separating the concerns of the project allows me to: develop each part \ separately, reason about the code, and debug the code more easily\ \>", "Subsubsection", CellDingbat->"\[FilledSquare]", CellChangeTimes->{{3.623150148323275*^9, 3.623150246232875*^9}, { 3.623150464124338*^9, 3.623150496084166*^9}, {3.6231506421505203`*^9, 3.623150758831194*^9}, {3.6231557266065683`*^9, 3.62315572786865*^9}}] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell["Symbolic Definition Primitives", "Section", CellChangeTimes->{{3.623149042053*^9, 3.6231490472092953`*^9}, 3.6231493649514685`*^9, {3.6231494871924605`*^9, 3.623149511342842*^9}, { 3.623149848585131*^9, 3.6231498801709375`*^9}, {3.6231499121607676`*^9, 3.6231499214652996`*^9}, {3.623153881460669*^9, 3.623153889979435*^9}, 3.623155729836236*^9}], Cell[BoxData[ RowBox[{"patt", "=", RowBox[{"pattern", "[", "\"\\"", "]"}]}]], "Input", CellChangeTimes->{{3.6231499739223003`*^9, 3.6231499998057804`*^9}, { 3.623153892355526*^9, 3.6231538996841717`*^9}, {3.6231540022268467`*^9, 3.6231540028076153`*^9}}], Cell[BoxData[ RowBox[{"set", "[", RowBox[{"{", RowBox[{"patt", ",", "\"\\"", ",", "\"\\""}], "}"}], "]"}]], "Input", CellChangeTimes->{{3.6231539049603653`*^9, 3.623153933819252*^9}, { 3.623154006338189*^9, 3.623154006651618*^9}}], Cell[BoxData[ RowBox[{"seq", "[", RowBox[{"patt", ",", RowBox[{"pattern", "[", "\"\\"", "]"}]}], "]"}]], "Input", CellChangeTimes->{{3.6231539695999537`*^9, 3.623153978439283*^9}, { 3.62315401113095*^9, 3.623154011461277*^9}}], Cell[BoxData[ RowBox[{"range", "[", RowBox[{"{", RowBox[{"0", ",", "9"}], "}"}], "]"}]], "Input", CellChangeTimes->{{3.623154032169211*^9, 3.623154050437731*^9}}], Cell[BoxData[ RowBox[{"ordered", "[", RowBox[{"patt", ",", RowBox[{"pattern", "[", "\"\\"", "]"}]}], "]"}]], "Input", CellChangeTimes->{{3.623153981897587*^9, 3.6231540152126837`*^9}}], Cell[BoxData[ RowBox[{"zeroormore", "[", "patt", "]"}]], "Input", CellChangeTimes->{{3.62315394337403*^9, 3.6231539485884943`*^9}, { 3.623154018702941*^9, 3.623154019028935*^9}}], Cell[BoxData[ RowBox[{"oneormore", "[", "patt", "]"}]], "Input", CellChangeTimes->{{3.62315395120295*^9, 3.6231540231012077`*^9}}], Cell[BoxData[ RowBox[{"capnamed", "[", RowBox[{"\"\\"", ",", RowBox[{"pattern", "[", "\"\\"", "]"}]}], "]"}]], "Input", CellChangeTimes->{{3.62315408201155*^9, 3.623154139687193*^9}}] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell["Symbolic Definition Primitives are Inert", "Section", CellChangeTimes->{{3.623149042053*^9, 3.6231490472092953`*^9}, 3.6231493649514685`*^9, {3.6231494871924605`*^9, 3.623149511342842*^9}, { 3.623149848585131*^9, 3.6231498801709375`*^9}, {3.6231499121607676`*^9, 3.6231499214652996`*^9}, {3.623153881460669*^9, 3.623153889979435*^9}, { 3.623154164639194*^9, 3.623154165987727*^9}, 3.62315573110633*^9}], Cell["Allows for optimizations", "Subsubsection", CellChangeTimes->{{3.62315417365417*^9, 3.623154177279986*^9}}], Cell["Keeps things simple and one can debug certain scenarios", \ "Subsubsection", CellChangeTimes->{{3.623154180842843*^9, 3.623154206570606*^9}, 3.623155732831415*^9}], Cell["Separates the language parser from it\[CloseCurlyQuote]s compiler", \ "Subsubsection", CellChangeTimes->{{3.623154217574758*^9, 3.623154266849474*^9}, 3.623155734088583*^9}] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell["Lowering the high level primitives", "Section", CellChangeTimes->{{3.623149042053*^9, 3.6231490472092953`*^9}, 3.6231493649514685`*^9, {3.6231494871924605`*^9, 3.623149511342842*^9}, { 3.623149848585131*^9, 3.6231498801709375`*^9}, {3.6231499121607676`*^9, 3.6231499214652996`*^9}, {3.623153881460669*^9, 3.623153889979435*^9}, { 3.623154164639194*^9, 3.623154165987727*^9}, {3.623154273946888*^9, 3.6231542873758993`*^9}, 3.623155735228735*^9}], Cell["\<\ Works with the inert expressions and constructs a much lower byte code\ \>", "Subsubsection", CellChangeTimes->{{3.623154180842843*^9, 3.623154206570606*^9}, { 3.623154365773654*^9, 3.623154398074638*^9}, 3.62315443338918*^9}], Cell[CellGroupData[{ Cell["The primitives are still a bit high level", "Subsubsection", CellChangeTimes->{{3.62315417365417*^9, 3.623154177279986*^9}, { 3.6231542910063963`*^9, 3.623154297194068*^9}, 3.623155736339875*^9}], Cell[BoxData[ RowBox[{ RowBox[{"oneormore", "[", "a", "]"}], "~", RowBox[{"seq", "[", RowBox[{"a", ",", " ", RowBox[{"zeroormore", "[", "a", "]"}]}], "]"}]}]], "Code", CellChangeTimes->{{3.623154298834403*^9, 3.6231543512026167`*^9}}] }, Open ]], Cell[CellGroupData[{ Cell["Generates a Virtual Machine instance", "Subsubsection", CellChangeTimes->{{3.623154180842843*^9, 3.623154206570606*^9}, { 3.623154365773654*^9, 3.623154398074638*^9}, {3.62315443338918*^9, 3.623154446782172*^9}}], Cell[BoxData[ RowBox[{"vm", "=", RowBox[{"lower", "[", RowBox[{"oneormore", "[", "\"\\"", "]"}], "]"}]}]], "Input", CellChangeTimes->{{3.623154462486237*^9, 3.623154500947652*^9}}], Cell[BoxData[ RowBox[{"toString", "[", "vm", "]"}]], "Input", CellChangeTimes->{{3.62315445276103*^9, 3.62315447962682*^9}}] }, Open ]], Cell["\<\ Not something that you\[CloseCurlyQuote]d want to read, but you can easily \ create machine instructions from this representation\ \>", "Subsubsection", CellChangeTimes->{{3.623154217574758*^9, 3.623154266849474*^9}, { 3.6231545097600737`*^9, 3.6231545317743464`*^9}}] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell["Dealing with complexity \[LongDash] Visualization", "Section", CellChangeTimes->{{3.623149042053*^9, 3.6231490472092953`*^9}, 3.6231493649514685`*^9, {3.6231494871924605`*^9, 3.623149511342842*^9}, { 3.623149848585131*^9, 3.6231498801709375`*^9}, {3.6231499121607676`*^9, 3.6231499214652996`*^9}}], Cell[CellGroupData[{ Cell[TextData[{ StyleBox["Mathematica", FontSlant->"Italic"], "\[CloseCurlyQuote]s visualization makes it easy to visualize the generated \ code" }], "Subsubsection", CellChangeTimes->{{3.623154217574758*^9, 3.623154266849474*^9}, { 3.6231545097600737`*^9, 3.623154567859487*^9}}], Cell[BoxData["identifier"], "Input", CellChangeTimes->{{3.6231499739223003`*^9, 3.6231499998057804`*^9}}], Cell[BoxData[{ RowBox[{ RowBox[{"vm", "=", RowBox[{"lower", "[", "identifier", "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{"toString", "[", "vm", "]"}]}], "Input", CellChangeTimes->{{3.623149980952702*^9, 3.623150008068253*^9}}], Cell[BoxData[ RowBox[{"toGraph", "[", "vm", "]"}]], "Input", CellChangeTimes->{{3.623149952753089*^9, 3.6231499625316486`*^9}, { 3.623150011406444*^9, 3.6231500115824537`*^9}}] }, Open ]] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell["Examples", "Section", CellChangeTimes->{{3.623149042053*^9, 3.6231490472092953`*^9}, 3.6231493649514685`*^9, {3.6231494871924605`*^9, 3.623149511342842*^9}, { 3.623149848585131*^9, 3.6231498801709375`*^9}, {3.6231499121607676`*^9, 3.6231499214652996`*^9}, {3.623154587582244*^9, 3.6231545885474*^9}}], Cell[CellGroupData[{ Cell["Define an integer", "Subsubsection", CellChangeTimes->{{3.623154928828103*^9, 3.623154931087226*^9}}], Cell[BoxData[{ RowBox[{ RowBox[{"digit", "=", RowBox[{"range", "[", RowBox[{"{", RowBox[{"0", ",", "9"}], "}"}], "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{"int", "=", RowBox[{"oneormore", "[", "digit", "]"}]}]}], "Input", CellChangeTimes->{{3.62315476499501*^9, 3.6231547803779163`*^9}}] }, Open ]], Cell[CellGroupData[{ Cell["We can parse the integer to a name", "Subsubsection", CellChangeTimes->{{3.623154933758634*^9, 3.6231549557922907`*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"CompileGrammar", "[", RowBox[{"named", "[", RowBox[{"\"\\"", ",", "int"}], "]"}], "]"}], "[", "\"\<2321\>\"", "]"}]], "Input", CellChangeTimes->{{3.6231499739223003`*^9, 3.6231499998057804`*^9}, { 3.6231545946293793`*^9, 3.623154595217742*^9}, {3.623154633834076*^9, 3.623154784141006*^9}, {3.623154837924396*^9, 3.623154844362838*^9}}] }, Open ]], Cell[CellGroupData[{ Cell["A binary operator is int [+-] int", "Subsubsection", CellChangeTimes->{{3.623154961676107*^9, 3.62315497581558*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"CompileGrammar", "[", RowBox[{"capturegroup", "[", RowBox[{"seq", "[", RowBox[{ RowBox[{"named", "[", RowBox[{"\"\\"", ",", "int"}], "]"}], ",", RowBox[{"named", "[", RowBox[{"\"\\"", ",", RowBox[{"set", "[", "\"\<+-\>\"", "]"}]}], "]"}], ",", RowBox[{"named", "[", RowBox[{"\"\\"", ",", "int"}], "]"}]}], "]"}], "]"}], "]"}], "[", "\"\<2321+21\>\"", "]"}]], "Input", CellChangeTimes->{{3.6231548407187023`*^9, 3.62315490360771*^9}}] }, Open ]], Cell[CellGroupData[{ Cell["You cannot have spaces in your input", "Subsubsection", CellChangeTimes->{{3.6231549825041523`*^9, 3.6231549902019157`*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"CompileGrammar", "[", RowBox[{"capturegroup", "[", RowBox[{"seq", "[", RowBox[{ RowBox[{"named", "[", RowBox[{"\"\\"", ",", "int"}], "]"}], ",", RowBox[{"named", "[", RowBox[{"\"\\"", ",", RowBox[{"set", "[", "\"\<+-\>\"", "]"}]}], "]"}], ",", RowBox[{"named", "[", RowBox[{"\"\\"", ",", "int"}], "]"}]}], "]"}], "]"}], "]"}], "[", "\"\<2321 + 21\>\"", "]"}]], "Input", CellChangeTimes->{{3.6231548407187023`*^9, 3.6231549161788673`*^9}}] }, Open ]], Cell[CellGroupData[{ Cell["We can allow spacing between the parts of the expression", \ "Subsubsection", CellChangeTimes->{{3.6231549825041523`*^9, 3.6231549902019157`*^9}, { 3.623155069316578*^9, 3.623155079873165*^9}}], Cell[BoxData["spacing"], "Input", CellChangeTimes->{{3.6231550807607307`*^9, 3.6231550813235188`*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"CompileGrammar", "[", RowBox[{"capturegroup", "[", RowBox[{"seq", "[", RowBox[{ RowBox[{"named", "[", RowBox[{"\"\\"", ",", "int"}], "]"}], ",", "spacing", ",", RowBox[{"named", "[", RowBox[{"\"\\"", ",", RowBox[{"set", "[", "\"\<+-\>\"", "]"}]}], "]"}], ",", "spacing", ",", RowBox[{"named", "[", RowBox[{"\"\\"", ",", "int"}], "]"}]}], "]"}], "]"}], "]"}], "[", "\"\<2321 + 21\>\"", "]"}]], "Input", CellChangeTimes->{{3.623155002017223*^9, 3.623155005827599*^9}}] }, Open ]], Cell[CellGroupData[{ Cell["We are interpreting a non-trivial state machine", "Subsubsection", CellChangeTimes->{{3.623155091037901*^9, 3.6231551072591677`*^9}}], Cell[BoxData[ RowBox[{"toGraph", "[", RowBox[{"lower", "[", RowBox[{"capturegroup", "[", RowBox[{"seq", "[", RowBox[{ RowBox[{"named", "[", RowBox[{"\"\\"", ",", "int"}], "]"}], ",", "spacing", ",", RowBox[{"named", "[", RowBox[{"\"\\"", ",", RowBox[{"set", "[", "\"\<+-\>\"", "]"}]}], "]"}], ",", "spacing", ",", RowBox[{"named", "[", RowBox[{"\"\\"", ",", "int"}], "]"}]}], "]"}], "]"}], "]"}], "]"}]], "Input", CellChangeTimes->{{3.623155028059126*^9, 3.623155035035812*^9}}] }, Open ]] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell["What is not working", "Section", CellChangeTimes->{{3.623149042053*^9, 3.6231490472092953`*^9}, 3.6231493649514685`*^9, {3.6231494871924605`*^9, 3.623149511342842*^9}, { 3.623149848585131*^9, 3.6231498801709375`*^9}, {3.6231499121607676`*^9, 3.6231499214652996`*^9}, {3.623154587582244*^9, 3.6231545885474*^9}, { 3.6231551657322817`*^9, 3.623155166174057*^9}, {3.6231553206726103`*^9, 3.62315532193882*^9}}], Cell[CellGroupData[{ Cell["The main thing is capturing of subexpressions", "Subsection", CellChangeTimes->{{3.623155325840028*^9, 3.623155335461285*^9}}], Cell[BoxData["ifstmt"], "Input", CellChangeTimes->{{3.6231551797691813`*^9, 3.62315518076989*^9}, { 3.623155216646858*^9, 3.623155217608616*^9}}], Cell[BoxData[ RowBox[{"toString", "[", RowBox[{"lower", "[", "ifstmt", "]"}], "]"}]], "Input", CellChangeTimes->{{3.623155375080975*^9, 3.623155382342341*^9}}] }, Open ]], Cell[CellGroupData[{ Cell["\<\ This matches the statement, but fails to capture it\[CloseCurlyQuote]s \ components\ \>", "Subsection", CellChangeTimes->{{3.623155409436376*^9, 3.6231554234337254`*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"CompileGrammar", "[", "ifstmt", "]"}], "[", "\"\ 3) { a = 2; } else { a = 4; }\>\"", "]"}]], "Input", CellChangeTimes->{{3.623155282942141*^9, 3.623155306183928*^9}}] }, Open ]], Cell["\<\ Errors are useful for debugging the generator, not the grammar\ \>", "Subsection", CellChangeTimes->{{3.623155409436376*^9, 3.6231554234337254`*^9}, { 3.623155517526763*^9, 3.623155534807708*^9}}] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell["Lessons", "Section", CellChangeTimes->{{3.623149042053*^9, 3.6231490472092953`*^9}, 3.6231493649514685`*^9, {3.6231494871924605`*^9, 3.623149511342842*^9}, { 3.623149848585131*^9, 3.6231498801709375`*^9}, {3.6231499121607676`*^9, 3.6231499214652996`*^9}, {3.623154587582244*^9, 3.6231545885474*^9}, { 3.6231551657322817`*^9, 3.623155166174057*^9}, {3.6231553206726103`*^9, 3.62315532193882*^9}, {3.6231555438401203`*^9, 3.623155544693585*^9}}], Cell[CellGroupData[{ Cell["Separate the components of the projects into subsections", "Subsection", CellChangeTimes->{{3.623155325840028*^9, 3.623155335461285*^9}, { 3.6231555500824213`*^9, 3.6231555519211597`*^9}, {3.623155592146784*^9, 3.6231555988760147`*^9}, 3.623155740754012*^9}], Cell["\<\ Can then implement each section separately Debugging can be isolated into one component Might not be the most efficient, but generators are not supposed to (they \ just need to generate efficient code)\ \>", "Subsubsection", CellChangeTimes->{{3.623155325840028*^9, 3.623155335461285*^9}, { 3.6231555500824213`*^9, 3.6231555519211597`*^9}, {3.623155592146784*^9, 3.623155676834025*^9}, 3.623155742602648*^9}] }, Open ]] }, Open ]] }, Open ]] }, WindowSize->{1366, 768}, WindowMargins->{{0, Automatic}, {Automatic, 0}}, TaggingRules->{"SlideShow" -> True}, FrontEndVersion->"10.1 for Linux x86 (64-bit) (October 21, 2014)", StyleDefinitions->"Default.nb" ] (* End of Notebook Content *) (* Internal cache information *) (*CellTagsOutline CellTagsIndex->{ "SlideShowHeader"->{ Cell[580, 22, 4250, 94, 75, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[5279, 135, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[5961, 160, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[7478, 197, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[8576, 231, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[9196, 251, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[11027, 304, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[11912, 330, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[12734, 357, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[13887, 391, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[16052, 448, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[19084, 535, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[21257, 600, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[22299, 629, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[24515, 692, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[25828, 734, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[30452, 874, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[32156, 927, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"]} } *) (*CellTagsIndex CellTagsIndex->{ {"SlideShowHeader", 33809, 971} } *) (*NotebookFileOutline Notebook[{ Cell[CellGroupData[{ Cell[580, 22, 4250, 94, 75, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[4833, 118, 209, 7, 93, "Title"], Cell[5045, 127, 197, 3, 51, "Subtitle"] }, Open ]], Cell[CellGroupData[{ Cell[5279, 135, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[5368, 140, 163, 2, 65, "Section"], Cell[CellGroupData[{ Cell[5556, 146, 177, 2, 45, "Subsection"], Cell[5736, 150, 164, 3, 35, "Subsubsection"] }, Open ]] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[5961, 160, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[6050, 165, 184, 2, 65, "Section"], Cell[6237, 169, 305, 4, 45, "Subsection"], Cell[6545, 175, 182, 2, 37, "Subsection"], Cell[6730, 179, 185, 2, 37, "Subsection"], Cell[6918, 183, 231, 3, 37, "Subsection"], Cell[7152, 188, 277, 3, 37, "Subsection"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[7478, 197, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[7567, 202, 177, 2, 65, "Section"], Cell[CellGroupData[{ Cell[7769, 208, 240, 3, 45, "Subsection"], Cell[8012, 213, 144, 1, 35, "Subsubsection"], Cell[8159, 216, 203, 4, 29, "Subsubsection"], Cell[8365, 222, 150, 2, 29, "Subsubsection"] }, Open ]] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[8576, 231, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[8665, 236, 201, 2, 65, "Section"], Cell[8869, 240, 161, 2, 45, "Subsection"], Cell[9033, 244, 114, 1, 37, "Subsection"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[9196, 251, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[9285, 256, 202, 2, 65, "Section"], Cell[9490, 260, 368, 6, 45, "Subsection"], Cell[CellGroupData[{ Cell[9883, 270, 178, 2, 37, "Subsection"], Cell[10064, 274, 196, 4, 32, "Input"] }, Open ]], Cell[CellGroupData[{ Cell[10297, 283, 239, 3, 45, "Subsection"], Cell[10539, 288, 203, 4, 32, "Input"] }, Open ]], Cell[10757, 295, 221, 3, 45, "Subsection"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[11027, 304, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[11116, 309, 235, 3, 65, "Section"], Cell[11354, 314, 509, 10, 96, "Subsection"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[11912, 330, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[12001, 335, 313, 8, 65, "Section"], Cell[12317, 345, 368, 6, 45, "Subsection"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[12734, 357, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[12823, 362, 289, 4, 65, "Section"], Cell[CellGroupData[{ Cell[13137, 370, 519, 10, 45, "Subsection"], Cell[13659, 382, 167, 2, 35, "Subsubsection"] }, Open ]] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[13887, 391, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[13976, 396, 311, 4, 65, "Section"], Cell[14290, 402, 483, 10, 45, "Subsection"], Cell[14776, 414, 420, 7, 37, "Subsection"], Cell[CellGroupData[{ Cell[15221, 425, 386, 5, 37, "Subsection"], Cell[15610, 432, 215, 4, 32, "Input"], Cell[15828, 438, 163, 3, 32, "Input"] }, Open ]] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[16052, 448, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[16141, 453, 518, 10, 101, "Section"], Cell[16662, 465, 270, 5, 35, "Subsubsection"], Cell[CellGroupData[{ Cell[16957, 474, 276, 5, 29, "Subsubsection"], Cell[17236, 481, 243, 5, 32, "Input"], Cell[17482, 488, 241, 5, 32, "Input"] }, Open ]], Cell[CellGroupData[{ Cell[17760, 498, 208, 3, 35, "Subsubsection"], Cell[17971, 503, 243, 5, 32, "Input"] }, Open ]], Cell[18229, 511, 386, 9, 35, "Subsubsection"], Cell[18618, 522, 417, 7, 29, "Subsubsection"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[19084, 535, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[19173, 540, 368, 5, 65, "Section"], Cell[19544, 547, 268, 5, 32, "Input"], Cell[19815, 554, 252, 6, 32, "Input"], Cell[20070, 562, 241, 5, 32, "Input"], Cell[20314, 569, 171, 4, 32, "Input"], Cell[20488, 575, 197, 4, 32, "Input"], Cell[20688, 581, 182, 3, 32, "Input"], Cell[20873, 586, 132, 2, 32, "Input"], Cell[21008, 590, 200, 4, 32, "Input"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[21257, 600, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[21346, 605, 423, 5, 65, "Section"], Cell[21772, 612, 114, 1, 35, "Subsubsection"], Cell[21889, 615, 174, 3, 29, "Subsubsection"], Cell[22066, 620, 184, 3, 29, "Subsubsection"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[22299, 629, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[22388, 634, 470, 6, 65, "Section"], Cell[22861, 642, 240, 4, 35, "Subsubsection"], Cell[CellGroupData[{ Cell[23126, 650, 205, 2, 29, "Subsubsection"], Cell[23334, 654, 250, 6, 51, "Code"] }, Open ]], Cell[CellGroupData[{ Cell[23621, 665, 224, 3, 35, "Subsubsection"], Cell[23848, 670, 193, 4, 32, "Input"], Cell[24044, 676, 126, 2, 32, "Input"] }, Open ]], Cell[24185, 681, 281, 5, 35, "Subsubsection"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[24515, 692, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[24604, 697, 315, 4, 65, "Section"], Cell[CellGroupData[{ Cell[24944, 705, 287, 7, 35, "Subsubsection"], Cell[25234, 714, 106, 1, 32, "Input"], Cell[25343, 717, 241, 5, 55, "Input"], Cell[25587, 724, 180, 3, 32, "Input"] }, Open ]] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[25828, 734, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[25917, 739, 318, 4, 65, "Section"], Cell[CellGroupData[{ Cell[26260, 747, 108, 1, 35, "Subsubsection"], Cell[26371, 750, 316, 8, 55, "Input"] }, Open ]], Cell[CellGroupData[{ Cell[26724, 763, 127, 1, 35, "Subsubsection"], Cell[26854, 766, 395, 8, 32, "Input"] }, Open ]], Cell[CellGroupData[{ Cell[27286, 779, 123, 1, 36, "Subsubsection"], Cell[27412, 782, 557, 14, 32, "Input"] }, Open ]], Cell[CellGroupData[{ Cell[28006, 801, 131, 1, 35, "Subsubsection"], Cell[28140, 804, 562, 14, 32, "Input"] }, Open ]], Cell[CellGroupData[{ Cell[28739, 823, 202, 3, 35, "Subsubsection"], Cell[28944, 828, 103, 1, 32, "Input"], Cell[29050, 831, 590, 14, 55, "Input"] }, Open ]], Cell[CellGroupData[{ Cell[29677, 850, 140, 1, 35, "Subsubsection"], Cell[29820, 853, 571, 14, 32, "Input"] }, Open ]] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[30452, 874, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[30541, 879, 432, 6, 65, "Section"], Cell[CellGroupData[{ Cell[30998, 889, 133, 1, 45, "Subsection"], Cell[31134, 892, 148, 2, 32, "Input"], Cell[31285, 896, 164, 3, 32, "Input"] }, Open ]], Cell[CellGroupData[{ Cell[31486, 904, 181, 4, 45, "Subsection"], Cell[31670, 910, 213, 4, 32, "Input"] }, Open ]], Cell[31898, 917, 209, 4, 45, "Subsection"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[32156, 927, 64, 1, 74, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[32245, 932, 468, 6, 65, "Section"], Cell[CellGroupData[{ Cell[32738, 942, 272, 3, 45, "Subsection"], Cell[33013, 947, 426, 8, 83, "Subsubsection"] }, Open ]] }, Open ]] }, Open ]] } ] *) (* End of internal cache information *)