When I evaluate: parser := PEGParser parserPEG parse: 'Grammar' stream: PEGParser
grammarEmailAddress actor: PEGParserParser new.
I get: KeyNotFound: key 'quotedstring' not found in Dictionary
How am I supposed to debug that to find the typo in my giant string above?!
Hi Sean,
Your error is saying is that there is no key called 'quotedstring' in the dictionary in the grammar ivar of your parser.
In each parser is a grammar ivar. It contains a dictionary. The values of the dictionary are graphs of compiled blocks. Each node of the graph is a block with arguments that are blocks that have arguments that are blocks, etc. It's a graph of compiled blocks.
Try this. Add in PEGParser class.
grammar3Names " a grammar to create a parser to sort three names as per page 24 of Grune's book Parsing Techniques (1990)"
^'Sentence <- NAME
NAME <- "tom" / "dick" / "harry" '
Now execute this.
(PEGParser parserBootstrap) parse: 'Grammar' stream: PEGParser grammar3Names reading actor: PEGParserGenerator new.
That will show you the code that will create the dictionary in the grammar ivar. Now make a change.
myparser := (PEGParser parserBootstrap) parse: 'Grammar' stream: PEGParser grammar3Names reading actor: PEGParserParser new.
You generated the parser, not the code for the parser.
To use the parser.
myparser parse: 'Sentence' stream: 'harry' reading actor: nil
Now let's look at the same thing in three ways.
PEGParser>>#grammarPEG this is the grammar PEGParser>>#parserBootstrap this is the code generated by the PEGParserGenerator from grammarPEG PEGParser>>#parserPEG this is the parser returned by PEGParserParser from grammarPEG
You will see that PEGParser parserBootstrap and PEGParser parserPEG are interchangeable anywhere. In fact, if the goal is to populate the grammar ivar with a dictionary to make a parser, then #parserPEG starts to grate on one's nerves, because you already have what you need in the grammar ivar by evaluating PEGParser parserBootstrap. #parserPEG compiles the grammarPEG using PEGParserParser into the grammar ivar to make a parser, but it's the exact same as what was already there. It's irritating.
I'll release some examples in a package called Xtreamly some time before Christmas to help start understanding Xtreams-Parsing.
HTH, Chris
squeak-dev@lists.squeakfoundation.org