|
>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
|