Wondering what’s next for npm?Check out our public roadmap! »

    parsejs-grammar

    0.1.0 • Public • Published

    Parsing Expression Grammar

    PEG-like expression builder for JavaScript. <1kb.

    Installation

    $ npm install parsejs-grammar
    

    browser:

    $ component install parsejs/grammar
    

    Features

    • easily define a custom parsing expression grammar (PEG)
    • reuse and recombine PEGs with .use(grammar)
    • expressions can be referenced by name, so complex grammars are very readable

    Overview

    A grammar is a set of expressions that share a common namespace. This means you can define named expressions within a grammar, and access them from anywhere else within the grammar.

    Expressions can't exist outside of a grammar. A grammar itself is just an expression, it is the start of the expression hierarchy.

    You can nest grammars, and so build on top of them easily!

    Examples

    var Grammar = require('parsejs-grammar');
    var grammar = new Grammar('math');
    var expression = grammar.expression;
     
    expression('math')
      .match(':number', ':operator', ':number', function(left, operator, right){
        switch (operator) {
          case '+': return left + right;
          case '-': return left - right;
          case '*': return left * right;
          case '/': return left / right;
        }
      });
     
    expression('number')
      .match(/\d+/, parseInt);
     
    expression('operator')
      .match('+')
      .match('-')
      .match('*')
      .match('/');
     
    var val = grammar.parse('6*8'); // 42

    Nesting grammars. Say the above simple math grammar was in a module called math-grammar and we had another one called function-grammar. We could create a new grammar that builds on both of those:

    var math = require('math-grammar');
    var fn = require('function-grammar');
    var Grammar = require('parsejs-grammar');
     
    var grammar = new Grammar('foo');
    grammar.use(math);
    grammar.use(fn);

    Then you could use their names in your grammar:

    expression('foo')
      .match(':math')
      .match(':fn');

    Or just use a subset of them:

    expression('foo')
      .match(':fn', ':math:operator', ':fn');

    Licence

    MIT

    Install

    npm i parsejs-grammar

    DownloadsWeekly Downloads

    1

    Version

    0.1.0

    License

    none

    Last publish

    Collaborators

    • avatar