Skip to main content
Module

x/ohm_js/src/pexprs-assertChoicesHaveUniformArity.js

A library and language for building parsers, interpreters, compilers, etc.
Go to Latest
File
'use strict';
// --------------------------------------------------------------------// Imports// --------------------------------------------------------------------
const common = require('./common');const errors = require('./errors');const pexprs = require('./pexprs-main');
// --------------------------------------------------------------------// Operations// --------------------------------------------------------------------
pexprs.PExpr.prototype.assertChoicesHaveUniformArity = common.abstract( 'assertChoicesHaveUniformArity');
pexprs.any.assertChoicesHaveUniformArity = pexprs.end.assertChoicesHaveUniformArity = pexprs.Terminal.prototype.assertChoicesHaveUniformArity = pexprs.Range.prototype.assertChoicesHaveUniformArity = pexprs.Param.prototype.assertChoicesHaveUniformArity = pexprs.Lex.prototype.assertChoicesHaveUniformArity = pexprs.UnicodeChar.prototype.assertChoicesHaveUniformArity = function(ruleName) { // no-op };
pexprs.Alt.prototype.assertChoicesHaveUniformArity = function(ruleName) { if (this.terms.length === 0) { return; } const arity = this.terms[0].getArity(); for (let idx = 0; idx < this.terms.length; idx++) { const term = this.terms[idx]; term.assertChoicesHaveUniformArity(); const otherArity = term.getArity(); if (arity !== otherArity) { throw errors.inconsistentArity(ruleName, arity, otherArity, term); } }};
pexprs.Extend.prototype.assertChoicesHaveUniformArity = function(ruleName) { // Extend is a special case of Alt that's guaranteed to have exactly two // cases: [extensions, origBody]. const actualArity = this.terms[0].getArity(); const expectedArity = this.terms[1].getArity(); if (actualArity !== expectedArity) { throw errors.inconsistentArity(ruleName, expectedArity, actualArity, this.terms[0]); }};
pexprs.Seq.prototype.assertChoicesHaveUniformArity = function(ruleName) { for (let idx = 0; idx < this.factors.length; idx++) { this.factors[idx].assertChoicesHaveUniformArity(ruleName); }};
pexprs.Iter.prototype.assertChoicesHaveUniformArity = function(ruleName) { this.expr.assertChoicesHaveUniformArity(ruleName);};
pexprs.Not.prototype.assertChoicesHaveUniformArity = function(ruleName) { // no-op (not required b/c the nested expr doesn't show up in the CST)};
pexprs.Lookahead.prototype.assertChoicesHaveUniformArity = function(ruleName) { this.expr.assertChoicesHaveUniformArity(ruleName);};
pexprs.Apply.prototype.assertChoicesHaveUniformArity = function(ruleName) { // The arities of the parameter expressions is required to be 1 by // `assertAllApplicationsAreValid()`.};