74 lines
No EOL
3.4 KiB
JavaScript
74 lines
No EOL
3.4 KiB
JavaScript
"use strict";
|
|
var __extends = (this && this.__extends) || (function () {
|
|
var extendStatics = function (d, b) {
|
|
extendStatics = Object.setPrototypeOf ||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
return extendStatics(d, b);
|
|
};
|
|
return function (d, b) {
|
|
if (typeof b !== "function" && b !== null)
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
extendStatics(d, b);
|
|
function __() { this.constructor = d; }
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
};
|
|
})();
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.buildInProdFollowPrefix = exports.buildBetweenProdsFollowPrefix = exports.computeAllProdsFollows = exports.ResyncFollowsWalker = void 0;
|
|
var rest_1 = require("./rest");
|
|
var first_1 = require("./first");
|
|
var forEach_1 = __importDefault(require("lodash/forEach"));
|
|
var assign_1 = __importDefault(require("lodash/assign"));
|
|
var constants_1 = require("../constants");
|
|
var gast_1 = require("@chevrotain/gast");
|
|
// This ResyncFollowsWalker computes all of the follows required for RESYNC
|
|
// (skipping reference production).
|
|
var ResyncFollowsWalker = /** @class */ (function (_super) {
|
|
__extends(ResyncFollowsWalker, _super);
|
|
function ResyncFollowsWalker(topProd) {
|
|
var _this = _super.call(this) || this;
|
|
_this.topProd = topProd;
|
|
_this.follows = {};
|
|
return _this;
|
|
}
|
|
ResyncFollowsWalker.prototype.startWalking = function () {
|
|
this.walk(this.topProd);
|
|
return this.follows;
|
|
};
|
|
ResyncFollowsWalker.prototype.walkTerminal = function (terminal, currRest, prevRest) {
|
|
// do nothing! just like in the public sector after 13:00
|
|
};
|
|
ResyncFollowsWalker.prototype.walkProdRef = function (refProd, currRest, prevRest) {
|
|
var followName = buildBetweenProdsFollowPrefix(refProd.referencedRule, refProd.idx) +
|
|
this.topProd.name;
|
|
var fullRest = currRest.concat(prevRest);
|
|
var restProd = new gast_1.Alternative({ definition: fullRest });
|
|
var t_in_topProd_follows = (0, first_1.first)(restProd);
|
|
this.follows[followName] = t_in_topProd_follows;
|
|
};
|
|
return ResyncFollowsWalker;
|
|
}(rest_1.RestWalker));
|
|
exports.ResyncFollowsWalker = ResyncFollowsWalker;
|
|
function computeAllProdsFollows(topProductions) {
|
|
var reSyncFollows = {};
|
|
(0, forEach_1.default)(topProductions, function (topProd) {
|
|
var currRefsFollow = new ResyncFollowsWalker(topProd).startWalking();
|
|
(0, assign_1.default)(reSyncFollows, currRefsFollow);
|
|
});
|
|
return reSyncFollows;
|
|
}
|
|
exports.computeAllProdsFollows = computeAllProdsFollows;
|
|
function buildBetweenProdsFollowPrefix(inner, occurenceInParent) {
|
|
return inner.name + occurenceInParent + constants_1.IN;
|
|
}
|
|
exports.buildBetweenProdsFollowPrefix = buildBetweenProdsFollowPrefix;
|
|
function buildInProdFollowPrefix(terminal) {
|
|
var terminalName = terminal.terminalType.name;
|
|
return terminalName + terminal.idx + constants_1.IN;
|
|
}
|
|
exports.buildInProdFollowPrefix = buildInProdFollowPrefix;
|
|
//# sourceMappingURL=follow.js.map
|