Skip to content

Latest commit

 

History

History
55 lines (42 loc) · 1.65 KB

README.md

File metadata and controls

55 lines (42 loc) · 1.65 KB

bablr

come chat on Discord

This is the primary API package for BABLR. Use it in combination with a BABLR language definition to perform parsing.

Usage

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' />
//   </>
// </>

Prior Art

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.