coregrammars 0.4.0

Grammars containing core language features, for creating DSLs and embedded languages

To use this package, run the following command in your project's root directory:

Manual usage
Put the following dependency into your project's dependences section:

This package provides sub packages which can be used individually:

coregrammars:core - Shared components

coregrammars:terms - Terminals grammar

coregrammars:expr - Numeric Expression grammar

coregrammars:ini - INI grammar

coregrammars:json - JSON grammar

coregrammars:md - MD grammar

coregrammars:xml - XML grammar

coregrammars:pegged - Pegged grammar


A collection of basic grammars in D / pegged compiled as modules.

Each grammar is contained in a submodule, so to include the ini grammar for example, add coregrammars:ini to your dependencies.

There are also a collection of parsers that convert grammar tree nodes into tuples at compile time.

And, there are utilities that can also process files at runtime into a Variant[string] reference. This can be used to update field values a tuple parsed at compile time.

To use the grammars:

import coregrammars.gen.json;

enum input = `
"Number": 42,
"Decimal": 123.456,
"String": "abc",
"NullString": "",
"Escape": "\uAAAA\n\\Hello",
"Array" : [0,1,2],
"Array2": [0, [0,1,2], "abc"],
"Obj"   : { "Member":0, "Member":[0,1,2] },
"True"  : true,
"False" : false,
"Null"  : null,
"Empty" : {}

enum nodes = JSONGrammar(input);

assert(nodes[0][0][0].matches == ["Number"]);
assert(nodes[0][0][1].matches == ["42"]);

And so on for the other grammars.

Here is the list of grammars:

  • Terminals: basic terminal expressions such as strings, numbers and booleans.
  • Expressions: arithmetic expressions.
  • INI: standard INI file syntax
  • JSON: standard JSON syntax
  • Markdown: standard markdown syntax

These exist as .peg files in the resources folder.

To regenerate the modules from .peg files, run:

dub test -c modgen && dub run -c modgen && dub test

To use the parsers:

    import coregrammars.gen.ini;
    import coregrammars.parsers.ini;

	enum Nodes = INIGrammar(q{
testKey = "test value"
testKey2 = "test value"
testBool = false

testKeyA = "test value A"
testKeyA2 = "test value B"
testInt = 10

testKeyB = "test value B"
#testDouble = 54.321

testKey = "test value 2"

testKeyA = "test value 2 A"
testIntA = 22

testKey = "test value"

	enum x = parse_node!Nodes;
	static assert(x.TestSect.A.testKeyA2 == "test value B");
	static assert(x.TestSect.testBool == false);
	static assert(x.TestSect2.A.testIntA == 22);
  import coregrammars.gen.json;
  import coregrammars.parsers.json;
  alias JSON=JSONGrammar;
    enum example2 = `
    "Number": 42,
    "Decimal": 123.456,
    "String": "abc",
    "NullString": "",
    "Escape": "\uAAAA\n\\Hello",
    "Array" : [0,1,2],
    "Array2": [0, [0,1,2], "abc"],
    "Obj"   : { "Member":0, "Member2":[0,1,2] },
    "True"  : true,
    "False" : false,
    "Null"  : null,
    "Empty" : {}

    enum example2Tree = JSON(example2);
    enum x = parse_node!example2Tree;

    static assert(x.Number == 42);
    static assert(x.Array[2] == 2);
    static assert(x.Array2[1][1] == 1);
    static assert(x.Obj.Member2[2] == 2);

To load an ini file into an array Variant[string] at runtime

	auto txt = readText("./resources/tests/testB.ini");
	auto nodes = INIGrammar(txt);
	Variant[string] vals;

	assert(vals["TestSect"]["A"]["testKeyA2"] == "test value B ***");

Load a file at runtime and override the values in a tuple created at compile time:

    enum Nodes = INIGrammar(import("tests/test.ini"));
	auto nodesTuple = parse_node!Nodes;

	auto txt = readText("./resources/tests/testB.ini");
	auto nodes = INIGrammar(txt);
	Variant[string] vals;

	assert(nodesTuple.TestSect.A.testKeyA2 == "test value B ***");


The terminals grammar is losing the type information for Terminals.Number nodes. At this time all numbers are processed into doubles, however it should be simple to implement int as well.

  • Mark Fisher
Sub packages:
coregrammars:core, coregrammars:terms, coregrammars:expr, coregrammars:ini, coregrammars:json, coregrammars:md, coregrammars:xml, coregrammars:pegged
pegged, yyd
0.4.0 2024-Mar-08
0.3.0 2024-Mar-04
0.2.2 2024-Feb-22
0.2.1 2023-Feb-10
0.2.0 2023-Feb-02
Show all 13 versions
Download Stats:
  • 0 downloads today

  • 0 downloads this week

  • 0 downloads this month

  • 43 downloads total

Short URL: