UNPKG

chevrotain

Version:

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

82 lines 3.69 kB
import { EarlyExitException, isRecognitionException, NoViableAltException } from "../../exceptions_public"; import { cloneArr, has } from "../../../utils/utils"; import { getLookaheadPathsForOptionalProd, getLookaheadPathsForOr } from "../../grammar/lookahead"; import { DEFAULT_PARSER_CONFIG } from "../parser"; /** * Trait responsible for runtime parsing errors. */ var ErrorHandler = /** @class */ (function () { function ErrorHandler() { } ErrorHandler.prototype.initErrorHandler = function (config) { this._errors = []; this.errorMessageProvider = has(config, "errorMessageProvider") ? config.errorMessageProvider : DEFAULT_PARSER_CONFIG.errorMessageProvider; }; ErrorHandler.prototype.SAVE_ERROR = function (error) { if (isRecognitionException(error)) { error.context = { ruleStack: this.getHumanReadableRuleStack(), ruleOccurrenceStack: cloneArr(this.RULE_OCCURRENCE_STACK) }; this._errors.push(error); return error; } else { throw Error("Trying to save an Error which is not a RecognitionException"); } }; Object.defineProperty(ErrorHandler.prototype, "errors", { get: function () { return cloneArr(this._errors); }, set: function (newErrors) { this._errors = newErrors; }, enumerable: false, configurable: true }); // TODO: consider caching the error message computed information ErrorHandler.prototype.raiseEarlyExitException = function (occurrence, prodType, userDefinedErrMsg) { var ruleName = this.getCurrRuleFullName(); var ruleGrammar = this.getGAstProductions()[ruleName]; var lookAheadPathsPerAlternative = getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodType, this.maxLookahead); var insideProdPaths = lookAheadPathsPerAlternative[0]; var actualTokens = []; for (var i = 1; i <= this.maxLookahead; i++) { actualTokens.push(this.LA(i)); } var msg = this.errorMessageProvider.buildEarlyExitMessage({ expectedIterationPaths: insideProdPaths, actual: actualTokens, previous: this.LA(0), customUserDescription: userDefinedErrMsg, ruleName: ruleName }); throw this.SAVE_ERROR(new EarlyExitException(msg, this.LA(1), this.LA(0))); }; // TODO: consider caching the error message computed information ErrorHandler.prototype.raiseNoAltException = function (occurrence, errMsgTypes) { var ruleName = this.getCurrRuleFullName(); var ruleGrammar = this.getGAstProductions()[ruleName]; // TODO: getLookaheadPathsForOr can be slow for large enough maxLookahead and certain grammars, consider caching ? var lookAheadPathsPerAlternative = getLookaheadPathsForOr(occurrence, ruleGrammar, this.maxLookahead); var actualTokens = []; for (var i = 1; i <= this.maxLookahead; i++) { actualTokens.push(this.LA(i)); } var previousToken = this.LA(0); var errMsg = this.errorMessageProvider.buildNoViableAltMessage({ expectedPathsPerAlt: lookAheadPathsPerAlternative, actual: actualTokens, previous: previousToken, customUserDescription: errMsgTypes, ruleName: this.getCurrRuleFullName() }); throw this.SAVE_ERROR(new NoViableAltException(errMsg, this.LA(1), previousToken)); }; return ErrorHandler; }()); export { ErrorHandler }; //# sourceMappingURL=error_handler.js.map