Skip to content

Commit

Permalink
Opt parser removed
Browse files Browse the repository at this point in the history
  • Loading branch information
barsdeveloper committed Dec 15, 2023
1 parent f7d1af8 commit 7b897f6
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 110 deletions.
79 changes: 8 additions & 71 deletions dist/regexer.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,6 @@ class Parser {
/** @protected */
predicate = v => this === v || v instanceof Function && this instanceof v

/** Calling parse() can make it change the overall parsing outcome */
isActualParser = true

/** @type {(new (...args: any) => Parser) & typeof Parser} */
Self

Expand All @@ -79,7 +76,7 @@ class Parser {
}


unwrap(target = /** @type {Parser<any>} */(null)) {
unwrap() {
return /** @type {Parser<T>[]} */([])
}

Expand All @@ -101,31 +98,6 @@ class Parser {
return null
}

/**
* @param {ConstructorType<Parser<any>>[]} traverse List of types to ignore and traverse even though they have isActualParser = true
* @param {ConstructorType<Parser<any>>[]} opaque List of types to consider actual parser even though they have isActualParser = false
* @returns {Parser<any>}
*/
actualParser(traverse = [], opaque = []) {
let isTraversable = (!this.isActualParser || traverse.some(this.predicate)) && !opaque.some(this.predicate);
let unwrapped = isTraversable ? this.unwrap() : undefined;
isTraversable &&= unwrapped?.length === 1;
return isTraversable ? unwrapped[0].actualParser(traverse, opaque) : this
}

/**
* @param {Parser<any>?} other
* @param {(Parser<any> | ConstructorType<Parser<any>>)[]} traverse List of types to ignore and traverse even though they have isActualParser = true
* @param {(Parser<any> | ConstructorType<Parser<any>>)[]} opaque List of types to consider actual parser even though they have isActualParser = false
* @returns {Parser<any>}
*/
withActualParser(other, traverse = [], opaque = []) {
let isTraversable = (!this.isActualParser || traverse.some(this.predicate)) && !opaque.some(this.predicate);
let unwrapped = isTraversable ? this.unwrap() : undefined;
isTraversable &&= unwrapped?.length === 1;
return isTraversable ? this.wrap(unwrapped[0].withActualParser(other, traverse, opaque)) : other
}

toString(context = Reply.makeContext(null, ""), indent = 0) {
if (context.visited.has(this)) {
return "<...>" // Recursive parser
Expand Down Expand Up @@ -223,9 +195,6 @@ class AlternativeParser extends Parser {
constructor(...parsers) {
super();
this.#parsers = parsers;
if (this.#parsers.length === 1) {
this.isActualParser = false;
}
}

unwrap() {
Expand Down Expand Up @@ -305,7 +274,7 @@ class ChainedParser extends Parser {
this.#fn = chained;
}

unwrap(target = /** @type {Parser<any>} */(null)) {
unwrap() {
return [this.#parser]
}

Expand Down Expand Up @@ -369,7 +338,6 @@ class FailureParser extends Parser {
class LazyParser extends Parser {

#parser
isActualParser = false

/** @type {T} */
#resolvedPraser
Expand All @@ -387,7 +355,7 @@ class LazyParser extends Parser {
return this.#resolvedPraser
}

unwrap(target = /** @type {Parser<any>} */(null)) {
unwrap() {
return [this.resolve()]
}

Expand Down Expand Up @@ -454,7 +422,7 @@ class LookaroundParser extends Parser {
this.#type = type;
}

unwrap(target = /** @type {Parser<any>} */(null)) {
unwrap() {
return [this.#parser]
}

Expand Down Expand Up @@ -510,8 +478,6 @@ class MapParser extends Parser {
return this.#mapper
}

isActualParser = false

/**
* @param {P} parser
* @param {(v: ParserValue<P>) => R} mapper
Expand All @@ -522,7 +488,7 @@ class MapParser extends Parser {
this.#mapper = mapper;
}

unwrap(target = /** @type {Parser<any>} */(null)) {
unwrap() {
return [this.#parser]
}

Expand Down Expand Up @@ -560,32 +526,6 @@ class MapParser extends Parser {
}
}

/**
* @template {Parser<any>} T
* @extends {AlternativeParser<[ParserValue<T>, SuccessParser]>}
*/
class OptionalParser extends AlternativeParser {

/** @param {T} parser */
constructor(parser) {
super(parser, SuccessParser.instance);
}

unwrap(target = /** @type {Parser<any>} */(null)) {
return [this.parsers[0]]
}

/**
* @template {Parser<any>[]} T
* @param {T} parsers
* @returns {OptionalParser<T>}
*/
wrap(...parsers) {
// @ts-expect-error
return super.wrap(...parsers, SuccessParser.instance)
}
}

/**
* @template {Number} Group
* @extends {Parser<Group extends -1 ? RegExpExecArray : String>}
Expand Down Expand Up @@ -653,12 +593,9 @@ class SequenceParser extends Parser {
constructor(...parsers) {
super();
this.#parsers = parsers;
if (this.#parsers.length === 1) {
this.isActualParser = false;
}
}

unwrap(target = /** @type {Parser<any>} */(null)) {
unwrap() {
return [...this.#parsers]
}

Expand Down Expand Up @@ -735,7 +672,7 @@ class TimesParser extends Parser {
this.#max = max;
}

unwrap(target = /** @type {Parser<any>} */(null)) {
unwrap() {
return [this.#parser]
}

Expand Down Expand Up @@ -973,7 +910,7 @@ class Regexer {
/** @returns {Regexer<T?>} */
opt() {
// @ts-expect-error
return new this.Self(new OptionalParser(this.#parser))
return this.Self.alt(this, this.Self.success())
}

/**
Expand Down
Loading

0 comments on commit 7b897f6

Please sign in to comment.