UNPKG

chevrotain

Version:

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

186 lines 10.3 kB
import { hasTokenLabel, tokenLabel } from "../scan/tokens_public"; import * as utils from "../utils/utils"; import { first, map, reduce } from "../utils/utils"; import { NonTerminal, Rule, Terminal } from "./grammar/gast/gast_public"; import { getProductionDslName } from "./grammar/gast/gast"; export var defaultParserErrorProvider = { buildMismatchTokenMessage: function (_a) { var expected = _a.expected, actual = _a.actual, previous = _a.previous, ruleName = _a.ruleName; var hasLabel = hasTokenLabel(expected); var expectedMsg = hasLabel ? "--> " + tokenLabel(expected) + " <--" : "token of type --> " + expected.name + " <--"; var msg = "Expecting " + expectedMsg + " but found --> '" + actual.image + "' <--"; return msg; }, buildNotAllInputParsedMessage: function (_a) { var firstRedundant = _a.firstRedundant, ruleName = _a.ruleName; return "Redundant input, expecting EOF but found: " + firstRedundant.image; }, buildNoViableAltMessage: function (_a) { var expectedPathsPerAlt = _a.expectedPathsPerAlt, actual = _a.actual, previous = _a.previous, customUserDescription = _a.customUserDescription, ruleName = _a.ruleName; var errPrefix = "Expecting: "; // TODO: issue: No Viable Alternative Error may have incomplete details. #502 var actualText = first(actual).image; var errSuffix = "\nbut found: '" + actualText + "'"; if (customUserDescription) { return errPrefix + customUserDescription + errSuffix; } else { var allLookAheadPaths = reduce(expectedPathsPerAlt, function (result, currAltPaths) { return result.concat(currAltPaths); }, []); var nextValidTokenSequences = map(allLookAheadPaths, function (currPath) { return "[" + map(currPath, function (currTokenType) { return tokenLabel(currTokenType); }).join(", ") + "]"; }); var nextValidSequenceItems = map(nextValidTokenSequences, function (itemMsg, idx) { return " " + (idx + 1) + ". " + itemMsg; }); var calculatedDescription = "one of these possible Token sequences:\n" + nextValidSequenceItems.join("\n"); return errPrefix + calculatedDescription + errSuffix; } }, buildEarlyExitMessage: function (_a) { var expectedIterationPaths = _a.expectedIterationPaths, actual = _a.actual, customUserDescription = _a.customUserDescription, ruleName = _a.ruleName; var errPrefix = "Expecting: "; // TODO: issue: No Viable Alternative Error may have incomplete details. #502 var actualText = first(actual).image; var errSuffix = "\nbut found: '" + actualText + "'"; if (customUserDescription) { return errPrefix + customUserDescription + errSuffix; } else { var nextValidTokenSequences = map(expectedIterationPaths, function (currPath) { return "[" + map(currPath, function (currTokenType) { return tokenLabel(currTokenType); }).join(",") + "]"; }); var calculatedDescription = "expecting at least one iteration which starts with one of these possible Token sequences::\n " + ("<" + nextValidTokenSequences.join(" ,") + ">"); return errPrefix + calculatedDescription + errSuffix; } } }; Object.freeze(defaultParserErrorProvider); export var defaultGrammarResolverErrorProvider = { buildRuleNotFoundError: function (topLevelRule, undefinedRule) { var msg = "Invalid grammar, reference to a rule which is not defined: ->" + undefinedRule.nonTerminalName + "<-\n" + "inside top level rule: ->" + topLevelRule.name + "<-"; return msg; } }; export var defaultGrammarValidatorErrorProvider = { buildDuplicateFoundError: function (topLevelRule, duplicateProds) { function getExtraProductionArgument(prod) { if (prod instanceof Terminal) { return prod.terminalType.name; } else if (prod instanceof NonTerminal) { return prod.nonTerminalName; } else { return ""; } } var topLevelName = topLevelRule.name; var duplicateProd = first(duplicateProds); var index = duplicateProd.idx; var dslName = getProductionDslName(duplicateProd); var extraArgument = getExtraProductionArgument(duplicateProd); var hasExplicitIndex = index > 0; var msg = "->" + dslName + (hasExplicitIndex ? index : "") + "<- " + (extraArgument ? "with argument: ->" + extraArgument + "<-" : "") + "\n appears more than once (" + duplicateProds.length + " times) in the top level rule: ->" + topLevelName + "<-. \n For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES \n "; // white space trimming time! better to trim afterwards as it allows to use WELL formatted multi line template strings... msg = msg.replace(/[ \t]+/g, " "); msg = msg.replace(/\s\s+/g, "\n"); return msg; }, buildNamespaceConflictError: function (rule) { var errMsg = "Namespace conflict found in grammar.\n" + ("The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <" + rule.name + ">.\n") + "To resolve this make sure each Terminal and Non-Terminal names are unique\n" + "This is easy to accomplish by using the convention that Terminal names start with an uppercase letter\n" + "and Non-Terminal names start with a lower case letter."; return errMsg; }, buildAlternationPrefixAmbiguityError: function (options) { var pathMsg = map(options.prefixPath, function (currTok) { return tokenLabel(currTok); }).join(", "); var occurrence = options.alternation.idx === 0 ? "" : options.alternation.idx; var errMsg = "Ambiguous alternatives: <" + options.ambiguityIndices.join(" ,") + "> due to common lookahead prefix\n" + ("in <OR" + occurrence + "> inside <" + options.topLevelRule.name + "> Rule,\n") + ("<" + pathMsg + "> may appears as a prefix path in all these alternatives.\n") + "See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX\n" + "For Further details."; return errMsg; }, buildAlternationAmbiguityError: function (options) { var pathMsg = map(options.prefixPath, function (currtok) { return tokenLabel(currtok); }).join(", "); var occurrence = options.alternation.idx === 0 ? "" : options.alternation.idx; var currMessage = "Ambiguous Alternatives Detected: <" + options.ambiguityIndices.join(" ,") + "> in <OR" + occurrence + ">" + (" inside <" + options.topLevelRule.name + "> Rule,\n") + ("<" + pathMsg + "> may appears as a prefix path in all these alternatives.\n"); currMessage = currMessage + "See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES\n" + "For Further details."; return currMessage; }, buildEmptyRepetitionError: function (options) { var dslName = getProductionDslName(options.repetition); if (options.repetition.idx !== 0) { dslName += options.repetition.idx; } var errMsg = "The repetition <" + dslName + "> within Rule <" + options.topLevelRule.name + "> can never consume any tokens.\n" + "This could lead to an infinite loop."; return errMsg; }, // TODO: remove - `errors_public` from nyc.config.js exclude // once this method is fully removed from this file buildTokenNameError: function (options) { /* istanbul ignore next */ return "deprecated"; }, buildEmptyAlternationError: function (options) { var errMsg = "Ambiguous empty alternative: <" + (options.emptyChoiceIdx + 1) + ">" + (" in <OR" + options.alternation.idx + "> inside <" + options.topLevelRule.name + "> Rule.\n") + "Only the last alternative may be an empty alternative."; return errMsg; }, buildTooManyAlternativesError: function (options) { var errMsg = "An Alternation cannot have more than 256 alternatives:\n" + ("<OR" + options.alternation.idx + "> inside <" + options.topLevelRule.name + "> Rule.\n has " + (options.alternation.definition.length + 1) + " alternatives."); return errMsg; }, buildLeftRecursionError: function (options) { var ruleName = options.topLevelRule.name; var pathNames = utils.map(options.leftRecursionPath, function (currRule) { return currRule.name; }); var leftRecursivePath = ruleName + " --> " + pathNames .concat([ruleName]) .join(" --> "); var errMsg = "Left Recursion found in grammar.\n" + ("rule: <" + ruleName + "> can be invoked from itself (directly or indirectly)\n") + ("without consuming any Tokens. The grammar path that causes this is: \n " + leftRecursivePath + "\n") + " To fix this refactor your grammar to remove the left recursion.\n" + "see: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring."; return errMsg; }, // TODO: remove - `errors_public` from nyc.config.js exclude // once this method is fully removed from this file buildInvalidRuleNameError: function (options) { /* istanbul ignore next */ return "deprecated"; }, buildDuplicateRuleNameError: function (options) { var ruleName; if (options.topLevelRule instanceof Rule) { ruleName = options.topLevelRule.name; } else { ruleName = options.topLevelRule; } var errMsg = "Duplicate definition, rule: ->" + ruleName + "<- is already defined in the grammar: ->" + options.grammarName + "<-"; return errMsg; } }; //# sourceMappingURL=errors_public.js.map