"use strict";
/** @fileOverview Implements `class page.BNF.Rule`.
* @author Axel T. Schreiner <ats@cs.rit.edu>
* @version 1.5.0
*/
/** Creates a new BNF rule.
* @class Represents a BNF rule.
* @private
*
* @param {page.BNF.NT} _nt left-hand side, non-terminal.
* @param {Node[]} _symbols right-hand side.
*
* @property {page.BNF.NT} nt rule's non-terminal (left-hand side).
* @property {Node[]} symbols rule's right-hand side.
* @property {number} index rule's index in {@link page.BNF}`.rules`,
* set after rule zero has been added.
* @property {boolean} empty true if no input can be accepted.
* @property {boolean} reached `true` if rule can be reached,
* transient.
* @property {boolean} finite `true` if all non-terminals in the
* right-hand side have {@link page.BNF.NT}`.finite` set, transient.
* @property {Map} first terminals at front, maps ord to {@link page.BNF.T}.
*
* @see page.BNF#init
*/
page.BNF.Rule = function (_nt, _symbols) {
this.nt = _nt;
this.symbols = _symbols;
this.index = undefined;
this.empty = undefined;
this.reached = false;
this.finite = false;
this.first = {};
};
page.baseclass(page.BNF.Rule, 'page.BNF.Rule');
/** Displays a rule in BNF notation.
*
* @param {number} [_mark] precedes a symbol on the right-hand side if it is in range.
*
* @returns {string}
*/
page.BNF.Rule.prototype.toString = function (_mark) {
var result = this.nt + ': ' +
this.symbols.map(function (symbol, n) {
return (n == _mark ? '. ' : '') +symbol;
}).join(' ');
if (this.symbols.length == _mark) result += ' .';
if ('precedence' in this) result += ' %prec ' + precedence;
return result + ';';
};
/** Displays index, rule, `empty`, and content of `first`.
* @returns {string}
*/
page.BNF.Rule.prototype.dump = function () {
var result = (this.index >= 0 ? (' ' + this.index).substr(-2) + ': ' : '') + this.toString();
if (this.empty)
result += '\n\tempty: true';
var r = '';
for (var ord in this.first) r += ' ' + this.first[ord];
if (r.length) result += '\n\tfirst:' + r;
return result;
};