Skip to content

bablr-lang/bablr

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

47 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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.