Nice one, thanks for the info. I just used Pegged to generate an API for a JSON REST service at compile time so I'm still geeking out about the power of D at compile time, but I'm always interested in parsers.
On Mon, Sep 14, 2015 at 10:50 AM, Bastiaan Veelo via Digitalmars-d-announce <digitalmars-d-announce@puremagic.com> wrote: > On Monday, 6 July 2015 at 09:22:51 UTC, Per Nordlöw wrote: > >> >> How does its design and use differ from Pegged? >> > > FWIW, this is what I learned from my first acquaintance with FancyPars > (the OP having signalled not to be available for questions). My conclusions > may be wrong though. > > Running dub produces a vibe.d web server demonstrating the capabilities of > FancyPars. This was a bit confusing at first because being a web-app seemed > central to the design of FancyPars, but I think it is not. Anyway, the > first page shows a large edit field containing an example grammar, and a > button "Generate AST". Clicking this button brings up the second page > containing D code for the lexer and parser for the given grammar, type > definitions for the nodes of the AST, as well as code for printing the AST. > > Understanding the source of FancyPars is challenging because the core > source, example vibe.d application source and supporting code, as well as > generated lexer/parser code are all contained in the same directory and > committed in the repository. > > The syntax for the grammar definition is different from Pegged, and seems > to be inspired by D. It supports a hierarchical structure. It looks > powerful, but is undocumented. The example grammar looks like this: > > ASTNode { > Identifier @internal { > [a-zA-Z_][] identifier > } > > Group @parent { > Identifier name, ? "@" : Identifier[] annotations : "@", "{", > PatternElement[] elements : "," / Group[] groups, > "}" > } > > PatternElement @internal { > > AlternativeElement @noFirst { > PatternElement[] alternatives : "/" > } > > LexerElement { > > StringElement { > "\"", char[] string_, "\"" > } > > NamedChar { > "char", ? "[]" : bool isArray, Identifier name > } > > CharRange @internal { > char rangeBegin, ? "-" : char RangeEnd > } > > RangeElement { > "[", CharRange[] ranges, "]" > } > > LookbehindElement { > "?lb", "(", StringElement str, ")" > } > > NotElement { > "!", LexerElement ce > } > > } > > NamedElement { > Identifier type, ? "[]" : bool isArray, Identifier name, > ? bool isArray : ? ":" : StringElement lst_sep > } > > ParenElement { > "(", PatternElement[] elements : ",", ")" > } > > FlagElement { > "bool", Identifier flag_name > } > > QueryElement { > "?", "bool", Identifier flag_name, ":", PatternElement elem > } > > OptionalElement { > "?", LexerElement[] ce : ",", ":", PatternElement elem > } > > } > } > > > Its announced support for left-recursion is interesting, and I may decide > to play a bit further with it. My objective would be to see if an Extended > Pascal to D translating compiler would be feasible. > > Cheers, > Bastiaan Veelo. >