Files
gt4carp/lepiter/98eic2i3mg2eo2ztuqewzxrbf.lepiter
2022-06-11 20:52:51 +02:00

742 lines
19 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"__schema" : "4.1",
"__type" : "page",
"children" : {
"__type" : "snippets",
"items" : [
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T18:04:52.926306+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"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" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T18:05:12.833745+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"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" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T18:06:13.583081+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"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" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T18:07:30.484217+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"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" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T18:09:13.686592+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"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, dont worry—theyre 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" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T18:09:58.500922+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-06-11T20:49:10.152867+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 doesnt cover all of the ground you will need to cover to write your own parser, but it should give you enough of an introduction to feel less lost."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-18T21:12:54.409049+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-18T21:15:52.095384+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "YkG3SFSZDQCfaPv6D3Spxw=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "This section is not a guide for writing a SmaCC parser. Neither am I an expert in that, nor is this within the scope of this booklet. [There are entire books on parsing using SmaCC](https://books.pharo.org/booklet-Smacc/), and perusing that should get you pretty far. I will only provide a few pointers and maybe a thing or two to look at inside GT."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T18:11:36.888183+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"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" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-18T21:00:15.390675+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-18T21:12:18.932746+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "9FI7oz2ZDQCcp4WzDqn2mw=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "As a first step, we need to generate a parse tree. To do that, we can write our parser wtihout specifying anything but the rules themselves, without putting the resulting expressions into any classes. I like to start out doing that, to figure out whether I understand the grammar and see whether I can parse expressions."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-18T21:07:07.653141+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-18T21:12:06.500325+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "C4EONFSZDQCfKITPD3Spxw=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "The downside of this is that we end up with an {{gtClass:OrderedCollection}} of parse nodes, without much to help us understand the actual structure of the input program. To have an actual AST that matches our languages semantics, we will have to do a little more leg work."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T18:11:51.714664+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"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" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-18T21:12:09.876864+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-18T21:17:07.009579+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "pVmLpD2ZDQCcq9tADqn2mw=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "This is the step you will need to do yourself even if you generated a parser from a grammar as described in [[Building a parser from an ANTLR grammar]]."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-18T21:17:18.203944+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-18T21:19:57.342894+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "8uDhV1SZDQCfoU+xD3Spxw=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "At this point we will need to provide names for the tokens and productions. Thisis best done from either the `Grammar` or `Annotations` tabs of the parser. In the video I linked to in [[Building a parser from an ANTLR grammar]] John Brant demonstrates what to do [in this section](https://youtu.be/ClxwPg_L54g?t=981)."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-18T21:22:29.113113+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-18T21:22:56.54305+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "fTH4alSZDQCf63p0D3Spxw=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "If you need another, simple example for a complete parser generating an AST, you might want to check out the {{gtClass:JSONParser}}."
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-18T21:19:59.508189+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-18T21:21:17.790476+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "SaIMYlSZDQCf59wBD3Spxw=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "As a tip: while not strictly necessary, it will be important later on whether you name tokens inside your rules or not. Unnamed tokens will not picked up by the styler and remain woefully unstyled, making you scratch your head why your highlighter doesnt do what it should—I speak from experience!"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-18T21:21:24.403357+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"editTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-18T21:22:10.192457+02:00"
}
},
"uid" : {
"__type" : "uid",
"uidString" : "M+UMZ1SZDQCf6SdSD3Spxw=="
},
"paragraphStyle" : {
"__type" : "textStyle"
},
"string" : "Once you click on `Accept` for your grammar, the appropriate clases, including all the members and their accessors, will be created for you. Congratulations, you have an AST!"
},
{
"__type" : "textSnippet",
"children" : {
"__type" : "snippets",
"items" : [ ]
},
"createEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T18:18:53.161795+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"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" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T18:19:03.612588+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"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 isnt 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" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T18:20:10.650719+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"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]]. Its just a suggestion, but maybe there are some questions youve 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" : "<unknown>"
},
"createTime" : {
"__type" : "time",
"time" : {
"__type" : "dateAndTime",
"dateAndTimeString" : "2022-04-17T18:04:50.114519+02:00"
}
},
"editEmail" : {
"__type" : "email",
"emailString" : "<unknown>"
},
"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"
}
}