Skip to content

Grammars as D Modules

Temtaime edited this page Mar 5, 2016 · 8 revisions

Grammars a D Modules

Before being mixed-in, a grammar output by grammar is just a string. If you do not want to generate your grammar anew each time your module is compiled, save the grammar code as a D module and import it. I found I needed this frequently enough to put the functionality in Pegged:

asModule("moduleName", "my/project/hierarchy/fileName", myGrammar, optHeader);

For example:

asModule("arithmetic","arithmetic",
"Arithmetic:
    Expr     <- Factor AddExpr*
    AddExpr  <- ('+'/'-') Factor
    Factor   <- Primary MulExpr*
    MulExpr  <- ('*'/'/') Primary
    Primary  <- Parens / Number / Variable / '-' Primary

    Parens   <- '(' Expr ')'
    Number   <~ [0-9]+
    Variable <- identifier
");

This will create the arithmetic.d file in the current directory, with the necessary infrastructure.

Once you're done, you can use your grammar:

import arithmetic;

enum input = "2/(8*7988+1*6196-y)";
enum parseTree = Arithmetic(input);

That should speed up the compiling, since the grammar is already generated. Also you can use optional header for instance for importing your own modules with semantic actions.

As another example Pegged's own parser, the one used by grammar to parse the grammar-as-a-string the user provides, is generated like this:

import pegged.examples.peggedgrammar; // contains Pegged grammar as a string, name PEGGEDgrammar
asModule("pegged.parser", "pegged/parser", PEGGEDgrammar);

Next Lesson: Grammar Composition.


Pegged Tutorial

Clone this wiki locally