{ "__schema" : "4.1", "__type" : "page", "children" : { "__type" : "snippets", "items" : [ { "__type" : "textSnippet", "children" : { "__type" : "snippets", "items" : [ ] }, "createEmail" : { "__type" : "email", "emailString" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:04:52.926306+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "editTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:05:09.50221+02:00" } }, "uid" : { "__type" : "uid", "uidString" : "GJFVij2ZDQCcDd1tDqn2mw==" }, "paragraphStyle" : { "__type" : "textStyle" }, "string" : "In this section, we will go through the process of building a parser “from scratch” together." }, { "__type" : "textSnippet", "children" : { "__type" : "snippets", "items" : [ ] }, "createEmail" : { "__type" : "email", "emailString" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:05:12.833745+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "editTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:06:10.030858+02:00" } }, "uid" : { "__type" : "uid", "uidString" : "xbeQiz2ZDQCcD88QDqn2mw==" }, "paragraphStyle" : { "__type" : "textStyle" }, "string" : "In practice, SmaCC comes with so many amenities already that “from scratch” means “from an already made bed” more than anything else. You will see what I mean as we go through this together." }, { "__type" : "textSnippet", "children" : { "__type" : "snippets", "items" : [ ] }, "createEmail" : { "__type" : "email", "emailString" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:06:13.583081+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "editTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:09:39.026231+02:00" } }, "uid" : { "__type" : "uid", "uidString" : "J3E/jz2ZDQCcETMJDqn2mw==" }, "paragraphStyle" : { "__type" : "textStyle" }, "string" : "The code for this section largely resides inside {{gtClass:CarpParser}} and the subclasses of {{gtClass:CarpExpressionNode}}. You can take a look at them below." }, { "__type" : "textSnippet", "children" : { "__type" : "snippets", "items" : [ ] }, "createEmail" : { "__type" : "email", "emailString" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:07:30.484217+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "editTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:08:55.160826+02:00" } }, "uid" : { "__type" : "uid", "uidString" : "lon3kT2ZDQCcE768Dqn2mw==" }, "paragraphStyle" : { "__type" : "textStyle" }, "string" : "{{gtExample:CarpExpressionNode class >> #itself | noCode=true | previewExpanded=true | previewShow=#gtSubclassesFor:}}" }, { "__type" : "textSnippet", "children" : { "__type" : "snippets", "items" : [ ] }, "createEmail" : { "__type" : "email", "emailString" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:09:13.686592+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "editTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:09:55.020248+02:00" } }, "uid" : { "__type" : "uid", "uidString" : "jDDBmT2ZDQCcGKn5Dqn2mw==" }, "paragraphStyle" : { "__type" : "textStyle" }, "string" : "If this seems like a dizzying amount of classes to write, don’t worry—they’re autogenerated. The only class we will have to touch is the parser, and the rest will follow." }, { "__type" : "textSnippet", "children" : { "__type" : "snippets", "items" : [ ] }, "createEmail" : { "__type" : "email", "emailString" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:09:58.500922+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "editTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:11:32.016153+02:00" } }, "uid" : { "__type" : "uid", "uidString" : "cEqknD2ZDQCcGminDqn2mw==" }, "paragraphStyle" : { "__type" : "textStyle" }, "string" : "If you want to have a non-Carp-centric explanation of how to work with parsers in SmaCC, the Glamorous Toolkit book has a section on that as well, {{gtPage:Playing with Parsers in SmaCC - Show|db=2j9m7db2i4oz116bexd7wbdxo}}. It doesn’t cover all of the ground we will, but it should give you enough of an introduction to feel less lost." }, { "__type" : "textSnippet", "children" : { "__type" : "snippets", "items" : [ ] }, "createEmail" : { "__type" : "email", "emailString" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:11:36.888183+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "editTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:11:46.504487+02:00" } }, "uid" : { "__type" : "uid", "uidString" : "xvVdoj2ZDQCcpQCVDqn2mw==" }, "paragraphStyle" : { "__type" : "textStyle" }, "string" : "## Step I: Generating a parse tree" }, { "__type" : "textSnippet", "children" : { "__type" : "snippets", "items" : [ ] }, "createEmail" : { "__type" : "email", "emailString" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:11:48.803566+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "editTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:11:49.328916+02:00" } }, "uid" : { "__type" : "uid", "uidString" : "9FI7oz2ZDQCcp4WzDqn2mw==" }, "paragraphStyle" : { "__type" : "textStyle" }, "string" : "TODO" }, { "__type" : "textSnippet", "children" : { "__type" : "snippets", "items" : [ ] }, "createEmail" : { "__type" : "email", "emailString" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:11:51.714664+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "editTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:12:08.856107+02:00" } }, "uid" : { "__type" : "uid", "uidString" : "twRZoz2ZDQCcqex7Dqn2mw==" }, "paragraphStyle" : { "__type" : "textStyle" }, "string" : "## Step II: Generating an AST" }, { "__type" : "textSnippet", "children" : { "__type" : "snippets", "items" : [ ] }, "createEmail" : { "__type" : "email", "emailString" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:12:10.773142+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "editTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:12:47.439878+02:00" } }, "uid" : { "__type" : "uid", "uidString" : "pVmLpD2ZDQCcq9tADqn2mw==" }, "paragraphStyle" : { "__type" : "textStyle" }, "string" : "TODO" }, { "__type" : "textSnippet", "children" : { "__type" : "snippets", "items" : [ ] }, "createEmail" : { "__type" : "email", "emailString" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:18:53.161795+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "editTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:19:02.231751+02:00" } }, "uid" : { "__type" : "uid", "uidString" : "RbB6vD2ZDQCctg5pDqn2mw==" }, "paragraphStyle" : { "__type" : "textStyle" }, "string" : "## Step III: Playing with your AST" }, { "__type" : "textSnippet", "children" : { "__type" : "snippets", "items" : [ ] }, "createEmail" : { "__type" : "email", "emailString" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:19:03.612588+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "editTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:20:04.139943+02:00" } }, "uid" : { "__type" : "uid", "uidString" : "NDAnvT2ZDQCcuJ7fDqn2mw==" }, "paragraphStyle" : { "__type" : "textStyle" }, "string" : "While this step isn’t strictly necessary, I encourage you to take this moment to take a break, relax, and play a little with your new toy." }, { "__type" : "textSnippet", "children" : { "__type" : "snippets", "items" : [ ] }, "createEmail" : { "__type" : "email", "emailString" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:20:10.650719+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "editTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:21:45.318245+02:00" } }, "uid" : { "__type" : "uid", "uidString" : "i+YTwT2ZDQCcupQKDqn2mw==" }, "paragraphStyle" : { "__type" : "textStyle" }, "string" : "Over in the bonus section, there is a chapter on [[Visualizing code using our AST]]. It’s just a suggestion, but maybe there are some questions you’ve been asking yourself about your code bases lately that you can now finally answer using the AST? If you do, be sure to tell me about it!" } ] }, "createEmail" : { "__type" : "email", "emailString" : "" }, "createTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:04:50.114519+02:00" } }, "editEmail" : { "__type" : "email", "emailString" : "" }, "editTime" : { "__type" : "time", "time" : { "__type" : "dateAndTime", "dateAndTimeString" : "2022-04-17T18:04:50.114519+02:00" } }, "pageType" : { "__type" : "namedPage", "title" : "Building a parser from scratch" }, "uid" : { "__type" : "uuid", "uuid" : "8beb548a-3d99-0d00-9c0c-1aaf0ea9f69b" } }