UNPKG

chevrotain

Version:

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

1,286 lines (1,153 loc) 412 kB
/*! chevrotain - v7.1.2 */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define("chevrotain", [], factory); else if(typeof exports === 'object') exports["chevrotain"] = factory(); else root["chevrotain"] = factory(); })(typeof self !== 'undefined' ? self : this, function() { return /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ 844: /***/ (function(module, exports) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;;(function(root, factory) { // istanbul ignore next if (true) { // istanbul ignore next !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) } else {} })( typeof self !== "undefined" ? // istanbul ignore next self : this, function() { // references // https://hackernoon.com/the-madness-of-parsing-real-world-javascript-regexps-d9ee336df983 // https://www.ecma-international.org/ecma-262/8.0/index.html#prod-Pattern function RegExpParser() {} RegExpParser.prototype.saveState = function() { return { idx: this.idx, input: this.input, groupIdx: this.groupIdx } } RegExpParser.prototype.restoreState = function(newState) { this.idx = newState.idx this.input = newState.input this.groupIdx = newState.groupIdx } RegExpParser.prototype.pattern = function(input) { // parser state this.idx = 0 this.input = input this.groupIdx = 0 this.consumeChar("/") var value = this.disjunction() this.consumeChar("/") var flags = { type: "Flags", loc: { begin: this.idx, end: input.length }, global: false, ignoreCase: false, multiLine: false, unicode: false, sticky: false } while (this.isRegExpFlag()) { switch (this.popChar()) { case "g": addFlag(flags, "global") break case "i": addFlag(flags, "ignoreCase") break case "m": addFlag(flags, "multiLine") break case "u": addFlag(flags, "unicode") break case "y": addFlag(flags, "sticky") break } } if (this.idx !== this.input.length) { throw Error( "Redundant input: " + this.input.substring(this.idx) ) } return { type: "Pattern", flags: flags, value: value, loc: this.loc(0) } } RegExpParser.prototype.disjunction = function() { var alts = [] var begin = this.idx alts.push(this.alternative()) while (this.peekChar() === "|") { this.consumeChar("|") alts.push(this.alternative()) } return { type: "Disjunction", value: alts, loc: this.loc(begin) } } RegExpParser.prototype.alternative = function() { var terms = [] var begin = this.idx while (this.isTerm()) { terms.push(this.term()) } return { type: "Alternative", value: terms, loc: this.loc(begin) } } RegExpParser.prototype.term = function() { if (this.isAssertion()) { return this.assertion() } else { return this.atom() } } RegExpParser.prototype.assertion = function() { var begin = this.idx switch (this.popChar()) { case "^": return { type: "StartAnchor", loc: this.loc(begin) } case "$": return { type: "EndAnchor", loc: this.loc(begin) } // '\b' or '\B' case "\\": switch (this.popChar()) { case "b": return { type: "WordBoundary", loc: this.loc(begin) } case "B": return { type: "NonWordBoundary", loc: this.loc(begin) } } // istanbul ignore next throw Error("Invalid Assertion Escape") // '(?=' or '(?!' case "(": this.consumeChar("?") var type switch (this.popChar()) { case "=": type = "Lookahead" break case "!": type = "NegativeLookahead" break } ASSERT_EXISTS(type) var disjunction = this.disjunction() this.consumeChar(")") return { type: type, value: disjunction, loc: this.loc(begin) } } // istanbul ignore next ASSERT_NEVER_REACH_HERE() } RegExpParser.prototype.quantifier = function(isBacktracking) { var range var begin = this.idx switch (this.popChar()) { case "*": range = { atLeast: 0, atMost: Infinity } break case "+": range = { atLeast: 1, atMost: Infinity } break case "?": range = { atLeast: 0, atMost: 1 } break case "{": var atLeast = this.integerIncludingZero() switch (this.popChar()) { case "}": range = { atLeast: atLeast, atMost: atLeast } break case ",": var atMost if (this.isDigit()) { atMost = this.integerIncludingZero() range = { atLeast: atLeast, atMost: atMost } } else { range = { atLeast: atLeast, atMost: Infinity } } this.consumeChar("}") break } // throwing exceptions from "ASSERT_EXISTS" during backtracking // causes severe performance degradations if (isBacktracking === true && range === undefined) { return undefined } ASSERT_EXISTS(range) break } // throwing exceptions from "ASSERT_EXISTS" during backtracking // causes severe performance degradations if (isBacktracking === true && range === undefined) { return undefined } ASSERT_EXISTS(range) if (this.peekChar(0) === "?") { this.consumeChar("?") range.greedy = false } else { range.greedy = true } range.type = "Quantifier" range.loc = this.loc(begin) return range } RegExpParser.prototype.atom = function() { var atom var begin = this.idx switch (this.peekChar()) { case ".": atom = this.dotAll() break case "\\": atom = this.atomEscape() break case "[": atom = this.characterClass() break case "(": atom = this.group() break } if (atom === undefined && this.isPatternCharacter()) { atom = this.patternCharacter() } ASSERT_EXISTS(atom) atom.loc = this.loc(begin) if (this.isQuantifier()) { atom.quantifier = this.quantifier() } return atom } RegExpParser.prototype.dotAll = function() { this.consumeChar(".") return { type: "Set", complement: true, value: [cc("\n"), cc("\r"), cc("\u2028"), cc("\u2029")] } } RegExpParser.prototype.atomEscape = function() { this.consumeChar("\\") switch (this.peekChar()) { case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": return this.decimalEscapeAtom() case "d": case "D": case "s": case "S": case "w": case "W": return this.characterClassEscape() case "f": case "n": case "r": case "t": case "v": return this.controlEscapeAtom() case "c": return this.controlLetterEscapeAtom() case "0": return this.nulCharacterAtom() case "x": return this.hexEscapeSequenceAtom() case "u": return this.regExpUnicodeEscapeSequenceAtom() default: return this.identityEscapeAtom() } } RegExpParser.prototype.decimalEscapeAtom = function() { var value = this.positiveInteger() return { type: "GroupBackReference", value: value } } RegExpParser.prototype.characterClassEscape = function() { var set var complement = false switch (this.popChar()) { case "d": set = digitsCharCodes break case "D": set = digitsCharCodes complement = true break case "s": set = whitespaceCodes break case "S": set = whitespaceCodes complement = true break case "w": set = wordCharCodes break case "W": set = wordCharCodes complement = true break } ASSERT_EXISTS(set) return { type: "Set", value: set, complement: complement } } RegExpParser.prototype.controlEscapeAtom = function() { var escapeCode switch (this.popChar()) { case "f": escapeCode = cc("\f") break case "n": escapeCode = cc("\n") break case "r": escapeCode = cc("\r") break case "t": escapeCode = cc("\t") break case "v": escapeCode = cc("\v") break } ASSERT_EXISTS(escapeCode) return { type: "Character", value: escapeCode } } RegExpParser.prototype.controlLetterEscapeAtom = function() { this.consumeChar("c") var letter = this.popChar() if (/[a-zA-Z]/.test(letter) === false) { throw Error("Invalid ") } var letterCode = letter.toUpperCase().charCodeAt(0) - 64 return { type: "Character", value: letterCode } } RegExpParser.prototype.nulCharacterAtom = function() { // TODO implement '[lookahead ∉ DecimalDigit]' // TODO: for the deprecated octal escape sequence this.consumeChar("0") return { type: "Character", value: cc("\0") } } RegExpParser.prototype.hexEscapeSequenceAtom = function() { this.consumeChar("x") return this.parseHexDigits(2) } RegExpParser.prototype.regExpUnicodeEscapeSequenceAtom = function() { this.consumeChar("u") return this.parseHexDigits(4) } RegExpParser.prototype.identityEscapeAtom = function() { // TODO: implement "SourceCharacter but not UnicodeIDContinue" // // http://unicode.org/reports/tr31/#Specific_Character_Adjustments var escapedChar = this.popChar() return { type: "Character", value: cc(escapedChar) } } RegExpParser.prototype.classPatternCharacterAtom = function() { switch (this.peekChar()) { // istanbul ignore next case "\n": // istanbul ignore next case "\r": // istanbul ignore next case "\u2028": // istanbul ignore next case "\u2029": // istanbul ignore next case "\\": // istanbul ignore next case "]": throw Error("TBD") default: var nextChar = this.popChar() return { type: "Character", value: cc(nextChar) } } } RegExpParser.prototype.characterClass = function() { var set = [] var complement = false this.consumeChar("[") if (this.peekChar(0) === "^") { this.consumeChar("^") complement = true } while (this.isClassAtom()) { var from = this.classAtom() var isFromSingleChar = from.type === "Character" if (isFromSingleChar && this.isRangeDash()) { this.consumeChar("-") var to = this.classAtom() var isToSingleChar = to.type === "Character" // a range can only be used when both sides are single characters if (isToSingleChar) { if (to.value < from.value) { throw Error("Range out of order in character class") } set.push({ from: from.value, to: to.value }) } else { // literal dash insertToSet(from.value, set) set.push(cc("-")) insertToSet(to.value, set) } } else { insertToSet(from.value, set) } } this.consumeChar("]") return { type: "Set", complement: complement, value: set } } RegExpParser.prototype.classAtom = function() { switch (this.peekChar()) { // istanbul ignore next case "]": // istanbul ignore next case "\n": // istanbul ignore next case "\r": // istanbul ignore next case "\u2028": // istanbul ignore next case "\u2029": throw Error("TBD") case "\\": return this.classEscape() default: return this.classPatternCharacterAtom() } } RegExpParser.prototype.classEscape = function() { this.consumeChar("\\") switch (this.peekChar()) { // Matches a backspace. // (Not to be confused with \b word boundary outside characterClass) case "b": this.consumeChar("b") return { type: "Character", value: cc("\u0008") } case "d": case "D": case "s": case "S": case "w": case "W": return this.characterClassEscape() case "f": case "n": case "r": case "t": case "v": return this.controlEscapeAtom() case "c": return this.controlLetterEscapeAtom() case "0": return this.nulCharacterAtom() case "x": return this.hexEscapeSequenceAtom() case "u": return this.regExpUnicodeEscapeSequenceAtom() default: return this.identityEscapeAtom() } } RegExpParser.prototype.group = function() { var capturing = true this.consumeChar("(") switch (this.peekChar(0)) { case "?": this.consumeChar("?") this.consumeChar(":") capturing = false break default: this.groupIdx++ break } var value = this.disjunction() this.consumeChar(")") var groupAst = { type: "Group", capturing: capturing, value: value } if (capturing) { groupAst.idx = this.groupIdx } return groupAst } RegExpParser.prototype.positiveInteger = function() { var number = this.popChar() // istanbul ignore next - can't ever get here due to previous lookahead checks // still implementing this error checking in case this ever changes. if (decimalPatternNoZero.test(number) === false) { throw Error("Expecting a positive integer") } while (decimalPattern.test(this.peekChar(0))) { number += this.popChar() } return parseInt(number, 10) } RegExpParser.prototype.integerIncludingZero = function() { var number = this.popChar() if (decimalPattern.test(number) === false) { throw Error("Expecting an integer") } while (decimalPattern.test(this.peekChar(0))) { number += this.popChar() } return parseInt(number, 10) } RegExpParser.prototype.patternCharacter = function() { var nextChar = this.popChar() switch (nextChar) { // istanbul ignore next case "\n": // istanbul ignore next case "\r": // istanbul ignore next case "\u2028": // istanbul ignore next case "\u2029": // istanbul ignore next case "^": // istanbul ignore next case "$": // istanbul ignore next case "\\": // istanbul ignore next case ".": // istanbul ignore next case "*": // istanbul ignore next case "+": // istanbul ignore next case "?": // istanbul ignore next case "(": // istanbul ignore next case ")": // istanbul ignore next case "[": // istanbul ignore next case "|": // istanbul ignore next throw Error("TBD") default: return { type: "Character", value: cc(nextChar) } } } RegExpParser.prototype.isRegExpFlag = function() { switch (this.peekChar(0)) { case "g": case "i": case "m": case "u": case "y": return true default: return false } } RegExpParser.prototype.isRangeDash = function() { return this.peekChar() === "-" && this.isClassAtom(1) } RegExpParser.prototype.isDigit = function() { return decimalPattern.test(this.peekChar(0)) } RegExpParser.prototype.isClassAtom = function(howMuch) { if (howMuch === undefined) { howMuch = 0 } switch (this.peekChar(howMuch)) { case "]": case "\n": case "\r": case "\u2028": case "\u2029": return false default: return true } } RegExpParser.prototype.isTerm = function() { return this.isAtom() || this.isAssertion() } RegExpParser.prototype.isAtom = function() { if (this.isPatternCharacter()) { return true } switch (this.peekChar(0)) { case ".": case "\\": // atomEscape case "[": // characterClass // TODO: isAtom must be called before isAssertion - disambiguate case "(": // group return true default: return false } } RegExpParser.prototype.isAssertion = function() { switch (this.peekChar(0)) { case "^": case "$": return true // '\b' or '\B' case "\\": switch (this.peekChar(1)) { case "b": case "B": return true default: return false } // '(?=' or '(?!' case "(": return ( this.peekChar(1) === "?" && (this.peekChar(2) === "=" || this.peekChar(2) === "!") ) default: return false } } RegExpParser.prototype.isQuantifier = function() { var prevState = this.saveState() try { return this.quantifier(true) !== undefined } catch (e) { return false } finally { this.restoreState(prevState) } } RegExpParser.prototype.isPatternCharacter = function() { switch (this.peekChar()) { case "^": case "$": case "\\": case ".": case "*": case "+": case "?": case "(": case ")": case "[": case "|": case "/": case "\n": case "\r": case "\u2028": case "\u2029": return false default: return true } } RegExpParser.prototype.parseHexDigits = function(howMany) { var hexString = "" for (var i = 0; i < howMany; i++) { var hexChar = this.popChar() if (hexDigitPattern.test(hexChar) === false) { throw Error("Expecting a HexDecimal digits") } hexString += hexChar } var charCode = parseInt(hexString, 16) return { type: "Character", value: charCode } } RegExpParser.prototype.peekChar = function(howMuch) { if (howMuch === undefined) { howMuch = 0 } return this.input[this.idx + howMuch] } RegExpParser.prototype.popChar = function() { var nextChar = this.peekChar(0) this.consumeChar() return nextChar } RegExpParser.prototype.consumeChar = function(char) { if (char !== undefined && this.input[this.idx] !== char) { throw Error( "Expected: '" + char + "' but found: '" + this.input[this.idx] + "' at offset: " + this.idx ) } if (this.idx >= this.input.length) { throw Error("Unexpected end of input") } this.idx++ } RegExpParser.prototype.loc = function(begin) { return { begin: begin, end: this.idx } } // consts and utilities var hexDigitPattern = /[0-9a-fA-F]/ var decimalPattern = /[0-9]/ var decimalPatternNoZero = /[1-9]/ function cc(char) { return char.charCodeAt(0) } function insertToSet(item, set) { if (item.length !== undefined) { item.forEach(function(subItem) { set.push(subItem) }) } else { set.push(item) } } function addFlag(flagObj, flagKey) { if (flagObj[flagKey] === true) { throw "duplicate flag " + flagKey } flagObj[flagKey] = true } function ASSERT_EXISTS(obj) { // istanbul ignore next if (obj === undefined) { throw Error("Internal Error - Should never get here!") } } // istanbul ignore next function ASSERT_NEVER_REACH_HERE() { throw Error("Internal Error - Should never get here!") } var i var digitsCharCodes = [] for (i = cc("0"); i <= cc("9"); i++) { digitsCharCodes.push(i) } var wordCharCodes = [cc("_")].concat(digitsCharCodes) for (i = cc("a"); i <= cc("z"); i++) { wordCharCodes.push(i) } for (i = cc("A"); i <= cc("Z"); i++) { wordCharCodes.push(i) } // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#character-classes var whitespaceCodes = [ cc(" "), cc("\f"), cc("\n"), cc("\r"), cc("\t"), cc("\v"), cc("\t"), cc("\u00a0"), cc("\u1680"), cc("\u2000"), cc("\u2001"), cc("\u2002"), cc("\u2003"), cc("\u2004"), cc("\u2005"), cc("\u2006"), cc("\u2007"), cc("\u2008"), cc("\u2009"), cc("\u200a"), cc("\u2028"), cc("\u2029"), cc("\u202f"), cc("\u205f"), cc("\u3000"), cc("\ufeff") ] function BaseRegExpVisitor() {} BaseRegExpVisitor.prototype.visitChildren = function(node) { for (var key in node) { var child = node[key] /* istanbul ignore else */ if (node.hasOwnProperty(key)) { if (child.type !== undefined) { this.visit(child) } else if (Array.isArray(child)) { child.forEach(function(subChild) { this.visit(subChild) }, this) } } } } BaseRegExpVisitor.prototype.visit = function(node) { switch (node.type) { case "Pattern": this.visitPattern(node) break case "Flags": this.visitFlags(node) break case "Disjunction": this.visitDisjunction(node) break case "Alternative": this.visitAlternative(node) break case "StartAnchor": this.visitStartAnchor(node) break case "EndAnchor": this.visitEndAnchor(node) break case "WordBoundary": this.visitWordBoundary(node) break case "NonWordBoundary": this.visitNonWordBoundary(node) break case "Lookahead": this.visitLookahead(node) break case "NegativeLookahead": this.visitNegativeLookahead(node) break case "Character": this.visitCharacter(node) break case "Set": this.visitSet(node) break case "Group": this.visitGroup(node) break case "GroupBackReference": this.visitGroupBackReference(node) break case "Quantifier": this.visitQuantifier(node) break } this.visitChildren(node) } BaseRegExpVisitor.prototype.visitPattern = function(node) {} BaseRegExpVisitor.prototype.visitFlags = function(node) {} BaseRegExpVisitor.prototype.visitDisjunction = function(node) {} BaseRegExpVisitor.prototype.visitAlternative = function(node) {} // Assertion BaseRegExpVisitor.prototype.visitStartAnchor = function(node) {} BaseRegExpVisitor.prototype.visitEndAnchor = function(node) {} BaseRegExpVisitor.prototype.visitWordBoundary = function(node) {} BaseRegExpVisitor.prototype.visitNonWordBoundary = function(node) {} BaseRegExpVisitor.prototype.visitLookahead = function(node) {} BaseRegExpVisitor.prototype.visitNegativeLookahead = function(node) {} // atoms BaseRegExpVisitor.prototype.visitCharacter = function(node) {} BaseRegExpVisitor.prototype.visitSet = function(node) {} BaseRegExpVisitor.prototype.visitGroup = function(node) {} BaseRegExpVisitor.prototype.visitGroupBackReference = function(node) {} BaseRegExpVisitor.prototype.visitQuantifier = function(node) {} return { RegExpParser: RegExpParser, BaseRegExpVisitor: BaseRegExpVisitor, VERSION: "0.5.0" } } ) /***/ }), /***/ 107: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; /* istanbul ignore file - tricky to import some things from this module during testing */ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Parser = exports.generateParserModule = exports.generateParserFactory = exports.createSyntaxDiagramsCode = exports.clearCache = exports.validateGrammar = exports.resolveGrammar = exports.assignOccurrenceIndices = exports.GAstVisitor = exports.serializeProduction = exports.serializeGrammar = exports.Terminal = exports.Rule = exports.RepetitionWithSeparator = exports.RepetitionMandatoryWithSeparator = exports.RepetitionMandatory = exports.Repetition = exports.Option = exports.NonTerminal = exports.Alternative = exports.Alternation = exports.defaultLexerErrorProvider = exports.NoViableAltException = exports.NotAllInputParsedException = exports.MismatchedTokenException = exports.isRecognitionException = exports.EarlyExitException = exports.defaultParserErrorProvider = exports.defaultGrammarValidatorErrorProvider = exports.defaultGrammarResolverErrorProvider = exports.tokenName = exports.tokenMatcher = exports.tokenLabel = exports.EOF = exports.createTokenInstance = exports.createToken = exports.LexerDefinitionErrorType = exports.Lexer = exports.EMPTY_ALT = exports.ParserDefinitionErrorType = exports.EmbeddedActionsParser = exports.CstParser = exports.VERSION = void 0; // semantic version var version_1 = __webpack_require__(979); Object.defineProperty(exports, "VERSION", ({ enumerable: true, get: function () { return version_1.VERSION; } })); var parser_1 = __webpack_require__(941); Object.defineProperty(exports, "CstParser", ({ enumerable: true, get: function () { return parser_1.CstParser; } })); Object.defineProperty(exports, "EmbeddedActionsParser", ({ enumerable: true, get: function () { return parser_1.EmbeddedActionsParser; } })); Object.defineProperty(exports, "ParserDefinitionErrorType", ({ enumerable: true, get: function () { return parser_1.ParserDefinitionErrorType; } })); Object.defineProperty(exports, "EMPTY_ALT", ({ enumerable: true, get: function () { return parser_1.EMPTY_ALT; } })); var lexer_public_1 = __webpack_require__(27); Object.defineProperty(exports, "Lexer", ({ enumerable: true, get: function () { return lexer_public_1.Lexer; } })); Object.defineProperty(exports, "LexerDefinitionErrorType", ({ enumerable: true, get: function () { return lexer_public_1.LexerDefinitionErrorType; } })); // Tokens utilities var tokens_public_1 = __webpack_require__(736); Object.defineProperty(exports, "createToken", ({ enumerable: true, get: function () { return tokens_public_1.createToken; } })); Object.defineProperty(exports, "createTokenInstance", ({ enumerable: true, get: function () { return tokens_public_1.createTokenInstance; } })); Object.defineProperty(exports, "EOF", ({ enumerable: true, get: function () { return tokens_public_1.EOF; } })); Object.defineProperty(exports, "tokenLabel", ({ enumerable: true, get: function () { return tokens_public_1.tokenLabel; } })); Object.defineProperty(exports, "tokenMatcher", ({ enumerable: true, get: function () { return tokens_public_1.tokenMatcher; } })); Object.defineProperty(exports, "tokenName", ({ enumerable: true, get: function () { return tokens_public_1.tokenName; } })); // Other Utilities var errors_public_1 = __webpack_require__(7); Object.defineProperty(exports, "defaultGrammarResolverErrorProvider", ({ enumerable: true, get: function () { return errors_public_1.defaultGrammarResolverErrorProvider; } })); Object.defineProperty(exports, "defaultGrammarValidatorErrorProvider", ({ enumerable: true, get: function () { return errors_public_1.defaultGrammarValidatorErrorProvider; } })); Object.defineProperty(exports, "defaultParserErrorProvider", ({ enumerable: true, get: function () { return errors_public_1.defaultParserErrorProvider; } })); var exceptions_public_1 = __webpack_require__(643); Object.defineProperty(exports, "EarlyExitException", ({ enumerable: true, get: function () { return exceptions_public_1.EarlyExitException; } })); Object.defineProperty(exports, "isRecognitionException", ({ enumerable: true, get: function () { return exceptions_public_1.isRecognitionException; } })); Object.defineProperty(exports, "MismatchedTokenException", ({ enumerable: true, get: function () { return exceptions_public_1.MismatchedTokenException; } })); Object.defineProperty(exports, "NotAllInputParsedException", ({ enumerable: true, get: function () { return exceptions_public_1.NotAllInputParsedException; } })); Object.defineProperty(exports, "NoViableAltException", ({ enumerable: true, get: function () { return exceptions_public_1.NoViableAltException; } })); var lexer_errors_public_1 = __webpack_require__(495); Object.defineProperty(exports, "defaultLexerErrorProvider", ({ enumerable: true, get: function () { return lexer_errors_public_1.defaultLexerErrorProvider; } })); // grammar reflection API var gast_public_1 = __webpack_require__(946); Object.defineProperty(exports, "Alternation", ({ enumerable: true, get: function () { return gast_public_1.Alternation; } })); Object.defineProperty(exports, "Alternative", ({ enumerable: true, get: function () { return gast_public_1.Alternative; } })); Object.defineProperty(exports, "NonTerminal", ({ enumerable: true, get: function () { return gast_public_1.NonTerminal; } })); Object.defineProperty(exports, "Option", ({ enumerable: true, get: function () { return gast_public_1.Option; } })); Object.defineProperty(exports, "Repetition", ({ enumerable: true, get: function () { return gast_public_1.Repetition; } })); Object.defineProperty(exports, "RepetitionMandatory", ({ enumerable: true, get: function () { return gast_public_1.RepetitionMandatory; } })); Object.defineProperty(exports, "RepetitionMandatoryWithSeparator", ({ enumerable: true, get: function () { return gast_public_1.RepetitionMandatoryWithSeparator; } })); Object.defineProperty(exports, "RepetitionWithSeparator", ({ enumerable: true, get: function () { return gast_public_1.RepetitionWithSeparator; } })); Object.defineProperty(exports, "Rule", ({ enumerable: true, get: function () { return gast_public_1.Rule; } })); Object.defineProperty(exports, "Terminal", ({ enumerable: true, get: function () { return gast_public_1.Terminal; } })); // GAST Utilities var gast_public_2 = __webpack_require__(946); Object.defineProperty(exports, "serializeGrammar", ({ enumerable: true, get: function () { return gast_public_2.serializeGrammar; } })); Object.defineProperty(exports, "serializeProduction", ({ enumerable: true, get: function () { return gast_public_2.serializeProduction; } })); var gast_visitor_public_1 = __webpack_require__(841); Object.defineProperty(exports, "GAstVisitor", ({ enumerable: true, get: function () { return gast_visitor_public_1.GAstVisitor; } })); var gast_resolver_public_1 = __webpack_require__(665); Object.defineProperty(exports, "assignOccurrenceIndices", ({ enumerable: true, get: function () { return gast_resolver_public_1.assignOccurrenceIndices; } })); Object.defineProperty(exports, "resolveGrammar", ({ enumerable: true, get: function () { return gast_resolver_public_1.resolveGrammar; } })); Object.defineProperty(exports, "validateGrammar", ({ enumerable: true, get: function () { return gast_resolver_public_1.validateGrammar; } })); /* istanbul ignore next */ function clearCache() { console.warn("The clearCache function was 'soft' removed from the Chevrotain API." + "\n\t It performs no action other than printing this message." + "\n\t Please avoid using it as it will be completely removed in the future"); } exports.clearCache = clearCache; var render_public_1 = __webpack_require__(781); Object.defineProperty(exports, "createSyntaxDiagramsCode", ({ enumerable: true, get: function () { return render_public_1.createSyntaxDiagramsCode; } })); var generate_public_1 = __webpack_require__(421); Object.defineProperty(exports, "generateParserFactory", ({ enumerable: true, get: function () { return generate_public_1.generateParserFactory; } })); Object.defineProperty(exports, "generateParserModule", ({ enumerable: true, get: function () { return generate_public_1.generateParserModule; } })); var Parser = /** @class */ (function () { function Parser() { throw new Error("The Parser class has been deprecated, use CstParser or EmbeddedActionsParser instead.\t\n" + "See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_7-0-0"); } return Parser; }()); exports.Parser = Parser; //# sourceMappingURL=api.js.map /***/ }), /***/ 781: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.createSyntaxDiagramsCode = void 0; var version_1 = __webpack_require__(979); function createSyntaxDiagramsCode(grammar, _a) { var _b = _a === void 0 ? {} : _a, _c = _b.resourceBase, resourceBase = _c === void 0 ? "https://unpkg.com/chevrotain@" + version_1.VERSION + "/diagrams/" : _c, _d = _b.css, css = _d === void 0 ? "https://unpkg.com/chevrotain@" + version_1.VERSION + "/diagrams/diagrams.css" : _d; var header = "\n<!-- This is a generated file -->\n<!DOCTYPE html>\n<meta charset=\"utf-8\">\n<style>\n body {\n background-color: hsl(30, 20%, 95%)\n }\n</style>\n\n"; var cssHtml = "\n<link rel='stylesheet' href='" + css + "'>\n"; var scripts = "\n<script src='" + resourceBase + "vendor/railroad-diagrams.js'></script>\n<script src='" + resourceBase + "src/diagrams_builder.js'></script>\n<script src='" + resourceBase + "src/diagrams_behavior.js'></script>\n<script src='" + resourceBase + "src/main.js'></script>\n"; var diagramsDiv = "\n<div id=\"diagrams\" align=\"center\"></div> \n"; var serializedGrammar = "\n<script>\n window.serializedGrammar = " + JSON.stringify(grammar, null, " ") + ";\n</script>\n"; var initLogic = "\n<script>\n var diagramsDiv = document.getElementById(\"diagrams\");\n main.drawDiagramsFromSerializedGrammar(serializedGrammar, diagramsDiv);\n</script>\n"; return (header + cssHtml + scripts + diagramsDiv + serializedGrammar + initLogic); } exports.createSyntaxDiagramsCode = createSyntaxDiagramsCode; //# sourceMappingURL=render_public.js.map /***/ }), /***/ 288: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.genSingleAlt = exports.genAlternation = exports.genNonTerminal = exports.genTerminal = exports.genRule = exports.genAllRules = exports.genClass = exports.genWrapperFunction = exports.genUmdModule = void 0; var utils_1 = __webpack_require__(713); var gast_public_1 = __webpack_require__(946); /** * Missing features * 1. Rule arguments * 2. Gates * 3. embedded actions */ var NL = "\n"; function genUmdModule(options) { return "\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(['chevrotain'], factory);\n } else if (typeof module === 'object' && module.exports) {\n // Node. Does not work with strict CommonJS, but\n // only CommonJS-like environments that support module.exports,\n // like Node.\n module.exports = factory(require('chevrotain'));\n } else {\n // Browser globals (root is window)\n root.returnExports = factory(root.b);\n }\n}(typeof self !== 'undefined' ? self : this, function (chevrotain) {\n\n" + genClass(options) + "\n \nreturn {\n " + options.name + ": " + options.name + " \n}\n}));\n"; } exports.genUmdModule = genUmdModule; function genWrapperFunction(options) { return " \n" + genClass(options) + "\nreturn new " + options.name + "(tokenVocabulary, config) \n"; } exports.genWrapperFunction = genWrapperFunction; function genClass(options) { // TODO: how to pass the token vocabulary? Constructor? other? var result = "\nfunction " + options.name + "(tokenVocabulary, config) {\n // invoke super constructor\n // No support for embedded actions currently, so we can 'hardcode'\n // The use of CstParser.\n chevrotain.CstParser.call(this, tokenVocabulary, config)\n\n const $ = this\n\n " + genAllRules(options.rules) + "\n\n // very important to call this after all the rules have been defined.\n // otherwise the parser may not work correctly as it will lack information\n // derived during the self analysis phase.\n this.performSelfAnalysis(this)\n}\n\n// inheritance as implemented in javascript in the previous decade... :(\n" + options.name + ".prototype = Object.create(chevrotain.CstParser.prototype)\n" + options.name + ".prototype.constructor = " + options.name + " \n "; return result; } exports.genClass = genClass; function genAllRules(rules) { var rulesText = utils_1.map(rules, function (currRule) { return genRule(currRule, 1); }); return rulesText.join("\n"); } exports.genAllRules = genAllRules; function genRule(prod, n) { var result = indent(n, "$.RULE(\"" + prod.name + "\", function() {") + NL; result += genDefinition(prod.definition, n + 1); result += indent(n + 1, "})") + NL; return result; } exports.genRule = genRule; function genTerminal(prod, n) { var name = prod.terminalType.name; // TODO: potential performance optimization, avoid tokenMap Dictionary access return indent(n, "$.CONSUME" + prod.idx + "(this.tokensMap." + name + ")" + NL); } exports.genTerminal = genTerminal; function genNonTerminal(prod, n) { return indent(n, "$.SUBRULE" + prod.idx + "($." + prod.nonTerminalName + ")" + NL); } exports.genNonTerminal = genNonTerminal; function genAlternation(prod, n) { var result = indent(n, "$.OR" + prod.idx + "([") + NL; var alts = utils_1.map(prod.definition, function (altDef) { return genSingleAlt(altDef, n + 1); }); result += alts.join("," + NL); result += NL + indent(n, "])" + NL); return result; } exports.genAlternation = genAlternation; function genSingleAlt(prod, n) { var result = indent(n, "{") + NL; result += indent(n + 1, "ALT: function() {") + NL; result += genDefinition(prod.definition, n + 1); result += indent(n + 1, "}") + NL; result += indent(n, "}"); return result; } exports.genSingleAlt = genSingleAlt; function genProd(prod, n) { /* istanbul ignore else */ if (prod instanceof gast_public_1.NonTerminal) { return genNonTerminal(prod, n); } else if (prod instanceof gast_public_1.Option) { return genDSLRule("OPTION", prod, n); } else if (prod instanceof gast_public_1.RepetitionMandatory) { return genDSLRule("AT_LEAST_ONE", prod, n); } else if (prod instanceof gast_public_1.RepetitionMandatoryWithSeparator) { return genDSLRule("AT_LEAST_ONE_SEP", prod, n); } else if (prod instanceof gast_public_1.RepetitionWithSeparator) { return genDSLRule("MANY_SEP", prod, n); } else if (prod instanceof gast_public_1.Repetition) { return genDSLRule("MANY", prod, n); } else if (prod instanceof gast_public_1.Alternation) { return genAlternation(prod, n); } else if (prod instanceof gast_public_1.Terminal) { return genTerminal(prod, n); } else if (prod instanceof gast_public_1.Alternative) { return genDefinition(prod.definition, n); } else { throw Error("non exhaustive match"); } } function genDSLRule(dslName, prod, n) { var result = indent(n, "$." + (dslName + prod.idx) + "("); if (prod.separator) { result += "{" + NL; result += indent(n + 1, "SEP: this.tokensMap." + prod.separator.name) + "," + NL; result += "DEF: " + genDefFunction(prod.definition, n + 2) + NL; result += indent(n, "}") + NL; } else { result += genDefFunction(prod.definition, n + 1); } result += indent(n, ")") + NL; return result; } function genDefFunction(definition, n) { var def = "function() {" + NL; def += genDefinition(definition, n); def += indent(n, "}") + NL; return def; } function genDefinition(def, n) { var result = ""; utils_1.forEach(def, function (prod) { result += genProd(prod, n + 1); }); return result; } function indent(howMuch, text) { var spaces = Array(howMuch * 4 + 1).join(" "); return spaces + text; } //# sourceMappingURL=generate.js.map /***/ }), /***/ 421: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.generateParserModule = exports.generateParserFactory = void 0; var generate_1 = __webpack_require__(288); function generateParserFactory(options) { var wrapperText = generate_1.genWrapperFunction({ name: options.name, rules: options.rules }); var constructorWrap