GSP
Quick Navigator

Search Site

Unix VPS
A - Starter
B - Basic
C - Preferred
D - Commercial
MPS - Dedicated
Previous VPSs
* Sign Up! *

Support
Contact Us
Online Help
Handbooks
Domain Status
Man Pages

FAQ
Virtual Servers
Pricing
Billing
Technical

Network
Facilities
Connectivity
Topology Map

Miscellaneous
Server Agreement
Year 2038
Credits
 

USA Flag

 

 

Man Pages
Pegex::Miscellany(3) User Contributed Perl Documentation Pegex::Miscellany(3)

This document contains things about Pegex that were written but seemed out of place in their original documents. Still they are possibly useful so live here for now.

In the diagram below, there is a simple language called Foo. The diagram shows how Pegex can take a text grammar defining Foo and generate a parser that can parse Foo sources into data (abstract syntax trees).

                              Parsing a language called "Foo"
                                 with the Pegex toolset.

                                .-----------------------.
    .--------------------.      |    Pegex::Compiler    |
    |    Foo Language    |      |-----------------------|    Serialize
    |--------------------|----->| Pegex::Grammar::Pegex |---------.
    | Pegex grammar text |      | Pegex::Receiver       |         |
    '--------------------'      '-----------------------'         v
    ......................                  |                 .------.
    |                    |                  | compile()       | YAML |
    |foo: verb noun      |                  v                 '------'
    |verb: /Hello/       |       .--------------------.       .------.
    |noun: /world/       |       | Foo grammar tree   |       | JSON |
    |                    |       '--------------------'       '------'
    ......................                  |                 .------.
                                            |                 | Perl |
                                            v                 '------'
                                 .---------------------.      .--------.
                                 | Pegex::Grammar::Foo |      | Python |
                                 |---------------------|      '--------'
                                 | Pegex::Parser       |      .-----.
                                 | Pegex::AST::Foo     |      | etc |
     .-----------------.         '---------------------'      '-----'
     |  Foo Language   |                    |
     |-----------------|------------------->| parse()
     | Foo source text |                    v
     '-----------------'        .----------------------.
     ...................        | Parsed Foo Data Tree |
     |Hello world      |        '----------------------'
     ...................        ........................
                                |- verb: Hello         |
                                |- noun: world         |
                                ........................

Pegex is self-hosting. This means that the Pegex grammar language syntax is defined by a Pegex grammar! This is important because (just like any Pegex based language) it makes it easier to port to new programming languages. You can find the Pegex grammar for Pegex grammars here: <http://github.com/ingydotnet/pegex-pgx/>.

Pegex was originally inspired by Perl 6 Rules. It also takes ideas from Damian Conway's Perl 5 module, Regexp::Grammars. Pegex tries to take the best ideas from these great works, and make them work in as many languages as possible. That's Acmeism.

You can have some fun using Pegex to compile itself. First get the Pegex grammar repo:

    git clone git://github.com/ingydotnet/pegex-pgx.git
    cd pegex-pgx

Then parse and dump the Pegex grammar with Pegex:

    perl -MXXX -MPegex -e 'XXX pegex("pegex.pgx")->parse("pegex.pgx")'

For a different view of the data tree, try:

    perl -MXXX -MPegex -e 'XXX pegex("pegex.pgx", receiver => "Pegex::Tree")->parse("pegex.pgx")'

Finally to emulate the Pegex compiler do this:

    perl -MXXX -MPegex -e 'XXX pegex("pegex.pgx", receiver => "Pegex::Pegex::AST")->parse("pegex.pgx")'

This specifies a "receiving" class that can shape the results into something useful. Indeed, this is the exact guts of Pegex::Grammar::Pegex.

TestML is a new Acmeist unit test language. It is perfect for software that needs to run equivalently in more than one language. In fact, Pegex itself is tested with TestML!!

TestML has a language specification grammar: <http://www.testml.org/specification/language/>

The Perl6 implementation of TestML uses this grammar in: <https://github.com/ingydotnet/testml-pm6/blob/master/lib/TestML/Parser/Grammar.pm>

All other implementations of TestML use this Pegex grammar: <https://github.com/ingydotnet/testml-pgx/blob/master/testml.pgx>

In Perl 5, Pegex::Compiler is used to compile the grammar into this simple data structure (shown in YAML): <https://github.com/ingydotnet/testml-pgx/blob/master/testml.pgx.yaml>

The grammar can also be precompiled to JSON: <https://github.com/ingydotnet/testml-pgx/blob/master/testml.pgx.json>

Pegex::Compiler further compiles this into a Perl 5 only grammar tree, which becomes this module: <https://github.com/ingydotnet/testml-pm/blob/master/lib/TestML/Compiler/Pegex/Grammar.pm>

TestML::Parser::Grammar is a subclass of Pegex::Grammar. It can be used to parse TestML files. TestML::Parser calls the parse() method of the grammar with a TestML::AST object that receives callbacks when various rules match, and uses the information to build a TestML::Document object.

Thus TestML is an Acmeist language written in Pegex. It can be easily ported to every language where Pegex exists. In fact, it must be ported to those languages in order to test the new Pegex implementation!

2020-02-13 perl v5.32.1

Search for    or go to Top of page |  Section 3 |  Main Index

Powered by GSP Visit the GSP FreeBSD Man Page Interface.
Output converted with ManDoc.