Parser generator?

Wouter Verhelst wouter at grep.be
Fri Jul 6 11:43:21 PDT 2012


Philippe Sigaud <philippe.sigaud at gmail.com> writes:

>> > Yeah. It's pretty cool. It really shows up D's metaprogramming
>> > capabilities.
>>
>> It's a bit hell to debug it, though. But I finally managed to get a
>> working parser out of it.
>
> I received your suggestion of a full debug mode explaining what rules where
> activated and wich did not.

Good :-)

>> Except now I can't use it, for some reason. Code:
>>
>> void buildGraph(Output o) {
>>         void parseToGraph(ParseTree p) {
>>                 writeln(p.ruleName);
>>         }
>>
>>         parseToGraph(o.parseTree);
>> }
>>
>> void parseconfigs() {
>>         Output o = ENI.parse(readText("/tmp/ifaces_data"));
>>         buildGraph(o);
>> }
>>
>> produces the following error message:
>>
>> dmd  -gc -w -unittest -I../../Pegged -c -ofmain.o main.d
>> ipcfg/parser.d(45): Error: struct pegged.peg.Output(TParseTree) if
> (isParseTree!(TParseTree)) is used as a type
>> make: *** [main.o] Error 1
>>
>> Help?
>
> Roman recently templated the parse tree to allow multiple outputs and we didn't
> update the docs, sorry. That makes Pegged output something other than `Output`.
> One consequence is hat semantic actions should be templates to function on
> different kinds of parse trees.
>
> Try:
>
>> void buildGraph(O)(O o) {

Ah yes, that explains. Thanks.

>>         void parseToGraph(ParseTree p) {
>>                 writeln(p.ruleName);
>>         }
>>
>>         parseToGraph(o.parseTree);
>> }
>>
>> void parseconfigs() {
>>         auto o = ENI.parse(readText("/tmp/ifaces_data"));
>>         buildGraph(o);
>> }
>
> What do parseToGraph and buildGraph do?

Nothing more than that, _currently_. The plan is for them to eventually
build data structures in memory, but I'm not there yet.

>> What does cause problems, though, is that it won't compile with gdc:
>>
>> gdmd -release  -I../../Pegged -c -ofmain.o main.d
>> /home/wouter/code/d/Pegged/pegged/grammar.d:128: Error: template
> pegged.grammar.PEGGED!(ParseTree).PEGGED.parse(ParseLevel pl =
> ParseLevel.parsing) parse(ParseLevel pl = ParseLevel.parsing) matches more than
> one template declaration, /home/wouter/code/d/Pegged/pegged/grammar.d
> (111):parse(ParseLevel pl = ParseLevel.parsing) and /home/wouter/code/d/Pegged/
> pegged/grammar.d(126):parse(ParseLevel pl = ParseLevel.parsing)
>> make: *** [main.o] Error 1
>>
>> GDC 4.6, though, so I'll wait until Iain uploads 4.7 to Debian; if that
>> doesn't fix it, I'll file bugs where appropriate.
>
> I find it strange that I don't get that error with DMD.

Agreed.

-- 
The volume of a pizza of thickness a and radius z can be described by
the following formula:

pi zz a


More information about the Digitalmars-d-learn mailing list