parsejs-grammar
v0.1.0
Published
PEG-like expression builder for JavaScript. <1kb.
Downloads
5
Maintainers
Readme
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