> > 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. > > 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) { > 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? > > 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. Philippe