FancyPars
Rory McGuire via Digitalmars-d-announce
digitalmars-d-announce at puremagic.com
Mon Sep 14 07:59:35 PDT 2015
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 at 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.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d-announce/attachments/20150914/371b754b/attachment.html>
More information about the Digitalmars-d-announce
mailing list