This is the primary API package for BABLR. Use it in combination with a BABLR language definition to perform parsing.
import { i, spam } from '@bablr/boot';
import { buildTag } from 'bablr';
import { buildCovers } from '@bablr/helpers/decorators';
const language = {
canonicalURL:
'https://bablr.org/languages/example/digits',
grammar: class {
constructor() {
// If you can use decorators, `@Node` on a production will do this for you
this.covers = buildCovers({
[Symbol.for('@bablr/node')]: ['Number', 'Digit'],
});
}
*Number() {
while (yield i`eatMatch(<*Digit /> 'digits[]')`);
}
*Digit() {
yield i`eat(/\d/)`;
}
},
};
const matcher = spam`<'https://bablr.org/languages/example/digits':Number />`;
const digits = buildTag(language, matcher);
digits`42`;
// <!0:cstml bablr-language="https://bablr.org/languages/example/digits">
// <$>
// .:
// <$Number>
// digits[]: []
// digits[]: <*Digit '4' />
// digits[]: <*Digit '2' />
// </>
// </>
BABLR is actually portmanteau of Babel and ANTLR. It would be reasonable to describe this project as being a mixture of the ideas from those two, with a bit of help from SrcML, Tree-sitter, and the fabulous Redux.
It is also designed with the needs of Prettier and ESLint in mind.