Xtreams: Debugging Grammars

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Xtreams: Debugging Grammars

Chris Cunnington-4
>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