Maitreya is a generalized LR parser generator written in javascript.
- Accept GLR grammars, not limited to LR(k) grammars.
- Support incremental (not yet) / streaming parsing.
- Can do both scanner less parsing and token based parsing.
- Can build grammar on the fly by using parser combinators.
- Support both interpretation and code genearation.
import {defineGrammar, def, ref, many1, regex, choice} from 'maitreya/grammar';
import {GLRParser} from 'maitreya/interpret';
let grammar = defineGrammar(() => {
def('exp', [ref('num')], ([num]) => num);
def('exp', [ref('exp'), ref('op'), ref('exp')], ([lhs, op, rhs]) => op(lhs, rhs));
def('num', [many1(regex(/^[0-9]/))], ([digits]) => Number(digits.join('')));
def('op', [choice('+', '-')], ([op]) => {
return {
['+'](lhs, rhs) { return lhs + rhs; },
['-'](lhs, rhs) { return lhs - rhs; }
}[op];
});
});
let parser = new GLRParser(grammar);
parser.feed('3+2-5');
console.log(parser.results);
Still interested? Look at the API Reference
- Interpret mode.
- Code generation frontend.
- Code generation backends.
- Complete the test cases.
- API documentation and website.
- Performance benchmark and optimisation.