"use strict"; /** @fileOverview Implements `class page.BNF.NT`. * @author Axel T. Schreiner <ats@cs.rit.edu> * @version 1.5.0 */ /** Creates a new non-terminal representation for BNF. * @class Represents a (unique!) non-terminal for BNF. * @private * * @param {string} _name non-terminal's name. * @param {number} _index non-terminal's index in {@link page.BNF}`.nts`. * * @property {string} name non-terminal's name. * @property {number} index non-terminal's index in {@link page.BNF}`.nts`; * transient, maintained by {@link page.BNF#nt}. * @property {number} ord non-terminal's global index; * transient, set in {@link page.BNF#init}. * @property {page.BNF.Rule[]} rules defining `this`; * transient, maintained when a rule is constructed. * @property {boolean} empty true if no input can be accepted. * @property {boolean} reached true if this can be reached * from rule zero, transient. * @property {boolean} finite true if there is a non-recursive expansion, * transient. * @property {Map} first terminals at front, maps ord to {@link page.BNF.T}. * @property {Map} follow terminals following, maps ord to {@link page.BNF.T}. */ page.BNF.NT = function (_name, _index) { this.name = _name; this.index = _index; this.ord = undefined; this.rules = []; this.empty = false; this.reached = false; this.finite = false; this.first = {}; this.follow = {}; }; page.baseclass(page.BNF.NT, 'page.BNF.NT'); /** Displays name. * @returns {string} */ page.BNF.NT.prototype.toString = function () { return this.name; }; /** Displays index or ord and name and contents of all sets. * @returns {string} */ page.BNF.NT.prototype.dump = function () { var result = (' ' + (this.ord ? this.ord : this.index)).substr(-2) + ': ' + this.toString(); if (this.empty) result += '\n\tempty: true'; for (var set in { first:0, follow:0 }) { var r = ''; for (var ord in this[set]) r += ' ' + this[set][ord]; if (r.length) result += '\n\t' + set + ':' + r; } return result; };