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
JavaScript
/*! 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