chevrotain
Version:
Chevrotain is a high performance fault tolerant javascript parsing DSL for building recursive decent parsers
258 lines • 10.1 kB
JavaScript
;
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 gast_public_1 = require("./gast_public");
var gast_visitor_public_1 = require("./gast_visitor_public");
var tokens_public_1 = require("../../../scan/tokens_public");
function isSequenceProd(prod) {
return (prod instanceof gast_public_1.Flat ||
prod instanceof gast_public_1.Option ||
prod instanceof gast_public_1.Repetition ||
prod instanceof gast_public_1.RepetitionMandatory ||
prod instanceof gast_public_1.RepetitionMandatoryWithSeparator ||
prod instanceof gast_public_1.RepetitionWithSeparator ||
prod instanceof gast_public_1.Terminal ||
prod instanceof gast_public_1.Rule);
}
exports.isSequenceProd = isSequenceProd;
function isOptionalProd(prod, alreadyVisited) {
if (alreadyVisited === void 0) { alreadyVisited = []; }
var isDirectlyOptional = prod instanceof gast_public_1.Option ||
prod instanceof gast_public_1.Repetition ||
prod instanceof gast_public_1.RepetitionWithSeparator;
if (isDirectlyOptional) {
return true;
}
// note that this can cause infinite loop if one optional empty TOP production has a cyclic dependency with another
// empty optional top rule
// may be indirectly optional ((A?B?C?) | (D?E?F?))
if (prod instanceof gast_public_1.Alternation) {
// for OR its enough for just one of the alternatives to be optional
return utils_1.some(prod.definition, function (subProd) {
return isOptionalProd(subProd, alreadyVisited);
});
}
else if (prod instanceof gast_public_1.NonTerminal && utils_1.contains(alreadyVisited, prod)) {
// avoiding stack overflow due to infinite recursion
return false;
}
else if (prod instanceof gast_public_1.AbstractProduction) {
if (prod instanceof gast_public_1.NonTerminal) {
alreadyVisited.push(prod);
}
return utils_1.every(prod.definition, function (subProd) {
return isOptionalProd(subProd, alreadyVisited);
});
}
else {
return false;
}
}
exports.isOptionalProd = isOptionalProd;
function isBranchingProd(prod) {
return prod instanceof gast_public_1.Alternation;
}
exports.isBranchingProd = isBranchingProd;
function getProductionDslName(prod) {
if (prod instanceof gast_public_1.NonTerminal) {
return "SUBRULE";
}
else if (prod instanceof gast_public_1.Option) {
return "OPTION";
}
else if (prod instanceof gast_public_1.Alternation) {
return "OR";
}
else if (prod instanceof gast_public_1.RepetitionMandatory) {
return "AT_LEAST_ONE";
}
else if (prod instanceof gast_public_1.RepetitionMandatoryWithSeparator) {
return "AT_LEAST_ONE_SEP";
}
else if (prod instanceof gast_public_1.RepetitionWithSeparator) {
return "MANY_SEP";
}
else if (prod instanceof gast_public_1.Repetition) {
return "MANY";
}
else if (prod instanceof gast_public_1.Terminal) {
return "CONSUME";
}
else {
/* istanbul ignore next */
throw Error("non exhaustive match");
}
}
exports.getProductionDslName = getProductionDslName;
var GastCloneVisitor = /** @class */ (function (_super) {
__extends(GastCloneVisitor, _super);
function GastCloneVisitor() {
return _super !== null && _super.apply(this, arguments) || this;
}
GastCloneVisitor.prototype.visitNonTerminal = function (node) {
return new gast_public_1.NonTerminal({
nonTerminalName: node.nonTerminalName,
idx: node.idx
});
};
GastCloneVisitor.prototype.visitFlat = function (node) {
var _this = this;
var definition = utils_1.map(node.definition, function (currSubDef) {
return _this.visit(currSubDef);
});
return new gast_public_1.Flat({ definition: definition, name: node.name });
};
GastCloneVisitor.prototype.visitOption = function (node) {
var _this = this;
var definition = utils_1.map(node.definition, function (currSubDef) {
return _this.visit(currSubDef);
});
return new gast_public_1.Option({
definition: definition,
idx: node.idx,
name: node.name
});
};
GastCloneVisitor.prototype.visitRepetition = function (node) {
var _this = this;
var definition = utils_1.map(node.definition, function (currSubDef) {
return _this.visit(currSubDef);
});
return new gast_public_1.Repetition({
definition: definition,
idx: node.idx,
name: node.name
});
};
GastCloneVisitor.prototype.visitRepetitionMandatory = function (node) {
var _this = this;
var definition = utils_1.map(node.definition, function (currSubDef) {
return _this.visit(currSubDef);
});
return new gast_public_1.RepetitionMandatory({
definition: definition,
idx: node.idx,
name: node.name
});
};
GastCloneVisitor.prototype.visitRepetitionMandatoryWithSeparator = function (node) {
var _this = this;
var definition = utils_1.map(node.definition, function (currSubDef) {
return _this.visit(currSubDef);
});
return new gast_public_1.RepetitionMandatoryWithSeparator({
definition: definition,
separator: node.separator,
idx: node.idx,
name: node.name
});
};
GastCloneVisitor.prototype.visitRepetitionWithSeparator = function (node) {
var _this = this;
var definition = utils_1.map(node.definition, function (currSubDef) {
return _this.visit(currSubDef);
});
return new gast_public_1.RepetitionWithSeparator({
definition: definition,
separator: node.separator,
idx: node.idx,
name: node.name
});
};
GastCloneVisitor.prototype.visitAlternation = function (node) {
var _this = this;
var definition = utils_1.map(node.definition, function (currSubDef) {
return _this.visit(currSubDef);
});
return new gast_public_1.Alternation({
definition: definition,
idx: node.idx,
name: node.name
});
};
GastCloneVisitor.prototype.visitTerminal = function (node) {
return new gast_public_1.Terminal({
terminalType: node.terminalType,
idx: node.idx
});
};
GastCloneVisitor.prototype.visitRule = function (node) {
var _this = this;
var definition = utils_1.map(node.definition, function (currSubDef) {
return _this.visit(currSubDef);
});
return new gast_public_1.Rule({
name: node.name,
definition: definition,
orgText: node.orgText
});
};
return GastCloneVisitor;
}(gast_visitor_public_1.GAstVisitor));
function cloneProduction(prod) {
var cloningVisitor = new GastCloneVisitor();
return cloningVisitor.visit(prod);
}
exports.cloneProduction = cloneProduction;
var DslMethodsCollectorVisitor = /** @class */ (function (_super) {
__extends(DslMethodsCollectorVisitor, _super);
function DslMethodsCollectorVisitor() {
var _this = _super !== null && _super.apply(this, arguments) || this;
// A minus is never valid in an identifier name
_this.separator = "-";
_this.dslMethods = {
option: [],
alternation: [],
repetition: [],
repetitionWithSeparator: [],
repetitionMandatory: [],
repetitionMandatoryWithSeparator: []
};
return _this;
}
DslMethodsCollectorVisitor.prototype.visitTerminal = function (terminal) {
var key = tokens_public_1.tokenName(terminal.terminalType) + this.separator + "Terminal";
if (!utils_1.has(this.dslMethods, key)) {
this.dslMethods[key] = [];
}
this.dslMethods[key].push(terminal);
};
DslMethodsCollectorVisitor.prototype.visitNonTerminal = function (subrule) {
var key = subrule.nonTerminalName + this.separator + "Terminal";
if (!utils_1.has(this.dslMethods, key)) {
this.dslMethods[key] = [];
}
this.dslMethods[key].push(subrule);
};
DslMethodsCollectorVisitor.prototype.visitOption = function (option) {
this.dslMethods.option.push(option);
};
DslMethodsCollectorVisitor.prototype.visitRepetitionWithSeparator = function (manySep) {
this.dslMethods.repetitionWithSeparator.push(manySep);
};
DslMethodsCollectorVisitor.prototype.visitRepetitionMandatory = function (atLeastOne) {
this.dslMethods.repetitionMandatory.push(atLeastOne);
};
DslMethodsCollectorVisitor.prototype.visitRepetitionMandatoryWithSeparator = function (atLeastOneSep) {
this.dslMethods.repetitionMandatoryWithSeparator.push(atLeastOneSep);
};
DslMethodsCollectorVisitor.prototype.visitRepetition = function (many) {
this.dslMethods.repetition.push(many);
};
DslMethodsCollectorVisitor.prototype.visitAlternation = function (or) {
this.dslMethods.alternation.push(or);
};
return DslMethodsCollectorVisitor;
}(gast_visitor_public_1.GAstVisitor));
exports.DslMethodsCollectorVisitor = DslMethodsCollectorVisitor;
//# sourceMappingURL=gast.js.map