Created
November 13, 2022 18:22
-
-
Save bobbicodes/75a1e0ef7f3b3cf94fd5ab6b8c48af38 to your computer and use it in GitHub Desktop.
Transcript: Mark Engelberg - Instaparse
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[[{"text": "good morning I'm mark Engelbert welcome", "start": 0.03, "duration": 4.88}, {"text": "to closure West it's exciting to be here", "start": 2.28, "duration": 6.06}, {"text": "it's the first talk of the first morning", "start": 4.91, "duration": 5.71}, {"text": "and I feel like I should be hijacking", "start": 8.34, "duration": 4.29}, {"text": "this time slot to give a keynote and set", "start": 10.62, "duration": 4.13}, {"text": "the future of closures something but", "start": 12.63, "duration": 6.409}, {"text": "we're here to talk about insta parse", "start": 14.75, "duration": 4.289}, {"text": "let's begin with a little warm-up it's", "start": 19.91, "duration": 4.51}, {"text": "the morning get to get the brains going", "start": 22.65, "duration": 8.039}, {"text": "so what's this any it's a map it's a map", "start": 24.42, "duration": 9.6}, {"text": "its closure data right this is the Eden", "start": 30.689, "duration": 5.911}, {"text": "format we all know and love and one of", "start": 34.02, "duration": 4.35}, {"text": "the beautiful things about closer for", "start": 36.6, "duration": 3.36}, {"text": "those of you who are here trying out", "start": 38.37, "duration": 5.13}, {"text": "closure you know relatively recently one", "start": 39.96, "duration": 4.829}, {"text": "of the things in my opinion that is the", "start": 43.5, "duration": 2.82}, {"text": "most exciting thing about closure it", "start": 44.789, "duration": 4.321}, {"text": "gives us these great lightweight ways to", "start": 46.32, "duration": 6.21}, {"text": "express data to model our data and it", "start": 49.11, "duration": 6.629}, {"text": "gives us a huge toolkit for manipulating", "start": 52.53, "duration": 6.09}, {"text": "that data so once we can get things in", "start": 55.739, "duration": 5.061}, {"text": "this form we're really really happy", "start": 58.62, "duration": 7.98}, {"text": "now what's this yeah it's just a string", "start": 60.8, "duration": 8.02}, {"text": "it's got the same information in there", "start": 66.6, "duration": 3.66}, {"text": "but we can't really do anything with it", "start": 68.82, "duration": 4.32}, {"text": "yet right the good news is that built", "start": 70.26, "duration": 4.5}, {"text": "right into closure in the closure", "start": 73.14, "duration": 3.96}, {"text": "edan namespace is the read string", "start": 74.76, "duration": 4.44}, {"text": "function and if we apply the function to", "start": 77.1, "duration": 5.519}, {"text": "this string we get back that map that we", "start": 79.2, "duration": 5.37}, {"text": "can actually work with and that's also", "start": 82.619, "duration": 3.451}, {"text": "another really wonderful thing about", "start": 84.57, "duration": 4.14}, {"text": "closure is how easy it is to write out", "start": 86.07, "duration": 4.77}, {"text": "and read back in this kind of data we", "start": 88.71, "duration": 7.159}, {"text": "like working with okay how about this", "start": 90.84, "duration": 5.029}, {"text": "anyone recognize this yeah this is a", "start": 96.229, "duration": 7.6}, {"text": "JSON that's been read in as a string and", "start": 100.729, "duration": 5.82}, {"text": "we can't really work with it just yet", "start": 103.829, "duration": 5.82}, {"text": "but we have this function in the closure", "start": 106.549, "duration": 7.0}, {"text": "data Jason's namespace read stir that", "start": 109.649, "duration": 6.15}, {"text": "lets us read this in and get that", "start": 113.549, "duration": 6.091}, {"text": "closure map we want to work with how", "start": 115.799, "duration": 7.041}, {"text": "about this this one's a little trickier", "start": 119.64, "duration": 5.7}, {"text": "yeah exactly this is what you get if you", "start": 122.84, "duration": 7.479}, {"text": "slurp in a CSV file now we have a way to", "start": 125.34, "duration": 7.02}, {"text": "read in CSV files but notice you don't", "start": 130.319, "duration": 2.791}, {"text": "get a", "start": 132.36, "duration": 2.88}, {"text": "exactly what you want because it reads", "start": 133.11, "duration": 4.26}, {"text": "in that first row which was meant to be", "start": 135.24, "duration": 4.23}, {"text": "header information sort of as its own", "start": 137.37, "duration": 4.59}, {"text": "row so maybe this isn't exactly what you", "start": 139.47, "duration": 5.58}, {"text": "want but it's at least a good start", "start": 141.96, "duration": 5.49}, {"text": "right once we get this into our closure", "start": 145.05, "duration": 5.91}, {"text": "format we have ways of working with it", "start": 147.45, "duration": 6.48}, {"text": "massaging it into the map format we're", "start": 150.96, "duration": 6.75}, {"text": "looking for and this everyone knows this", "start": 153.93, "duration": 9.93}, {"text": "right so this is XML read in as a string", "start": 157.71, "duration": 9.9}, {"text": "and again we have a way to bring it into", "start": 163.86, "duration": 6.27}, {"text": "closure and work with it what we get", "start": 167.61, "duration": 4.62}, {"text": "back is some sort of generic tree", "start": 170.13, "duration": 4.77}, {"text": "structure that then we can work with and", "start": 172.23, "duration": 6.03}, {"text": "further refine it into what we want now", "start": 174.9, "duration": 6.059}, {"text": "the good news is that most of the time", "start": 178.26, "duration": 4.229}, {"text": "we're working with one of these standard", "start": 180.959, "duration": 3.631}, {"text": "formats we're working with Eden", "start": 182.489, "duration": 6.841}, {"text": "hopefully or possibly JSON CSV XML you", "start": 184.59, "duration": 6.84}, {"text": "know I mean what at least 90 percent of", "start": 189.33, "duration": 4.17}, {"text": "the time but these are not the only", "start": 191.43, "duration": 4.49}, {"text": "things you're gonna encounter", "start": 193.5, "duration": 4.56}, {"text": "what if someone gives you a file that", "start": 195.92, "duration": 5.95}, {"text": "looks like this I mean who would who on", "start": 198.06, "duration": 5.82}, {"text": "earth would represent a map this way", "start": 201.87, "duration": 4.92}, {"text": "that that's kind of a dig I guess but", "start": 203.88, "duration": 4.62}, {"text": "the I mean this is this is how Scala", "start": 206.79, "duration": 3.75}, {"text": "represents maps and and the point is", "start": 208.5, "duration": 3.989}, {"text": "that different communities represent", "start": 210.54, "duration": 5.699}, {"text": "their Maps differently or what if", "start": 212.489, "duration": 7.321}, {"text": "someone hands you a bunch of cave data", "start": 216.239, "duration": 6.75}, {"text": "in some kind of unusual exotic format", "start": 219.81, "duration": 5.07}, {"text": "that you know kind of looks almost like", "start": 222.989, "duration": 4.321}, {"text": "JSON if you look at it funny but it's", "start": 224.88, "duration": 6.96}, {"text": "not quite JSON or what if you want to", "start": 227.31, "duration": 7.29}, {"text": "work with you know like a Python config", "start": 231.84, "duration": 7.32}, {"text": "file or what if you want to make your", "start": 234.6, "duration": 7.23}, {"text": "own programming language or your own DSL", "start": 239.16, "duration": 4.44}, {"text": "for something all of these are things", "start": 241.83, "duration": 5.58}, {"text": "that you want to as quickly as possible", "start": 243.6, "duration": 6.21}, {"text": "get them into your closure Eden format", "start": 247.41, "duration": 4.23}, {"text": "so that you can work with them and do", "start": 249.81, "duration": 6.6}, {"text": "things with them and those last three", "start": 251.64, "duration": 6.689}, {"text": "examples by the way are all problems", "start": 256.41, "duration": 4.56}, {"text": "that were solved by actual users in the", "start": 258.329, "duration": 4.681}, {"text": "closure community with the insta parse", "start": 260.97, "duration": 4.98}, {"text": "library so now is the opportunity to", "start": 263.01, "duration": 3.51}, {"text": "kind of say", "start": 265.95, "duration": 2.48}, {"text": "way and start talking about insta parse", "start": 266.52, "duration": 4.41}, {"text": "but first I want to outline a couple key", "start": 268.43, "duration": 5.199}, {"text": "concepts so for the purposes of this", "start": 270.93, "duration": 6.769}, {"text": "talk I'm defining a parser to be a", "start": 273.629, "duration": 6.931}, {"text": "function that takes a string as an input", "start": 277.699, "duration": 7.18}, {"text": "and produces closure data as an output", "start": 280.56, "duration": 6.69}, {"text": "so all those things we saw before the", "start": 284.879, "duration": 5.341}, {"text": "you know the read XML Strunk ssin the", "start": 287.25, "duration": 5.099}, {"text": "read CSV function those are all examples", "start": 290.22, "duration": 7.14}, {"text": "of parsers and the idea is we want to be", "start": 292.349, "duration": 7.47}, {"text": "able to create parsers for these other", "start": 297.36, "duration": 7.41}, {"text": "kinds of formats well to understand how", "start": 299.819, "duration": 6.871}, {"text": "to create a parser first we need to ask", "start": 304.77, "duration": 3.84}, {"text": "the question how do we describe the", "start": 306.69, "duration": 5.969}, {"text": "structure of data well we can take a cue", "start": 308.61, "duration": 7.04}, {"text": "from automata theory in computer science", "start": 312.659, "duration": 5.401}, {"text": "automata theory describes two very", "start": 315.65, "duration": 5.859}, {"text": "important classes of data there's the", "start": 318.06, "duration": 5.07}, {"text": "kind of data that can be represented", "start": 321.509, "duration": 3.84}, {"text": "with regular expressions and those", "start": 323.13, "duration": 4.74}, {"text": "happen to correspond to data that can be", "start": 325.349, "duration": 5.97}, {"text": "processed with a state machine and then", "start": 327.87, "duration": 6.72}, {"text": "we also have this wonderful this", "start": 331.319, "duration": 5.511}, {"text": "wonderful language for expressing", "start": 334.59, "duration": 5.1}, {"text": "context-free grammars which is another", "start": 336.83, "duration": 5.199}, {"text": "class of which describes another class", "start": 339.69, "duration": 4.379}, {"text": "of data that can be processed with", "start": 342.029, "duration": 5.75}, {"text": "something called a pushdown automaton", "start": 344.069, "duration": 3.71}, {"text": "now the good news is that we have great", "start": 348.139, "duration": 5.77}, {"text": "support for regular expressions built in", "start": 351.81, "duration": 5.699}, {"text": "just about every modern language however", "start": 353.909, "duration": 6.87}, {"text": "there's many kinds of data that cannot", "start": 357.509, "duration": 5.16}, {"text": "be expressed well with a regular", "start": 360.779, "duration": 4.741}, {"text": "expression but can be expressed with a", "start": 362.669, "duration": 5.011}, {"text": "context-free grammar and unfortunately", "start": 365.52, "duration": 4.11}, {"text": "we don't have very good support in our", "start": 367.68, "duration": 4.829}, {"text": "languages for context-free grammars at", "start": 369.63, "duration": 4.649}, {"text": "least not that same kind of rich support", "start": 372.509, "duration": 4.951}, {"text": "that we have for regular expressions and", "start": 374.279, "duration": 6.5}, {"text": "I think that's kind of a shame because", "start": 377.46, "duration": 6.81}, {"text": "when a context-free grammar describes", "start": 380.779, "duration": 6.551}, {"text": "your data it automatically is also", "start": 384.27, "duration": 6.75}, {"text": "describing a tree structure that is in", "start": 387.33, "duration": 6.089}, {"text": "that data and that's called the", "start": 391.02, "duration": 4.56}, {"text": "derivation tree I literally walked over", "start": 393.419, "duration": 5.37}, {"text": "to my shelf for this slide and I pulled", "start": 395.58, "duration": 4.56}, {"text": "off the automaton", "start": 398.789, "duration": 3.931}, {"text": "book off the shelf flipped it open and", "start": 400.14, "duration": 4.74}, {"text": "open it up to the first context-free", "start": 402.72, "duration": 6.27}, {"text": "grammar I saw and copied it down and", "start": 404.88, "duration": 6.33}, {"text": "then in the book there is a picture of", "start": 408.99, "duration": 4.8}, {"text": "the derivation tree for that grammar for", "start": 411.21, "duration": 5.88}, {"text": "that particular string a a VBA a so you", "start": 413.79, "duration": 6.96}, {"text": "the how many of you have never seen a", "start": 417.09, "duration": 6.45}, {"text": "context-free grammar before it's okay so", "start": 420.75, "duration": 5.25}, {"text": "you know not not everybody's seen it but", "start": 423.54, "duration": 4.65}, {"text": "the basic idea is it's a series of rules", "start": 426.0, "duration": 5.22}, {"text": "and usually the implication is that the", "start": 428.19, "duration": 5.49}, {"text": "first rule is kind of your starting", "start": 431.22, "duration": 5.1}, {"text": "point so we have this label s and the", "start": 433.68, "duration": 4.35}, {"text": "first thing is a rule saying you know s", "start": 436.32, "duration": 4.59}, {"text": "is a and then the description on the", "start": 438.03, "duration": 5.76}, {"text": "other side and the vertical bar means or", "start": 440.91, "duration": 5.25}, {"text": "and the other things well I'll get into", "start": 443.79, "duration": 4.68}, {"text": "that a little bit so we've got two rules", "start": 446.16, "duration": 6.06}, {"text": "here and we see the tree structure of", "start": 448.47, "duration": 5.7}, {"text": "how you can sort of prove that this", "start": 452.22, "duration": 6.9}, {"text": "grammar fits that string now that", "start": 454.17, "duration": 7.32}, {"text": "example was just this kind of arbitrary", "start": 459.12, "duration": 6.03}, {"text": "you know a textbook example of a a B ba", "start": 461.49, "duration": 5.13}, {"text": "now that's not the kind of data we", "start": 465.15, "duration": 3.06}, {"text": "really work with right so I want to at", "start": 466.62, "duration": 3.12}, {"text": "least convince you that grammars are", "start": 468.21, "duration": 3.69}, {"text": "used in the real world to describe", "start": 469.74, "duration": 5.25}, {"text": "actual data this is from a specification", "start": 471.9, "duration": 5.85}, {"text": "for email addresses I mean who knew that", "start": 474.99, "duration": 4.62}, {"text": "email addresses were that complicated", "start": 477.75, "duration": 4.77}, {"text": "right but it took a couple people yes", "start": 479.61, "duration": 5.16}, {"text": "really annoying to validate it email", "start": 482.52, "duration": 4.35}, {"text": "addresses because it turns out that the", "start": 484.77, "duration": 4.59}, {"text": "universe of allowed email addresses is", "start": 486.87, "duration": 4.32}, {"text": "much broader than what you would think", "start": 489.36, "duration": 5.04}, {"text": "and to capture all those nuances really", "start": 491.19, "duration": 4.77}, {"text": "requires you know it's not something", "start": 494.4, "duration": 3.12}, {"text": "that can be described adequately with", "start": 495.96, "duration": 3.51}, {"text": "just regular expressions you need a", "start": 497.52, "duration": 5.9}, {"text": "context-free grammar to describe that", "start": 499.47, "duration": 3.95}, {"text": "okay so now we're ready to get into what", "start": 503.66, "duration": 7.81}, {"text": "is insta parse specifically and I like", "start": 507.0, "duration": 8.31}, {"text": "to think of insta parse as a really", "start": 511.47, "duration": 6.3}, {"text": "lightweight tool for converting", "start": 515.31, "duration": 6.21}, {"text": "context-free grammars into an executable", "start": 517.77, "duration": 5.94}, {"text": "parser one of these functions that will", "start": 521.52, "duration": 5.58}, {"text": "let you convert a string into a tree", "start": 523.71, "duration": 4.86}, {"text": "structure that you can work with in", "start": 527.1, "duration": 3.71}, {"text": "closure", "start": 528.57, "duration": 2.24}, {"text": "so going back to that example that I", "start": 531.009, "duration": 5.32}, {"text": "pulled from the automaton book on my", "start": 533.69, "duration": 7.98}, {"text": "shelf on the upper right corner you can", "start": 536.329, "duration": 9.18}, {"text": "see what I did is I actually just typed", "start": 541.67, "duration": 6.659}, {"text": "the context-free grammar into insta", "start": 545.509, "duration": 5.101}, {"text": "parse fed it to this function in the", "start": 548.329, "duration": 4.801}, {"text": "insta parse neck core namespace which I", "start": 550.61, "duration": 5.52}, {"text": "have aliased here is insta so there's a", "start": 553.13, "duration": 4.709}, {"text": "function they're called parser that", "start": 556.13, "duration": 4.439}, {"text": "takes grammars and returns a parser so I", "start": 557.839, "duration": 5.511}, {"text": "wrote down the context-free grammar", "start": 560.569, "duration": 5.161}, {"text": "passed it to the parser function and got", "start": 563.35, "duration": 5.59}, {"text": "back a function which I named automata", "start": 565.73, "duration": 6.299}, {"text": "book parser and you can see when I apply", "start": 568.94, "duration": 5.879}, {"text": "automata book parser to that exact same", "start": 572.029, "duration": 4.321}, {"text": "string that was in the example in the", "start": 574.819, "duration": 4.08}, {"text": "book I get back some sort of closure", "start": 576.35, "duration": 6.179}, {"text": "tree structure if you have trouble", "start": 578.899, "duration": 4.711}, {"text": "visualizing it from there there's", "start": 582.529, "duration": 2.881}, {"text": "actually a function built in insta parse", "start": 583.61, "duration": 5.25}, {"text": "Club visualize and it produces the tree", "start": 585.41, "duration": 5.97}, {"text": "that's in the lower left corner showing", "start": 588.86, "duration": 3.839}, {"text": "you what the tree actually looks like", "start": 591.38, "duration": 3.809}, {"text": "and it's got some extra information in", "start": 592.699, "duration": 4.62}, {"text": "there but you can see that the tree", "start": 595.189, "duration": 3.96}, {"text": "structure that it produces is exactly", "start": 597.319, "duration": 3.301}, {"text": "the same as the one that was shown in", "start": 599.149, "duration": 3.451}, {"text": "the textbook that's pretty nice to be", "start": 600.62, "duration": 4.74}, {"text": "able to just put this in and get", "start": 602.6, "duration": 3.9}, {"text": "something out that you can work with", "start": 605.36, "duration": 6.959}, {"text": "like this is great now my first version", "start": 606.5, "duration": 7.92}, {"text": "of this talk I have to admit was like", "start": 612.319, "duration": 4.26}, {"text": "twice as long as it needed to be and I", "start": 614.42, "duration": 3.96}, {"text": "was planning to spend a lot of time", "start": 616.579, "duration": 4.141}, {"text": "giving sort of a tour of the features of", "start": 618.38, "duration": 4.68}, {"text": "insta parse but I realized when I had to", "start": 620.72, "duration": 4.619}, {"text": "sort of pare things down to a reasonable", "start": 623.06, "duration": 5.519}, {"text": "length of time that there's already a", "start": 625.339, "duration": 6.151}, {"text": "really detailed tutorial about insta", "start": 628.579, "duration": 5.791}, {"text": "parse on github on the github site and", "start": 631.49, "duration": 6.69}, {"text": "so I'm not gonna make this about you", "start": 634.37, "duration": 5.159}, {"text": "know just showing you all the features", "start": 638.18, "duration": 3.93}, {"text": "of insta parse this is talk is going to", "start": 639.529, "duration": 3.601}, {"text": "be a little more about the", "start": 642.11, "duration": 3.51}, {"text": "implementation events to parse but I do", "start": 643.13, "duration": 5.129}, {"text": "feel like there's at least a few key", "start": 645.62, "duration": 6.93}, {"text": "features you need to know about so these", "start": 648.259, "duration": 6.39}, {"text": "are the three features that I think", "start": 652.55, "duration": 6.259}, {"text": "really helped make instapass a", "start": 654.649, "duration": 7.0}, {"text": "particularly nice lightweight tool for", "start": 658.809, "duration": 6.53}, {"text": "working with context-free grammars so", "start": 661.649, "duration": 7.92}, {"text": "first there are three ways to describe a", "start": 665.339, "duration": 8.67}, {"text": "grammar in insta parse most libraries", "start": 669.569, "duration": 7.911}, {"text": "especially in the closure ecosystem", "start": 674.009, "duration": 6.091}, {"text": "allow you to create a grammar using kind", "start": 677.48, "duration": 4.359}, {"text": "of a combination of functions and data", "start": 680.1, "duration": 3.149}, {"text": "that's often called the Combinator", "start": 681.839, "duration": 4.74}, {"text": "approach insta parse lets you do that", "start": 683.249, "duration": 5.64}, {"text": "but on top of that you can also just", "start": 686.579, "duration": 5.01}, {"text": "enter in these two syntaxes that are", "start": 688.889, "duration": 4.89}, {"text": "very popular for describing context-free", "start": 691.589, "duration": 5.04}, {"text": "grammars ebn f syntax and a B and F", "start": 693.779, "duration": 4.771}, {"text": "syntax and I really think that's gone a", "start": 696.629, "duration": 5.4}, {"text": "long way towards making insta parse feel", "start": 698.55, "duration": 5.009}, {"text": "like I said kind of as lightweight as", "start": 702.029, "duration": 3.391}, {"text": "regular expressions although I guess", "start": 703.559, "duration": 3.03}, {"text": "some people would argue how lightweight", "start": 705.42, "duration": 3.63}, {"text": "our regular expressions but it at least", "start": 706.589, "duration": 4.53}, {"text": "is is like gives you that feel that you", "start": 709.05, "duration": 3.449}, {"text": "can kind of enter in this notation", "start": 711.119, "duration": 5.52}, {"text": "that's very familiar also insta parse", "start": 712.499, "duration": 8.46}, {"text": "can produce the two most popular formats", "start": 716.639, "duration": 7.89}, {"text": "for expressing trees enclosure and when", "start": 720.959, "duration": 5.0}, {"text": "it produces these trees that", "start": 724.529, "duration": 3.961}, {"text": "automatically labels the nodes of the", "start": 725.959, "duration": 5.05}, {"text": "tree with the rules from your grammar", "start": 728.49, "duration": 6.599}, {"text": "the rule names from the grammar finally", "start": 731.009, "duration": 6.091}, {"text": "and I think this might be one of the", "start": 735.089, "duration": 4.68}, {"text": "most important features of insta parse", "start": 737.1, "duration": 5.0}, {"text": "is it lets you work with any", "start": 739.769, "duration": 5.07}, {"text": "context-free grammar and that actually", "start": 742.1, "duration": 6.489}, {"text": "turns out to be relatively unusual most", "start": 744.839, "duration": 7.141}, {"text": "parser libraries can only handle a", "start": 748.589, "duration": 5.97}, {"text": "certain subset of context-free grammars", "start": 751.98, "duration": 4.62}, {"text": "and it requires a fair amount of", "start": 754.559, "duration": 5.4}, {"text": "specialist knowledge to figure out how", "start": 756.6, "duration": 6.839}, {"text": "to take your grammar and turn it into", "start": 759.959, "duration": 5.25}, {"text": "something that this particular library", "start": 763.439, "duration": 7.74}, {"text": "can process insta parse is relatively", "start": 765.209, "duration": 8.94}, {"text": "rare in in that you can really put in", "start": 771.179, "duration": 4.95}, {"text": "any context-free grammar and it just", "start": 774.149, "duration": 8.24}, {"text": "works so", "start": 776.129, "duration": 6.26}, {"text": "one of the things I really want to", "start": 782.41, "duration": 4.59}, {"text": "address here in this talk is how does", "start": 783.67, "duration": 5.19}, {"text": "that sort of magic happen what is it", "start": 787.0, "duration": 4.14}, {"text": "that insta parse does that these other", "start": 788.86, "duration": 5.07}, {"text": "libraries aren't doing that lets it", "start": 791.14, "duration": 4.74}, {"text": "handle any grammar and I'm going to", "start": 793.93, "duration": 5.31}, {"text": "focus specifically on something called a", "start": 795.88, "duration": 5.25}, {"text": "left recursive grammar because that's", "start": 799.24, "duration": 3.45}, {"text": "something that other languages don't", "start": 801.13, "duration": 2.79}, {"text": "handle well", "start": 802.69, "duration": 3.78}, {"text": "first I need to explain to you for those", "start": 803.92, "duration": 4.26}, {"text": "of you who aren't quite as familiar with", "start": 806.47, "duration": 4.73}, {"text": "grammars the two main concepts in", "start": 808.18, "duration": 5.97}, {"text": "grammars is this notion of alternation", "start": 811.2, "duration": 6.64}, {"text": "so when you see that vertical bar that's", "start": 814.15, "duration": 5.79}, {"text": "telling you you know that's sort of", "start": 817.84, "duration": 4.95}, {"text": "defining that's like the word or so I'm", "start": 819.94, "duration": 5.64}, {"text": "looking for the letter A or the letter B", "start": 822.79, "duration": 6.9}, {"text": "that's alternation concatenation when no", "start": 825.58, "duration": 6.06}, {"text": "symbol appears is saying I'm looking for", "start": 829.69, "duration": 4.74}, {"text": "the letter A followed by the letter B", "start": 831.64, "duration": 7.35}, {"text": "and those two concepts are really the", "start": 834.43, "duration": 6.15}, {"text": "main ingredients in grammars there's a", "start": 838.99, "duration": 2.54}, {"text": "few other things but they can", "start": 840.58, "duration": 6.18}, {"text": "technically be built out of those so the", "start": 841.53, "duration": 7.21}, {"text": "grammar that I'm gonna focus on here to", "start": 846.76, "duration": 3.9}, {"text": "sort of show you how insta parse does it", "start": 848.74, "duration": 5.16}, {"text": "where other parser libraries would kind", "start": 850.66, "duration": 6.45}, {"text": "of break down is this left recursive", "start": 853.9, "duration": 4.56}, {"text": "grammar this is probably the simplest", "start": 857.11, "duration": 3.93}, {"text": "possible one it's the rule S is the", "start": 858.46, "duration": 5.43}, {"text": "letter A or the rule s followed by the", "start": 861.04, "duration": 3.51}, {"text": "letter A", "start": 863.89, "duration": 3.65}, {"text": "it's called left recursion because the S", "start": 864.55, "duration": 6.15}, {"text": "occurs on the left side of its", "start": 867.54, "duration": 7.18}, {"text": "concatenation just to give you an idea", "start": 870.7, "duration": 5.52}, {"text": "of how it's supposed to work and how", "start": 874.72, "duration": 3.24}, {"text": "insta parse handles it on the upper", "start": 876.22, "duration": 4.89}, {"text": "right I have entered that grammar and", "start": 877.96, "duration": 4.95}, {"text": "insta parse and we can see that if you", "start": 881.11, "duration": 5.96}, {"text": "feed the string AAA to that parser it", "start": 882.91, "duration": 7.05}, {"text": "successfully generates the proper tree", "start": 887.07, "duration": 5.32}, {"text": "structure which I've shown both in the", "start": 889.96, "duration": 5.04}, {"text": "closure code and the actual kind of", "start": 892.39, "duration": 4.47}, {"text": "visualized tree of what you get out of", "start": 895.0, "duration": 4.1}, {"text": "that", "start": 896.86, "duration": 2.24}, {"text": "now most libraries use a technique", "start": 899.49, "duration": 5.47}, {"text": "called recursive descent recursive", "start": 902.62, "duration": 5.16}, {"text": "descent sort of used these parsing rules", "start": 904.96, "duration": 6.5}, {"text": "as a bunch of mutually recursive", "start": 907.78, "duration": 6.14}, {"text": "components that call each other as they", "start": 911.46, "duration": 6.67}, {"text": "attempt to resolve the parse the problem", "start": 913.92, "duration": 6.07}, {"text": "is a recursive descent does not handle", "start": 918.13, "duration": 4.46}, {"text": "these left recursive grammars here's", "start": 919.99, "duration": 5.76}, {"text": "kind of at a high level why it doesn't", "start": 922.59, "duration": 5.53}, {"text": "work you can imagine stepping through", "start": 925.75, "duration": 4.86}, {"text": "the process like tracing through what a", "start": 928.12, "duration": 4.59}, {"text": "recursive descent parser would do with", "start": 930.61, "duration": 5.28}, {"text": "the string AAA it says okay well first I", "start": 932.71, "duration": 5.19}, {"text": "got to call this you know my overall", "start": 935.89, "duration": 4.56}, {"text": "rule is the rule s and I want to start", "start": 937.9, "duration": 4.17}, {"text": "from the very beginning of the string", "start": 940.45, "duration": 5.54}, {"text": "index zero and I want to do this parse", "start": 942.07, "duration": 8.85}, {"text": "well the rule s expands to a or s a so I", "start": 945.99, "duration": 7.18}, {"text": "got to do that parse starting from the", "start": 950.92, "duration": 4.17}, {"text": "beginning of the string well this is an", "start": 953.17, "duration": 4.11}, {"text": "or so I have to try both possibilities", "start": 955.09, "duration": 4.59}, {"text": "so first I'm gonna try the a parser", "start": 957.28, "duration": 5.52}, {"text": "starting at index zero and that works it", "start": 959.68, "duration": 4.95}, {"text": "succeeds there is an a at the beginning", "start": 962.8, "duration": 3.69}, {"text": "of the string but that's not enough to", "start": 964.63, "duration": 3.96}, {"text": "consume the whole string we need to keep", "start": 966.49, "duration": 4.92}, {"text": "going explore the other scenario the", "start": 968.59, "duration": 5.9}, {"text": "other scenario is s followed by a and", "start": 971.41, "duration": 5.55}, {"text": "well if you have a concatenation like", "start": 974.49, "duration": 5.14}, {"text": "that the first step is to try s starting", "start": 976.96, "duration": 3.93}, {"text": "from the beginning of the string and now", "start": 979.63, "duration": 4.13}, {"text": "we're caught in an infinite loop right", "start": 980.89, "duration": 6.42}, {"text": "so what I want to do now is kind of talk", "start": 983.76, "duration": 6.19}, {"text": "about how insta parse handles this and I", "start": 987.31, "duration": 3.75}, {"text": "know some of you in the audience", "start": 989.95, "duration": 4.52}, {"text": "probably you know have no interest in", "start": 991.06, "duration": 6.45}, {"text": "knowing all the details of how a parser", "start": 994.47, "duration": 4.66}, {"text": "library is implemented and that's fine", "start": 997.51, "duration": 3.89}, {"text": "but I hope you'll bear with me because I", "start": 999.13, "duration": 5.22}, {"text": "really think there's some big ideas here", "start": 1001.4, "duration": 4.63}, {"text": "in the implementation of insta parse", "start": 1004.35, "duration": 4.59}, {"text": "that could actually be applied to other", "start": 1006.03, "duration": 5.64}, {"text": "programming paradigms so stay with me", "start": 1008.94, "duration": 4.47}, {"text": "I'm going to sort of describe it at a", "start": 1011.67, "duration": 3.48}, {"text": "high level and I think you'll come out", "start": 1013.41, "duration": 6.2}, {"text": "of it with some interesting ideas so the", "start": 1015.15, "duration": 7.439}, {"text": "engine that drives insta parse is", "start": 1019.61, "duration": 6.729}, {"text": "something called the gll algorithm and", "start": 1022.589, "duration": 5.37}, {"text": "even though it's not described this way", "start": 1026.339, "duration": 4.86}, {"text": "in the literature I tend to think of", "start": 1027.959, "duration": 4.801}, {"text": "this algorithm", "start": 1031.199, "duration": 5.221}, {"text": "as well as a dataflow network really I", "start": 1032.76, "duration": 6.81}, {"text": "think of it as a bunch of nodes that", "start": 1036.42, "duration": 6.9}, {"text": "each represent a parser component trying", "start": 1039.57, "duration": 5.94}, {"text": "to parse the string from a certain point", "start": 1043.32, "duration": 6.12}, {"text": "and other components are listening for", "start": 1045.51, "duration": 6.51}, {"text": "those results and waiting for those", "start": 1049.44, "duration": 5.03}, {"text": "results to be transmitted to them and", "start": 1052.02, "duration": 5.54}, {"text": "that's how I think of it as a network", "start": 1054.47, "duration": 5.62}, {"text": "now as I mentioned there's these two big", "start": 1057.56, "duration": 4.84}, {"text": "concepts alternation and concatenation", "start": 1060.09, "duration": 3.78}, {"text": "so let's sort of look at how that would", "start": 1062.4, "duration": 4.77}, {"text": "work in this dataflow network sense so", "start": 1063.87, "duration": 5.73}, {"text": "if you have a parser a or B that's our", "start": 1067.17, "duration": 5.01}, {"text": "alternation pattern basically it's gonna", "start": 1069.6, "duration": 5.1}, {"text": "set up and say okay I want to start off", "start": 1072.18, "duration": 5.31}, {"text": "the parser a and I want to start off the", "start": 1074.7, "duration": 4.86}, {"text": "parser B and I'm gonna listen for the", "start": 1077.49, "duration": 4.2}, {"text": "results when you find some results come", "start": 1079.56, "duration": 3.54}, {"text": "report that back to me", "start": 1081.69, "duration": 2.97}, {"text": "so that's the alternation they're pretty", "start": 1083.1, "duration": 5.37}, {"text": "straightforward now the concatenation", "start": 1084.66, "duration": 6.72}, {"text": "patterns a little trickier and the idea", "start": 1088.47, "duration": 5.31}, {"text": "this isn't quite right but the idea is", "start": 1091.38, "duration": 4.29}, {"text": "that if you're looking for a followed by", "start": 1093.78, "duration": 5.16}, {"text": "B you start off a node that says okay I", "start": 1095.67, "duration": 6.63}, {"text": "want to do parser a starting from the", "start": 1098.94, "duration": 4.59}, {"text": "beginning of the string starting from", "start": 1102.3, "duration": 4.68}, {"text": "index 0 when you get a result hand that", "start": 1103.53, "duration": 6.36}, {"text": "off to the guy who follows that which is", "start": 1106.98, "duration": 5.22}, {"text": "parser B so I'm going to start looking", "start": 1109.89, "duration": 4.68}, {"text": "for parser B starting at the next index", "start": 1112.2, "duration": 5.91}, {"text": "index 1 and when he succeeds then notify", "start": 1114.57, "duration": 5.34}, {"text": "me back then you've successfully found", "start": 1118.11, "duration": 4.71}, {"text": "an a followed by a B now the reason why", "start": 1119.91, "duration": 8.34}, {"text": "this doesn't quite work is because in", "start": 1122.82, "duration": 7.32}, {"text": "this particular example we know that the", "start": 1128.25, "duration": 4.65}, {"text": "letter A is always one character long so", "start": 1130.14, "duration": 4.74}, {"text": "we know that this B parser is always", "start": 1132.9, "duration": 4.35}, {"text": "going to start looking one character", "start": 1134.88, "duration": 3.48}, {"text": "later but in general we don't", "start": 1137.25, "duration": 3.63}, {"text": "necessarily know how long the first", "start": 1138.36, "duration": 4.77}, {"text": "parse result will be so we have to use", "start": 1140.88, "duration": 4.02}, {"text": "something I call the cat listener", "start": 1143.13, "duration": 5.01}, {"text": "pattern so the cat listener pattern", "start": 1144.9, "duration": 4.8}, {"text": "basically says we need to create this", "start": 1148.14, "duration": 4.11}, {"text": "object that is going to listen for that", "start": 1149.7, "duration": 5.1}, {"text": "first thing to complete that a parser", "start": 1152.25, "duration": 4.68}, {"text": "needs to complete and I'm going to be", "start": 1154.8, "duration": 5.82}, {"text": "listening for that and when a is done I", "start": 1156.93, "duration": 8.55}, {"text": "look at how much he consumed and then", "start": 1160.62, "duration": 7.47}, {"text": "I'm gonna kick off the beat parser", "start": 1165.48, "duration": 4.77}, {"text": "starting from that index and reporting", "start": 1168.09, "duration": 4.62}, {"text": "back to the main guy the one who started", "start": 1170.25, "duration": 5.429}, {"text": "it all so just to understand my notation", "start": 1172.71, "duration": 5.31}, {"text": "here and the cat listener I used that", "start": 1175.679, "duration": 4.141}, {"text": "triangle just to kind of denote that the", "start": 1178.02, "duration": 4.17}, {"text": "cat listener knows that when he gets a", "start": 1179.82, "duration": 4.44}, {"text": "result that a is done but the beast", "start": 1182.19, "duration": 3.45}, {"text": "still needs to be processed you can", "start": 1184.26, "duration": 2.46}, {"text": "almost think of it kind of like a", "start": 1185.64, "duration": 5.22}, {"text": "continuation the the dotted line the", "start": 1186.72, "duration": 6.27}, {"text": "dashed line is something that no values", "start": 1190.86, "duration": 4.08}, {"text": "actually travel along that's just there", "start": 1192.99, "duration": 3.6}, {"text": "to show the cat listener knows who", "start": 1194.94, "duration": 5.489}, {"text": "initially created him and when he moves", "start": 1196.59, "duration": 6.48}, {"text": "on to do that second when he starts the", "start": 1200.429, "duration": 5.461}, {"text": "node to do the second parse he knows who", "start": 1203.07, "duration": 4.17}, {"text": "need that result needs to get", "start": 1205.89, "duration": 5.19}, {"text": "transmitted back to okay now these", "start": 1207.24, "duration": 6.24}, {"text": "individual nodes in the network how do", "start": 1211.08, "duration": 4.56}, {"text": "we program those what kind of model are", "start": 1213.48, "duration": 4.05}, {"text": "they're using and it's almost like the", "start": 1215.64, "duration": 3.93}, {"text": "publisher subscriber model but with a", "start": 1217.53, "duration": 4.889}, {"text": "slight twist so usually when we think of", "start": 1219.57, "duration": 5.82}, {"text": "the pub/sub model for data flow we", "start": 1222.419, "duration": 4.681}, {"text": "imagine it a lot like a magazine", "start": 1225.39, "duration": 5.46}, {"text": "subscription so if I subscribe to a", "start": 1227.1, "duration": 5.88}, {"text": "magazine I expect them to send me all", "start": 1230.85, "duration": 5.459}, {"text": "the issues from this point forward so", "start": 1232.98, "duration": 4.89}, {"text": "the kind of model we're gonna use though", "start": 1236.309, "duration": 3.391}, {"text": "is a little bit different the idea is", "start": 1237.87, "duration": 3.51}, {"text": "that when I subscribe to this magazine", "start": 1239.7, "duration": 3.75}, {"text": "I'm basically saying send me all your", "start": 1241.38, "duration": 5.1}, {"text": "back issues and then start sending me", "start": 1243.45, "duration": 5.28}, {"text": "the new stuff also and it turns out that", "start": 1246.48, "duration": 4.68}, {"text": "this is the kind of node we need for", "start": 1248.73, "duration": 4.319}, {"text": "this particular network and it's", "start": 1251.16, "duration": 2.91}, {"text": "something you might want to think about", "start": 1253.049, "duration": 3.361}, {"text": "using in your own programs when you see", "start": 1254.07, "duration": 5.55}, {"text": "how it's useful here programming that is", "start": 1256.41, "duration": 5.37}, {"text": "quite easy the each of these nodes", "start": 1259.62, "duration": 5.22}, {"text": "basically just tracks who is listening", "start": 1261.78, "duration": 5.04}, {"text": "who needs to know these results and what", "start": 1264.84, "duration": 3.959}, {"text": "results that's found so far for this", "start": 1266.82, "duration": 4.859}, {"text": "parser component at this particular", "start": 1268.799, "duration": 5.37}, {"text": "point in the string and when a new", "start": 1271.679, "duration": 4.441}, {"text": "result comes in well that's really", "start": 1274.169, "duration": 4.111}, {"text": "obvious we just forward that information", "start": 1276.12, "duration": 4.71}, {"text": "to all the listeners but we also have to", "start": 1278.28, "duration": 4.86}, {"text": "keep track of it so that if a new", "start": 1280.83, "duration": 4.469}, {"text": "listener comes in we can send to that", "start": 1283.14, "duration": 7.44}, {"text": "new listener all the old results okay so", "start": 1285.299, "duration": 7.531}, {"text": "now we're ready to actually get in and", "start": 1290.58, "duration": 4.86}, {"text": "do kind of this high-level you know", "start": 1292.83, "duration": 5.339}, {"text": "understanding how insta parse would", "start": 1295.44, "duration": 3.81}, {"text": "handle that particular", "start": 1298.169, "duration": 3.661}, {"text": "left recursive grammar with the input a", "start": 1299.25, "duration": 5.91}, {"text": "a so we start off with something that I", "start": 1301.83, "duration": 5.58}, {"text": "call the top listener it's job is to", "start": 1305.16, "duration": 5.22}, {"text": "start off the parsing process listen for", "start": 1307.41, "duration": 6.12}, {"text": "full results and when it hears full", "start": 1310.38, "duration": 5.4}, {"text": "results transmit that back to the user", "start": 1313.53, "duration": 6.57}, {"text": "so it start it says ok that top level", "start": 1315.78, "duration": 6.48}, {"text": "rule is s so I'm going to start off the", "start": 1320.1, "duration": 7.5}, {"text": "rule s starting from index zero and I'm", "start": 1322.26, "duration": 7.59}, {"text": "listening for results and that little", "start": 1327.6, "duration": 5.07}, {"text": "notation there as indicating right here", "start": 1329.85, "duration": 5.82}, {"text": "is indicating that only complete parses", "start": 1332.67, "duration": 5.28}, {"text": "need to be transmitted up to the top", "start": 1335.67, "duration": 9.33}, {"text": "listener now the s parser expands to a", "start": 1337.95, "duration": 9.9}, {"text": "or s a so it creates that parser and", "start": 1345.0, "duration": 4.68}, {"text": "it's going to listen to it now I talked", "start": 1347.85, "duration": 3.69}, {"text": "about how insta parse automatically", "start": 1349.68, "duration": 4.38}, {"text": "labels all the nodes in the tree with", "start": 1351.54, "duration": 5.94}, {"text": "the rule name so when values flow from", "start": 1354.06, "duration": 5.07}, {"text": "here to here they have to get labeled", "start": 1357.48, "duration": 5.55}, {"text": "with that s label now this is the", "start": 1359.13, "duration": 6.09}, {"text": "alternation pattern right we have an A", "start": 1363.03, "duration": 5.55}, {"text": "or s a so we spin off to other parse", "start": 1365.22, "duration": 5.82}, {"text": "nodes a and s a starting from the", "start": 1368.58, "duration": 3.75}, {"text": "beginning of the string and I'm", "start": 1371.04, "duration": 4.23}, {"text": "listening to both those results now this", "start": 1372.33, "duration": 4.94}, {"text": "is effectively happening asynchronously", "start": 1375.27, "duration": 4.68}, {"text": "and that's the key you know one of the", "start": 1377.27, "duration": 4.9}, {"text": "key differences here is usually in", "start": 1379.95, "duration": 6.84}, {"text": "recursive descent style strategy we're", "start": 1382.17, "duration": 6.3}, {"text": "calling one of the things in the", "start": 1386.79, "duration": 4.11}, {"text": "alternation and it's a blocking call we", "start": 1388.47, "duration": 4.11}, {"text": "wait for the result and we get that", "start": 1390.9, "duration": 3.9}, {"text": "result then we try the other possibility", "start": 1392.58, "duration": 3.84}, {"text": "but we're spinning both of these things", "start": 1394.8, "duration": 4.68}, {"text": "off asynchronously and just waiting and", "start": 1396.42, "duration": 4.35}, {"text": "listening for the results so we don't", "start": 1399.48, "duration": 2.52}, {"text": "know which order these things are going", "start": 1400.77, "duration": 3.15}, {"text": "to be processed for the moment I'm going", "start": 1402.0, "duration": 6.18}, {"text": "to explore the rightmost node that's the", "start": 1403.92, "duration": 6.54}, {"text": "concatenation pattern right s followed", "start": 1408.18, "duration": 4.92}, {"text": "by a so we have to do that cat listener", "start": 1410.46, "duration": 4.74}, {"text": "thing I talked about earlier so we", "start": 1413.1, "duration": 3.84}, {"text": "create this cat listener this", "start": 1415.2, "duration": 4.44}, {"text": "continuation node that's going to listen", "start": 1416.94, "duration": 6.12}, {"text": "for the S parse and it knows that it", "start": 1419.64, "duration": 4.71}, {"text": "needs to follow up when it gets", "start": 1423.06, "duration": 4.11}, {"text": "something by looking for the a parse now", "start": 1424.35, "duration": 4.02}, {"text": "one thing that's kind of interesting", "start": 1427.17, "duration": 4.5}, {"text": "here is there's already a node in our", "start": 1428.37, "duration": 7.02}, {"text": "work for the S parser starting at index", "start": 1431.67, "duration": 6.06}, {"text": "zero so there's no need to create a new", "start": 1435.39, "duration": 4.86}, {"text": "one here we just listen to the one that", "start": 1437.73, "duration": 7.11}, {"text": "already exists in our network okay now", "start": 1440.25, "duration": 6.06}, {"text": "we can go down to the lower left the", "start": 1444.84, "duration": 4.71}, {"text": "lower left is actually a node that can", "start": 1446.31, "duration": 5.46}, {"text": "do something not just add more stuff to", "start": 1449.55, "duration": 3.75}, {"text": "the network it's looking for the", "start": 1451.77, "duration": 3.0}, {"text": "character a at the beginning of the", "start": 1453.3, "duration": 3.84}, {"text": "string and it finds it so it produces", "start": 1454.77, "duration": 4.29}, {"text": "this result saying hey I found the", "start": 1457.14, "duration": 4.59}, {"text": "letter A and I've consumed one letter so", "start": 1459.06, "duration": 7.5}, {"text": "far that information gets transmitted up", "start": 1461.73, "duration": 7.56}, {"text": "to the alternation node which in turn", "start": 1466.56, "duration": 4.8}, {"text": "gets transmitted up to the S node and", "start": 1469.29, "duration": 5.91}, {"text": "gets labeled in the process that", "start": 1471.36, "duration": 5.94}, {"text": "information gets relayed to the cat", "start": 1475.2, "duration": 4.77}, {"text": "listener and now the cat listener has to", "start": 1477.3, "duration": 7.2}, {"text": "do that extra work that it does spinning", "start": 1479.97, "duration": 7.77}, {"text": "off a new node to do the remaining part", "start": 1484.5, "duration": 5.97}, {"text": "of the parse so this is a little tricky", "start": 1487.74, "duration": 5.6}, {"text": "so I want to make sure this is clear", "start": 1490.47, "duration": 5.79}, {"text": "this new node the way it's created this", "start": 1493.34, "duration": 7.54}, {"text": "a right here comes from the second part", "start": 1496.26, "duration": 7.77}, {"text": "of the cat listener the one it's going", "start": 1500.88, "duration": 6.0}, {"text": "to be looking for the a at index one", "start": 1504.03, "duration": 4.44}, {"text": "because that's how many letters were", "start": 1506.88, "duration": 3.33}, {"text": "consumed so it's looking at that number", "start": 1508.47, "duration": 6.09}, {"text": "to get that the result that was created", "start": 1510.21, "duration": 7.83}, {"text": "so far becomes this label along this", "start": 1514.56, "duration": 6.21}, {"text": "flow path this value that's going to", "start": 1518.04, "duration": 4.74}, {"text": "need to get prepended to any result", "start": 1520.77, "duration": 4.52}, {"text": "that's discovered by this parser and", "start": 1522.78, "duration": 5.49}, {"text": "this dashed line here was the thing that", "start": 1525.29, "duration": 4.75}, {"text": "sort of remembered who was the original", "start": 1528.27, "duration": 3.18}, {"text": "creator and that's going to be the", "start": 1530.04, "duration": 3.81}, {"text": "destination for this arrow so all the", "start": 1531.45, "duration": 4.68}, {"text": "things about this node are constructed", "start": 1533.85, "duration": 4.83}, {"text": "from information that is available to", "start": 1536.13, "duration": 6.3}, {"text": "this cat listener okay well again this", "start": 1538.68, "duration": 5.31}, {"text": "is a node that can do something right", "start": 1542.43, "duration": 6.03}, {"text": "away and it says yes there is a letter a", "start": 1543.99, "duration": 7.5}, {"text": "at index one so now I've consumed", "start": 1548.46, "duration": 4.8}, {"text": "another letter for a total of two", "start": 1551.49, "duration": 4.56}, {"text": "letters that information gets", "start": 1553.26, "duration": 4.86}, {"text": "transmitted along that path with that", "start": 1556.05, "duration": 6.54}, {"text": "value prepended and that gets reported", "start": 1558.12, "duration": 6.83}, {"text": "back to that alternation node", "start": 1562.59, "duration": 5.64}, {"text": "which in turn flows up to the original s", "start": 1564.95, "duration": 5.439}, {"text": "Snowden gets labeled in the process and", "start": 1568.23, "duration": 5.85}, {"text": "now we have a full parse the and we know", "start": 1570.389, "duration": 5.341}, {"text": "it's a full parse because we've consumed", "start": 1574.08, "duration": 3.63}, {"text": "two letters and the string is two", "start": 1575.73, "duration": 4.529}, {"text": "characters long so that flows up to the", "start": 1577.71, "duration": 4.65}, {"text": "top listener it also flows over to that", "start": 1580.259, "duration": 3.78}, {"text": "cat listener but it doesn't matter at", "start": 1582.36, "duration": 3.72}, {"text": "that point because it's exhausted the", "start": 1584.039, "duration": 3.39}, {"text": "string so the cat listener is not going", "start": 1586.08, "duration": 3.66}, {"text": "to try to do anything with it so the top", "start": 1587.429, "duration": 4.47}, {"text": "listener now has a result and this is", "start": 1589.74, "duration": 3.96}, {"text": "the piece that's going to be reported", "start": 1591.899, "duration": 4.551}, {"text": "back to the user so we have our parse", "start": 1593.7, "duration": 7.349}, {"text": "now I happen to demonstrate this in", "start": 1596.45, "duration": 6.67}, {"text": "terms of showing the right node before", "start": 1601.049, "duration": 3.75}, {"text": "the left node down here in the", "start": 1603.12, "duration": 3.33}, {"text": "alternation but think for a moment about", "start": 1604.799, "duration": 3.63}, {"text": "what would have happened if the left", "start": 1606.45, "duration": 4.679}, {"text": "node node result had gotten computed", "start": 1608.429, "duration": 6.061}, {"text": "first so this result would have flown", "start": 1611.129, "duration": 7.26}, {"text": "would have flowed up to the s parser but", "start": 1614.49, "duration": 5.73}, {"text": "that cat listener wouldn't have been", "start": 1618.389, "duration": 6.0}, {"text": "attached yet then this one comes through", "start": 1620.22, "duration": 7.559}, {"text": "and starts up that cat listener node", "start": 1624.389, "duration": 6.681}, {"text": "that's why remember I said earlier that", "start": 1627.779, "duration": 6.541}, {"text": "values need to old values need to be", "start": 1631.07, "duration": 5.41}, {"text": "relayed to new listeners that attach", "start": 1634.32, "duration": 4.92}, {"text": "that's why is because if we didn't do", "start": 1636.48, "duration": 6.029}, {"text": "that then if this result got here before", "start": 1639.24, "duration": 5.399}, {"text": "the listener was attached that listener", "start": 1642.509, "duration": 3.361}, {"text": "would never know about it", "start": 1644.639, "duration": 5.941}, {"text": "that's why that's important okay now I", "start": 1645.87, "duration": 6.84}, {"text": "promised for those of you who weren't", "start": 1650.58, "duration": 3.75}, {"text": "particularly interested in parser", "start": 1652.71, "duration": 3.51}, {"text": "implementation that there was a big idea", "start": 1654.33, "duration": 5.429}, {"text": "here worth knowing so let's kind of", "start": 1656.22, "duration": 5.76}, {"text": "reflect on what we've seen what I think", "start": 1659.759, "duration": 5.64}, {"text": "is the big idea here is that synchronous", "start": 1661.98, "duration": 6.539}, {"text": "function calls and recursion has this", "start": 1665.399, "duration": 5.52}, {"text": "potential to lead to infinite loops on", "start": 1668.519, "duration": 5.13}, {"text": "the other hand if you use asynchronous", "start": 1670.919, "duration": 5.34}, {"text": "calls and dataflow you have the", "start": 1673.649, "duration": 5.461}, {"text": "potential to get a more robust algorithm", "start": 1676.259, "duration": 5.28}, {"text": "and I actually found this to be a really", "start": 1679.11, "duration": 4.169}, {"text": "big surprise when I started working on", "start": 1681.539, "duration": 4.951}, {"text": "this I have always thought of dataflow", "start": 1683.279, "duration": 6.211}, {"text": "as more being about a way to organize my", "start": 1686.49, "duration": 5.34}, {"text": "program and a slightly more flexible or", "start": 1689.49, "duration": 4.62}, {"text": "clear way I never really thought about", "start": 1691.83, "duration": 4.68}, {"text": "it as something that might actually give", "start": 1694.11, "duration": 3.26}, {"text": "added", "start": 1696.51, "duration": 3.419}, {"text": "algorithmic capability I mean that", "start": 1697.37, "duration": 4.72}, {"text": "really never occurred to me before so", "start": 1699.929, "duration": 4.71}, {"text": "that's what I think is one of these big", "start": 1702.09, "duration": 6.089}, {"text": "ideas here I think I can safely predict", "start": 1704.639, "duration": 4.981}, {"text": "that over the next few days you're going", "start": 1708.179, "duration": 4.13}, {"text": "to be hearing a lot about asynchronous", "start": 1709.62, "duration": 5.76}, {"text": "channels data flow right all these", "start": 1712.309, "duration": 4.75}, {"text": "things are things that are going to come", "start": 1715.38, "duration": 3.419}, {"text": "up a lot here at the closure conference", "start": 1717.059, "duration": 3.6}, {"text": "that's really hot right now and I hope", "start": 1718.799, "duration": 3.96}, {"text": "that when you hear those sorts of talks", "start": 1720.659, "duration": 3.961}, {"text": "over the next couple of days you keep", "start": 1722.759, "duration": 5.431}, {"text": "this in mind as an example of how this", "start": 1724.62, "duration": 9.899}, {"text": "can actually give you new power so I", "start": 1728.19, "duration": 8.209}, {"text": "always think it's kind of interesting to", "start": 1734.519, "duration": 5.01}, {"text": "hear a little bit about how open-source", "start": 1736.399, "duration": 5.5}, {"text": "libraries came about so I want to just", "start": 1739.529, "duration": 3.9}, {"text": "take a moment to tell you about the", "start": 1741.899, "duration": 3.541}, {"text": "story behind insta parse you might", "start": 1743.429, "duration": 6.84}, {"text": "assume that I use parsing really heavily", "start": 1745.44, "duration": 9.329}, {"text": "and my job or you might assume that I'm", "start": 1750.269, "duration": 7.26}, {"text": "just really passionate about parsing and", "start": 1754.769, "duration": 4.681}, {"text": "it turns out that neither of those is", "start": 1757.529, "duration": 4.591}, {"text": "actually the case the true story behind", "start": 1759.45, "duration": 5.069}, {"text": "insta parse is it's actually a", "start": 1762.12, "duration": 7.2}, {"text": "father-son bonding story so some of you", "start": 1764.519, "duration": 6.14}, {"text": "may already know this but I actually", "start": 1769.32, "duration": 4.92}, {"text": "homeschool my kids and in part that's", "start": 1770.659, "duration": 6.311}, {"text": "because I am deeply passionate about", "start": 1774.24, "duration": 4.919}, {"text": "math and computer science education and", "start": 1776.97, "duration": 4.02}, {"text": "I really wanted to be intimately", "start": 1779.159, "duration": 4.701}, {"text": "involved in that aspect with my kids and", "start": 1780.99, "duration": 6.24}, {"text": "my son in particular really took an", "start": 1783.86, "duration": 4.779}, {"text": "interest of programming and I started", "start": 1787.23, "duration": 5.069}, {"text": "him very young on first scheme and then", "start": 1788.639, "duration": 7.321}, {"text": "a closure and from age 8", "start": 1792.299, "duration": 7.62}, {"text": "I was incorporating college-level", "start": 1795.96, "duration": 6.27}, {"text": "computer science material into his daily", "start": 1799.919, "duration": 4.801}, {"text": "lessons well as you can imagine by now", "start": 1802.23, "duration": 4.49}, {"text": "he's already a very very sophisticated", "start": 1804.72, "duration": 5.88}, {"text": "programmer but I kind of consider it my", "start": 1806.72, "duration": 5.709}, {"text": "responsibility to keep coming up with", "start": 1810.6, "duration": 4.35}, {"text": "new challenges for him new things that", "start": 1812.429, "duration": 5.071}, {"text": "will really stretch his capabilities so", "start": 1814.95, "duration": 5.609}, {"text": "last year when he was 14 I called him", "start": 1817.5, "duration": 6.87}, {"text": "over and I said Alex we need to have a", "start": 1820.559, "duration": 8.36}, {"text": "talk today is the day you become a man", "start": 1824.37, "duration": 10.11}, {"text": "today you're gonna learn about monads so", "start": 1828.919, "duration": 7.87}, {"text": "as part of teaching them about monads I", "start": 1834.48, "duration": 4.699}, {"text": "gave him an exercise in writing a", "start": 1836.789, "duration": 5.701}, {"text": "monadic parser Combinator library that's", "start": 1839.179, "duration": 6.191}, {"text": "actually a relatively standard exercise", "start": 1842.49, "duration": 5.389}, {"text": "to kind of get your head around monads", "start": 1845.37, "duration": 6.659}, {"text": "so he did this parser Combinator project", "start": 1847.879, "duration": 5.62}, {"text": "and I was playing around with it looking", "start": 1852.029, "duration": 4.23}, {"text": "at it and you know it was well done but", "start": 1853.499, "duration": 6.06}, {"text": "I was really struck by that inability to", "start": 1856.259, "duration": 4.981}, {"text": "do left recursion you know it was it was", "start": 1859.559, "duration": 4.531}, {"text": "irritating and I thought to myself", "start": 1861.24, "duration": 5.48}, {"text": "surely someone has solved this by now", "start": 1864.09, "duration": 4.77}, {"text": "someone must have solved this so I went", "start": 1866.72, "duration": 4.299}, {"text": "asking around people I knew people", "start": 1868.86, "duration": 4.35}, {"text": "online who had written parser libraries", "start": 1871.019, "duration": 4.86}, {"text": "trying to find out more about how to", "start": 1873.21, "duration": 6.809}, {"text": "tackle that eventually I found a pointer", "start": 1875.879, "duration": 7.26}, {"text": "to this paper about the GL algorithm so", "start": 1880.019, "duration": 5.341}, {"text": "I decided to do what all good teachers", "start": 1883.139, "duration": 4.53}, {"text": "do I handed it to my son and said go", "start": 1885.36, "duration": 4.309}, {"text": "figure out how to write this in closure", "start": 1887.669, "duration": 5.281}, {"text": "so he did that and he implemented in", "start": 1889.669, "duration": 5.08}, {"text": "closure and as I was playing around with", "start": 1892.95, "duration": 5.28}, {"text": "that I was really struck by how much", "start": 1894.749, "duration": 6.17}, {"text": "more freeing it was I really was", "start": 1898.23, "duration": 6.449}, {"text": "noticeably more enjoyable to work with a", "start": 1900.919, "duration": 5.59}, {"text": "library that could understand any", "start": 1904.679, "duration": 5.63}, {"text": "grammar so I thought this would be a", "start": 1906.509, "duration": 7.89}, {"text": "excellent opportunity to role model the", "start": 1910.309, "duration": 8.35}, {"text": "process of going that last mile to turn", "start": 1914.399, "duration": 6.691}, {"text": "something into a library that's usable", "start": 1918.659, "duration": 5.1}, {"text": "by the community so we talked about hey", "start": 1921.09, "duration": 4.439}, {"text": "you want to just make this alive really", "start": 1923.759, "duration": 3.451}, {"text": "should we make this a library and put it", "start": 1925.529, "duration": 3.661}, {"text": "out there yeah let's do it", "start": 1927.21, "duration": 5.01}, {"text": "so we decided to do that together I kind", "start": 1929.19, "duration": 5.069}, {"text": "of took over the codebase and worked", "start": 1932.22, "duration": 5.959}, {"text": "mostly on optimizing it a little bit", "start": 1934.259, "duration": 6.27}, {"text": "brighting the documentation we work", "start": 1938.179, "duration": 4.651}, {"text": "together on the front ends I wrote the", "start": 1940.529, "duration": 5.461}, {"text": "EB NF front end heroes a BNF front end", "start": 1942.83, "duration": 4.75}, {"text": "it was it was a collaboration and it was", "start": 1945.99, "duration": 4.019}, {"text": "a lot of fun and that's the true story", "start": 1947.58, "duration": 4.74}, {"text": "behind inste parses we really just did", "start": 1950.009, "duration": 8.76}, {"text": "it for the joy of it now I know some of", "start": 1952.32, "duration": 8.79}, {"text": "you probably did come here to learn a", "start": 1958.769, "duration": 3.541}, {"text": "little more about", "start": 1961.11, "duration": 4.02}, {"text": "how to use instep arse versus how to", "start": 1962.31, "duration": 4.32}, {"text": "implement insta purse", "start": 1965.13, "duration": 4.08}, {"text": "so we have a little bit of time here", "start": 1966.63, "duration": 4.62}, {"text": "what I want to do I again I'm not going", "start": 1969.21, "duration": 4.08}, {"text": "to just show every feature but I think", "start": 1971.25, "duration": 4.86}, {"text": "it's useful to understand the overall", "start": 1973.29, "duration": 5.28}, {"text": "sort of workflow the experience of what", "start": 1976.11, "duration": 4.41}, {"text": "it's like to work with insta parse and", "start": 1978.57, "duration": 3.78}, {"text": "hopefully that'll motivate you to go off", "start": 1980.52, "duration": 6.02}, {"text": "and read the full tutorial on github so", "start": 1982.35, "duration": 4.19}, {"text": "the basic process with insta parse and", "start": 1986.96, "duration": 3.79}, {"text": "I'll go into each of these steps in a", "start": 1989.49, "duration": 3.12}, {"text": "little more detail is first you just", "start": 1990.75, "duration": 3.87}, {"text": "write down your grammar and then you", "start": 1992.61, "duration": 4.11}, {"text": "play around with it see how it looks you", "start": 1994.62, "duration": 3.51}, {"text": "figure out what information you want to", "start": 1996.72, "duration": 3.44}, {"text": "hide and then you figure out how you", "start": 1998.13, "duration": 4.23}, {"text": "transform that tree into the actual", "start": 2000.16, "duration": 5.14}, {"text": "thing you want so going back at the very", "start": 2002.36, "duration": 4.14}, {"text": "beginning of the talk I showed that", "start": 2005.3, "duration": 5.37}, {"text": "Scala map format so that's I mean so far", "start": 2006.5, "duration": 5.31}, {"text": "we've been looking at all these grammars", "start": 2010.67, "duration": 3.69}, {"text": "that are AAA BBB AAA and I know that", "start": 2011.81, "duration": 4.77}, {"text": "gets a little mind-numbing so here's a", "start": 2014.36, "duration": 4.02}, {"text": "slightly more real-world example it's", "start": 2016.58, "duration": 3.84}, {"text": "it's still simple enough you could", "start": 2018.38, "duration": 3.63}, {"text": "tackle it with other techniques I", "start": 2020.42, "duration": 3.45}, {"text": "understand but it's at least a little", "start": 2022.01, "duration": 5.13}, {"text": "more real so what we do is we start by", "start": 2023.87, "duration": 6.33}, {"text": "writing down the grammar and by", "start": 2027.14, "duration": 5.34}, {"text": "convention usually the top the first", "start": 2030.2, "duration": 4.44}, {"text": "rule is kind of a top-level rule we're", "start": 2032.48, "duration": 4.35}, {"text": "defining a map what's the rule for a map", "start": 2034.64, "duration": 5.04}, {"text": "well it's got the string map a left", "start": 2036.83, "duration": 5.72}, {"text": "paren and a bunch of key value pairs", "start": 2039.68, "duration": 5.49}, {"text": "separated by commas that's basically", "start": 2042.55, "duration": 5.71}, {"text": "what the first line says what's a key", "start": 2045.17, "duration": 5.76}, {"text": "value well it's a string and then an", "start": 2048.26, "duration": 5.31}, {"text": "arrow and then another string what's a", "start": 2050.93, "duration": 6.24}, {"text": "string well we can define that with a", "start": 2053.57, "duration": 5.19}, {"text": "regular expression so you can actually", "start": 2057.17, "duration": 3.87}, {"text": "use regular expressions in insta parse", "start": 2058.76, "duration": 7.89}, {"text": "to define your tokens then we feed this", "start": 2061.04, "duration": 8.88}, {"text": "to the parser function and the insta", "start": 2066.65, "duration": 6.45}, {"text": "parse namespace and I have this little", "start": 2069.92, "duration": 5.4}, {"text": "flag here Auto whitespace standard it's", "start": 2073.1, "duration": 4.35}, {"text": "a relatively new feature in insta parse", "start": 2075.32, "duration": 4.8}, {"text": "for grammars where the whitespace really", "start": 2077.45, "duration": 4.56}, {"text": "doesn't matter if it did matter you", "start": 2080.12, "duration": 4.86}, {"text": "would specify the whitespace as part of", "start": 2082.01, "duration": 6.93}, {"text": "the strings in your grammar rules and we", "start": 2084.98, "duration": 5.67}, {"text": "plug it in and we see what we get and", "start": 2088.94, "duration": 2.79}, {"text": "this is great you know this is rep", "start": 2090.65, "duration": 2.94}, {"text": "lorina development we get to try our", "start": 2091.73, "duration": 3.829}, {"text": "grammar see how it all works out", "start": 2093.59, "duration": 5.029}, {"text": "keep refining it and we basically get", "start": 2095.559, "duration": 4.44}, {"text": "the structure that we want but there's", "start": 2098.619, "duration": 3.42}, {"text": "these extra things in there like there's", "start": 2099.999, "duration": 5.19}, {"text": "the word map and that left paren it's in", "start": 2102.039, "duration": 5.46}, {"text": "there because those were part of the", "start": 2105.189, "duration": 4.471}, {"text": "structure but once we've got the overall", "start": 2107.499, "duration": 3.51}, {"text": "structure we don't need those words", "start": 2109.66, "duration": 3.809}, {"text": "anymore we don't need that left paren as", "start": 2111.009, "duration": 6.72}, {"text": "part of our tree so we come to step two", "start": 2113.469, "duration": 6.84}, {"text": "and insta parse we just put angle", "start": 2117.729, "duration": 5.04}, {"text": "brackets in our grammar around anything", "start": 2120.309, "duration": 4.53}, {"text": "that we want to hide that we don't", "start": 2122.769, "duration": 4.5}, {"text": "really care about appearing in our tree", "start": 2124.839, "duration": 6.291}, {"text": "so I've put angle brackets down below on", "start": 2127.269, "duration": 6.75}, {"text": "around the word map and around the paren", "start": 2131.13, "duration": 6.609}, {"text": "and around the arrow and now when we", "start": 2134.019, "duration": 6.45}, {"text": "rerun it you can see those things are", "start": 2137.739, "duration": 5.01}, {"text": "missing from the tree this is pretty", "start": 2140.469, "duration": 4.32}, {"text": "good this is you know getting really", "start": 2142.749, "duration": 5.58}, {"text": "close to what we want but ideally we", "start": 2144.789, "duration": 6.42}, {"text": "want to get it to an actual closure map", "start": 2148.329, "duration": 7.351}, {"text": "right that's our end goal well insta", "start": 2151.209, "duration": 7.681}, {"text": "parse includes a function called", "start": 2155.68, "duration": 5.46}, {"text": "transform and I mean you can use", "start": 2158.89, "duration": 4.409}, {"text": "whatever tools are you know you have all", "start": 2161.14, "duration": 4.139}, {"text": "these rich closure functions and tools", "start": 2163.299, "duration": 3.99}, {"text": "to manipulate data you can do this", "start": 2165.279, "duration": 3.96}, {"text": "however you want but you can use the", "start": 2167.289, "duration": 3.72}, {"text": "built in transform function which lets", "start": 2169.239, "duration": 5.55}, {"text": "you put for each node type in the tree a", "start": 2171.009, "duration": 6.3}, {"text": "function to be applied to the children", "start": 2174.789, "duration": 6.03}, {"text": "and this is done in kind of a bottom-up", "start": 2177.309, "duration": 5.28}, {"text": "transformation to the tree and when you", "start": 2180.819, "duration": 4.46}, {"text": "plug in these particular functions", "start": 2182.589, "duration": 5.73}, {"text": "associated with these keywords then you", "start": 2185.279, "duration": 5.41}, {"text": "get back the actual map you're looking", "start": 2188.319, "duration": 4.62}, {"text": "for so that's the basic idea you want to", "start": 2190.689, "duration": 5.0}, {"text": "get from Scala maps to closure Maps", "start": 2192.939, "duration": 6.39}, {"text": "here's three easy steps step one was", "start": 2195.689, "duration": 6.37}, {"text": "create the grammar step two was hide the", "start": 2199.329, "duration": 3.811}, {"text": "things you don't care about with the", "start": 2202.059, "duration": 3.42}, {"text": "angle brackets and step three is either", "start": 2203.14, "duration": 4.139}, {"text": "use the built in transform function or", "start": 2205.479, "duration": 3.81}, {"text": "whatever closure functions you want to", "start": 2207.279, "duration": 5.851}, {"text": "get this into the final closure form", "start": 2209.289, "duration": 6.93}, {"text": "that you're looking for okay time to", "start": 2213.13, "duration": 7.349}, {"text": "wrap things up two main ideas here from", "start": 2216.219, "duration": 5.85}, {"text": "this talk first is just telling you a", "start": 2220.479, "duration": 3.33}, {"text": "little bit about insta parse insta parse", "start": 2222.069, "duration": 3.96}, {"text": "is a lightweight tool for converting", "start": 2223.809, "duration": 4.38}, {"text": "context-free grammars into an executable", "start": 2226.029, "duration": 2.971}, {"text": "parser", "start": 2228.189, "duration": 2.911}, {"text": "and those parsers can be used to convert", "start": 2229.0, "duration": 5.52}, {"text": "strings into data but the other big idea", "start": 2231.1, "duration": 5.9}, {"text": "from this talk is that under the hood", "start": 2234.52, "duration": 5.49}, {"text": "insta parse in my opinion is a really", "start": 2237.0, "duration": 6.61}, {"text": "great example of the extra algorithmic", "start": 2240.01, "duration": 6.3}, {"text": "power you get when you use asynchronous", "start": 2243.61, "duration": 6.27}, {"text": "calls and data flow I'd like to finish", "start": 2246.31, "duration": 5.79}, {"text": "off with something I saw on the IRC", "start": 2249.88, "duration": 4.68}, {"text": "channel I actually have absolutely no", "start": 2252.1, "duration": 4.11}, {"text": "idea who these two people are I hope", "start": 2254.56, "duration": 3.06}, {"text": "they don't mind my using this in the", "start": 2256.21, "duration": 4.56}, {"text": "talk I figure since this out there in", "start": 2257.62, "duration": 5.55}, {"text": "the public on the internet it's totally", "start": 2260.77, "duration": 6.21}, {"text": "a fair to use it the point I wanted to", "start": 2263.17, "duration": 5.55}, {"text": "make with this slide is that when when", "start": 2266.98, "duration": 4.83}, {"text": "Alex and I started out making insta", "start": 2268.72, "duration": 6.21}, {"text": "parse we were genuinely trying to make a", "start": 2271.81, "duration": 6.15}, {"text": "tool that people would find useful but", "start": 2274.93, "duration": 4.98}, {"text": "what I think has taken us by surprise", "start": 2277.96, "duration": 4.5}, {"text": "and really delighted us is that for many", "start": 2279.91, "duration": 4.98}, {"text": "people it seems to not just be a tool", "start": 2282.46, "duration": 4.83}, {"text": "but it's something that has suddenly", "start": 2284.89, "duration": 4.86}, {"text": "made for them made grammars and made", "start": 2287.29, "duration": 6.06}, {"text": "parsing more accessible and more fun I", "start": 2289.75, "duration": 5.49}, {"text": "mean who would have ever thought parsing", "start": 2293.35, "duration": 5.61}, {"text": "is fun you know whoa and honestly out of", "start": 2295.24, "duration": 5.64}, {"text": "all the things that has happened with", "start": 2298.96, "duration": 3.36}, {"text": "insta parse the fact that people are", "start": 2300.88, "duration": 5.4}, {"text": "using it to find parsing this fun I mean", "start": 2302.32, "duration": 5.76}, {"text": "that's honestly what we're most proud of", "start": 2306.28, "duration": 5.36}, {"text": "so thank you very much", "start": 2308.08, "duration": 3.56}]] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment