@bablr/language-en-esnext
Version:
A BABLR language tracking the most current approved EcmaScript specification
98 lines • 3.55 kB
JavaScript
/* @macrome
* @generatedby @bablr/macrome-generator-bablr
* @generatedfrom ./es2020.macro.js#fb3e777fcd923bee4d14c1e1a2bc7ba2cb03c659
* This file is autogenerated. Please do not edit it directly.
* When editing run `npx macrome watch` then change the file this is generated from.
*/
import _applyDecs from "@babel/runtime/helpers/applyDecs2305";
var _es2019$atrivialGramm;
let _initProto, _MemberExpressionDecs;
import { re, spam as m } from '@bablr/boot';
import { CoveredBy, Node, UndefinedAttributes } from '@bablr/helpers/decorators';
import { o, defineAttribute, eat, eatMatch, match, fail } from '@bablr/helpers/grammar';
import { triviaEnhancer } from '@bablr/helpers/trivia';
import * as Comment from '@bablr/language-en-c-comments';
import * as es2019 from './es2019.js';
export const dependencies = {
Comment
};
export { powerLevels, reservedWords, assignmentOperators, assignmentOperatorAlternatives, unaryPrefixOperators, unaryPrefixOperatorAlternatives, unaryPostfixOperators, unaryPostfixOperatorAlternatives, getBinaryOperatorAlternatives } from './es2019.js';
export const canonicalURL = 'https://bablr.org/languages/universe/es6';
export const atrivialGrammar = class ES2020Grammar extends (_es2019$atrivialGramm = es2019.atrivialGrammar) {
static {
[_initProto] = _applyDecs(this, [[_MemberExpressionDecs, 2, "MemberExpression"]], [], 0, void 0, _es2019$atrivialGramm).e;
}
constructor(...args) {
super(...args);
_initProto(this);
}
*[(_MemberExpressionDecs = [UndefinedAttributes(['power']), CoveredBy('Expression'), CoveredBy('LogicExpression'), Node], "LogicExpression")](args) {
let {
props: {
power = 34
}
} = args;
let res;
if (power >= 2) {
res = yield eatMatch(m`<MemberExpression /\g\?\./ />`, o({
power
}));
if (!res) {
yield* super.LogicExpression(args);
}
} else {
yield* super.LogicExpression(args);
}
}
*MemberExpression({
ctx
}) {
yield eat(m`object+$: <__Expression />`, o({
power: 2
}));
yield defineAttribute('power', 2);
let sigil = yield match(re`/\?\.|[[.]/`);
switch (ctx.sourceTextFor(sigil)) {
case '?.':
{
yield eat(m`dotToken: <*Punctuator '?.' />`);
if (yield eatMatch(m`openToken: <*Punctuator '[' { balanced: ']' } />`, o({}), o({
bind: true
}))) {
yield eat(m`property+$: <__Expression />`);
yield eat(m`closeToken: <*Punctuator ']' { balancer: true } />`);
} else {
yield eat(m`property+$: <__Expression />`, o({
power: 2
}));
yield eat(m`closeToken: null`);
}
break;
}
case '.':
{
yield eat(m`dotToken: <*Punctuator '.' />`);
yield eat(m`openToken: null`);
yield eat(m`property+$: <Identifier />`, o({
scoped: false
}));
yield eat(m`closeToken: null`);
break;
}
case '[':
{
yield eat(m`dotToken: null`);
yield eat(m`openToken: <*Punctuator '[' { balanced: ']' } />`);
yield eat(m`property+$: <__Expression />`);
yield eat(m`closeToken: <*Punctuator ']' { balancer: true } />`);
break;
}
default:
yield fail();
}
}
};
export const grammar = triviaEnhancer({
triviaIsAllowed: s => s.span === 'Bare',
triviaMatcher: m`#: :Comment: <_Trivia /[ \n\r\t]|\/\/|\/\*/ />`
}, atrivialGrammar);