UNPKG

chevrotain

Version:

Chevrotain is a high performance fault tolerant javascript parsing DSL for building recursive decent parsers

243 lines 8.27 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); var utils_1 = require("../../../utils/utils"); var tokens_public_1 = require("../../../scan/tokens_public"); var AbstractProduction = /** @class */ (function () { function AbstractProduction(definition) { this.definition = definition; } AbstractProduction.prototype.accept = function (visitor) { visitor.visit(this); utils_1.forEach(this.definition, function (prod) { prod.accept(visitor); }); }; return AbstractProduction; }()); exports.AbstractProduction = AbstractProduction; var NonTerminal = /** @class */ (function (_super) { __extends(NonTerminal, _super); function NonTerminal(options) { var _this = _super.call(this, []) || this; _this.idx = 1; utils_1.assign(_this, options); return _this; } Object.defineProperty(NonTerminal.prototype, "definition", { get: function () { if (this.referencedRule !== undefined) { return this.referencedRule.definition; } return []; }, set: function (definition) { // immutable }, enumerable: true, configurable: true }); NonTerminal.prototype.accept = function (visitor) { visitor.visit(this); // don't visit children of a reference, we will get cyclic infinite loops if we do so }; return NonTerminal; }(AbstractProduction)); exports.NonTerminal = NonTerminal; var Rule = /** @class */ (function (_super) { __extends(Rule, _super); function Rule(options) { var _this = _super.call(this, options.definition) || this; _this.orgText = ""; utils_1.assign(_this, options); return _this; } return Rule; }(AbstractProduction)); exports.Rule = Rule; var Flat = /** @class */ (function (_super) { __extends(Flat, _super); // A named Flat production is used to indicate a Nested Rule in an alternation function Flat(options) { var _this = _super.call(this, options.definition) || this; utils_1.assign(_this, options); return _this; } return Flat; }(AbstractProduction)); exports.Flat = Flat; var Option = /** @class */ (function (_super) { __extends(Option, _super); function Option(options) { var _this = _super.call(this, options.definition) || this; _this.idx = 1; utils_1.assign(_this, options); return _this; } return Option; }(AbstractProduction)); exports.Option = Option; var RepetitionMandatory = /** @class */ (function (_super) { __extends(RepetitionMandatory, _super); function RepetitionMandatory(options) { var _this = _super.call(this, options.definition) || this; _this.idx = 1; utils_1.assign(_this, options); return _this; } return RepetitionMandatory; }(AbstractProduction)); exports.RepetitionMandatory = RepetitionMandatory; var RepetitionMandatoryWithSeparator = /** @class */ (function (_super) { __extends(RepetitionMandatoryWithSeparator, _super); function RepetitionMandatoryWithSeparator(options) { var _this = _super.call(this, options.definition) || this; _this.idx = 1; utils_1.assign(_this, options); return _this; } return RepetitionMandatoryWithSeparator; }(AbstractProduction)); exports.RepetitionMandatoryWithSeparator = RepetitionMandatoryWithSeparator; var Repetition = /** @class */ (function (_super) { __extends(Repetition, _super); function Repetition(options) { var _this = _super.call(this, options.definition) || this; _this.idx = 1; utils_1.assign(_this, options); return _this; } return Repetition; }(AbstractProduction)); exports.Repetition = Repetition; var RepetitionWithSeparator = /** @class */ (function (_super) { __extends(RepetitionWithSeparator, _super); function RepetitionWithSeparator(options) { var _this = _super.call(this, options.definition) || this; _this.idx = 1; utils_1.assign(_this, options); return _this; } return RepetitionWithSeparator; }(AbstractProduction)); exports.RepetitionWithSeparator = RepetitionWithSeparator; var Alternation = /** @class */ (function (_super) { __extends(Alternation, _super); function Alternation(options) { var _this = _super.call(this, options.definition) || this; _this.idx = 1; utils_1.assign(_this, options); return _this; } return Alternation; }(AbstractProduction)); exports.Alternation = Alternation; var Terminal = /** @class */ (function () { function Terminal(options) { this.idx = 1; utils_1.assign(this, options); } Terminal.prototype.accept = function (visitor) { visitor.visit(this); }; return Terminal; }()); exports.Terminal = Terminal; function serializeGrammar(topRules) { return utils_1.map(topRules, serializeProduction); } exports.serializeGrammar = serializeGrammar; function serializeProduction(node) { function convertDefinition(definition) { return utils_1.map(definition, serializeProduction); } if (node instanceof NonTerminal) { return { type: "NonTerminal", name: node.nonTerminalName, idx: node.idx }; } else if (node instanceof Flat) { return { type: "Flat", definition: convertDefinition(node.definition) }; } else if (node instanceof Option) { return { type: "Option", definition: convertDefinition(node.definition) }; } else if (node instanceof RepetitionMandatory) { return { type: "RepetitionMandatory", definition: convertDefinition(node.definition) }; } else if (node instanceof RepetitionMandatoryWithSeparator) { return { type: "RepetitionMandatoryWithSeparator", separator: serializeProduction(new Terminal({ terminalType: node.separator })), definition: convertDefinition(node.definition) }; } else if (node instanceof RepetitionWithSeparator) { return { type: "RepetitionWithSeparator", separator: serializeProduction(new Terminal({ terminalType: node.separator })), definition: convertDefinition(node.definition) }; } else if (node instanceof Repetition) { return { type: "Repetition", definition: convertDefinition(node.definition) }; } else if (node instanceof Alternation) { return { type: "Alternation", definition: convertDefinition(node.definition) }; } else if (node instanceof Terminal) { var serializedTerminal = { type: "Terminal", name: tokens_public_1.tokenName(node.terminalType), label: tokens_public_1.tokenLabel(node.terminalType), idx: node.idx }; var pattern = node.terminalType.PATTERN; if (node.terminalType.PATTERN) { serializedTerminal.pattern = utils_1.isRegExp(pattern) ? pattern.source : pattern; } return serializedTerminal; } else if (node instanceof Rule) { // IGNORE ABOVE ELSE return { type: "Rule", name: node.name, definition: convertDefinition(node.definition) }; } else { /* istanbul ignore next */ throw Error("non exhaustive match"); } } exports.serializeProduction = serializeProduction; //# sourceMappingURL=gast_public.js.map