1051 lines
45 KiB
TypeScript
1051 lines
45 KiB
TypeScript
/**
|
|
* This is the base module of the package.
|
|
*
|
|
* It contains type aliases and generic parsers
|
|
* (not bound to a particular token type).
|
|
*
|
|
* Node:
|
|
* ```ts
|
|
* import * as p from 'peberminta';
|
|
* ```
|
|
*
|
|
* Deno:
|
|
* ```ts
|
|
* import * as p from 'https://deno.land/x/peberminta@.../core.ts';
|
|
* ```
|
|
*
|
|
* @packageDocumentation
|
|
*/
|
|
/**
|
|
* Data that is passed around between composed {@link Parser}s.
|
|
*
|
|
* Intended to be static, although nothing prevents you from
|
|
* accumulating data inside options object if parsed grammar allows to do so.
|
|
*
|
|
* @category Type aliases
|
|
*/
|
|
export type Data<TToken, TOptions> = {
|
|
/** Tokens array - the subject of parsing. */
|
|
tokens: TToken[];
|
|
/** Parser options object. */
|
|
options: TOptions;
|
|
};
|
|
/**
|
|
* Matched (successful) result from a {@link Parser}/{@link Matcher}.
|
|
*
|
|
* @category Type aliases
|
|
*/
|
|
export type Match<TValue> = {
|
|
matched: true;
|
|
/** Parser position after this match. */
|
|
position: number;
|
|
/** Matched value. */
|
|
value: TValue;
|
|
};
|
|
/**
|
|
* Unsuccessful result from a {@link Parser}.
|
|
*
|
|
* @category Type aliases
|
|
*/
|
|
export type NonMatch = {
|
|
matched: false;
|
|
};
|
|
/**
|
|
* Result from a {@link Parser}.
|
|
*
|
|
* @category Type aliases
|
|
*/
|
|
export type Result<TValue> = Match<TValue> | NonMatch;
|
|
/**
|
|
* Parser function.
|
|
* Accepts {@link Data} and token position, returns a {@link Result}.
|
|
*
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array.
|
|
*
|
|
* @category Type aliases
|
|
*/
|
|
export type Parser<TToken, TOptions, TValue> = (data: Data<TToken, TOptions>, i: number) => Result<TValue>;
|
|
/**
|
|
* Special case of {@link Parser} function.
|
|
* Accepts {@link Data} and token position, always returns a {@link Match}.
|
|
*
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array.
|
|
*
|
|
* @category Type aliases
|
|
*/
|
|
export type Matcher<TToken, TOptions, TValue> = (data: Data<TToken, TOptions>, i: number) => Match<TValue>;
|
|
/**
|
|
* Make a {@link Matcher} that always succeeds with provided value and doesn't consume input.
|
|
*
|
|
* Use {@link make} if you want to make a value dynamically.
|
|
*
|
|
* @param value - The value that is always returned.
|
|
*/
|
|
export declare function emit<TToken, TOptions, TValue>(value: TValue): Matcher<TToken, TOptions, TValue>;
|
|
export { emit as of };
|
|
/**
|
|
* Make a {@link Matcher} that always succeeds
|
|
* and makes a value with provided function without consuming input.
|
|
*
|
|
* Use {@link emit} if you want to emit the same value every time.
|
|
*
|
|
* Use {@link action} if you only need a side effect.
|
|
*
|
|
* Use {@link token} if you want to make a value based on an input token.
|
|
*
|
|
* @param f - A function to get the value.
|
|
*/
|
|
export declare function make<TToken, TOptions, TValue>(
|
|
/**
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array.
|
|
*/
|
|
f: (data: Data<TToken, TOptions>, i: number) => TValue): Matcher<TToken, TOptions, TValue>;
|
|
/**
|
|
* Make a {@link Matcher} that always succeeds with `null` value,
|
|
* and performs an action / side effect without consuming input.
|
|
*
|
|
* Use {@link emit} or {@link make} if you want to produce a result.
|
|
*
|
|
* Use {@link peek} if you want to wrap another parser.
|
|
*
|
|
* @param f - A function to produce a side effect (logging, etc).
|
|
*/
|
|
export declare function action<TToken, TOptions>(
|
|
/**
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array.
|
|
*/
|
|
f: (data: Data<TToken, TOptions>, i: number) => void): Matcher<TToken, TOptions, null>;
|
|
/**
|
|
* Parser that never matches.
|
|
*
|
|
* Use this as a part of normal flow, when alternative match might still exist.
|
|
*
|
|
* Use {@link error} to interrupt the parsing from unrecoverable situation.
|
|
*/
|
|
export declare function fail<TToken, TOptions>(data: Data<TToken, TOptions>, i: number): NonMatch;
|
|
/**
|
|
* Make a {@link Matcher} that throws an error if reached.
|
|
*
|
|
* Use with caution!
|
|
*
|
|
* Use {@link fail} if parser can step back and try a different path.
|
|
*
|
|
* For error recovery you can try to encode erroneous state in an output value instead.
|
|
*
|
|
* @param message - The message or a function to construct it from the current parser state.
|
|
*/
|
|
export declare function error<TToken, TOptions>(message: string | ((data: Data<TToken, TOptions>, i: number) => string)): Matcher<TToken, TOptions, never>;
|
|
/**
|
|
* Make a parser based on a token-to-value function.
|
|
*
|
|
* Nonmatch is produced if `undefined` value is returned by a function.
|
|
*
|
|
* Use {@link make} if you want to produce a value without consuming a token.
|
|
*
|
|
* You can use {@link satisfy} if you just want to test but not transform the value.
|
|
*
|
|
* @param onToken - Function that either transforms a token to a result value
|
|
* or returns `undefined`.
|
|
*
|
|
* @param onEnd - Optional function to be called if there are no tokens left.
|
|
* It can be used to throw an error when required token is missing.
|
|
*/
|
|
export declare function token<TToken, TOptions, TValue>(
|
|
/**
|
|
* @param token - A token at the parser position.
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array (points at the same token).
|
|
*/
|
|
onToken: (token: TToken, data: Data<TToken, TOptions>, i: number) => TValue | undefined,
|
|
/**
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array (naturally points after the end of array).
|
|
*/
|
|
onEnd?: (data: Data<TToken, TOptions>, i: number) => void): Parser<TToken, TOptions, TValue>;
|
|
/**
|
|
* Parser that matches any token value, consumes and returns it.
|
|
*
|
|
* Only fails when there are no more tokens.
|
|
*
|
|
* Use {@link token} instead if you intend to immediately transform the value.
|
|
*
|
|
* Use {@link satisfy} if there is a test condition but no transformation.
|
|
*/
|
|
export declare function any<TToken, TOptions>(data: Data<TToken, TOptions>, i: number): Result<TToken>;
|
|
/**
|
|
* Make a parser that tests a token with a given predicate and returns it.
|
|
*
|
|
* Use {@link token} instead if you want to transform the value.
|
|
*
|
|
* @param test - A test condition/predicate.
|
|
*/
|
|
export declare function satisfy<TToken, TOptions>(
|
|
/**
|
|
* @param token - A token at the parser position.
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array (points at the same token).
|
|
*/
|
|
test: (token: TToken, data: Data<TToken, TOptions>, i: number) => boolean): Parser<TToken, TOptions, TToken>;
|
|
/**
|
|
* This overload makes a new {@link Matcher} that
|
|
* transforms the matched value from a given Matcher.
|
|
*
|
|
* Use {@link map1} if some matched values can't be mapped.
|
|
*
|
|
* Use {@link ab} to map over values of two consecutive parsers.
|
|
*
|
|
* Use {@link abc} to map over values of three consecutive parsers.
|
|
*
|
|
* @param p - A base matcher.
|
|
* @param mapper - A function that modifies the matched value.
|
|
*/
|
|
export declare function map<TToken, TOptions, TValue1, TValue2>(p: Matcher<TToken, TOptions, TValue1>,
|
|
/**
|
|
* @param v - A value matched by the base parser.
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array (before the first parser matched).
|
|
* @param j - Parser position in the tokens array (after the first parser matched).
|
|
*/
|
|
mapper: (v: TValue1, data: Data<TToken, TOptions>, i: number, j: number) => TValue2): Matcher<TToken, TOptions, TValue2>;
|
|
/**
|
|
* Make a new parser that transforms the matched value from a given parser.
|
|
*
|
|
* Use {@link map1} if some matched values can't be mapped.
|
|
*
|
|
* @param p - A base parser.
|
|
* @param mapper - A function that modifies the matched value.
|
|
*/
|
|
export declare function map<TToken, TOptions, TValue1, TValue2>(p: Parser<TToken, TOptions, TValue1>,
|
|
/**
|
|
* @param v - A value matched by the base parser.
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array (before the first parser matched).
|
|
* @param j - Parser position in the tokens array (after the first parser matched).
|
|
*/
|
|
mapper: (v: TValue1, data: Data<TToken, TOptions>, i: number, j: number) => TValue2): Parser<TToken, TOptions, TValue2>;
|
|
/**
|
|
* Make a new parser that transforms the match from a given parser.
|
|
*
|
|
* This version can discard a {@link Match} - return a {@link NonMatch} instead.
|
|
*
|
|
* Note: pay attention to the return type and indices.
|
|
*
|
|
* Use {@link map} if mapping exists for all matched values.
|
|
*
|
|
* @param p - A base parser.
|
|
* @param mapper - A function that modifies the match.
|
|
*/
|
|
export declare function map1<TToken, TOptions, TValue1, TValue2>(p: Parser<TToken, TOptions, TValue1>,
|
|
/**
|
|
* @param m - A {@link Match} object from the base parser (contains the value and the position after the match).
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array (before the first parser matched).
|
|
* @returns A transformed {@link Result} object - either {@link Match} or {@link NonMatch}.
|
|
*/
|
|
mapper: (m: Match<TValue1>, data: Data<TToken, TOptions>, i: number) => Result<TValue2>): Parser<TToken, TOptions, TValue2>;
|
|
/**
|
|
* This overload adds a side effect to a {@link Matcher} without changing it's result.
|
|
*
|
|
* Use {@link action} if there is nothing to wrap and you need a non-consuming parser instead.
|
|
*
|
|
* @param p - A matcher.
|
|
* @param f - A function to produce a side effect (logging, etc).
|
|
*/
|
|
export declare function peek<TToken, TOptions, TValue>(p: Matcher<TToken, TOptions, TValue>,
|
|
/**
|
|
* @param r - A {@link Result} object after running the base parser.
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array (before the first parser matched).
|
|
*/
|
|
f: (r: Match<TValue>, data: Data<TToken, TOptions>, i: number) => void): Matcher<TToken, TOptions, TValue>;
|
|
/**
|
|
* Add a side effect to a parser without changing it's result.
|
|
*
|
|
* Use {@link action} if there is nothing to wrap and you need a non-consuming parser instead.
|
|
*
|
|
* @param p - A parser.
|
|
* @param f - A function to produce a side effect (logging, etc).
|
|
*/
|
|
export declare function peek<TToken, TOptions, TValue>(p: Parser<TToken, TOptions, TValue>,
|
|
/**
|
|
* @param r - A {@link Result} object after running the base parser.
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array (before the first parser matched).
|
|
*/
|
|
f: (r: Result<TValue>, data: Data<TToken, TOptions>, i: number) => void): Parser<TToken, TOptions, TValue>;
|
|
/**
|
|
* Make a {@link Matcher} that returns either a match from a given parser
|
|
* or a match with the default value (without consuming input in that case).
|
|
*
|
|
* Use {@link otherwise} if you want to provide a {@link Matcher}
|
|
* instead of a constant default value.
|
|
*
|
|
* @param p - A parser.
|
|
* @param def - Default value to be returned in case parser didn't match.
|
|
*/
|
|
export declare function option<TToken, TOptions, TValue>(p: Parser<TToken, TOptions, TValue>, def: TValue): Matcher<TToken, TOptions, TValue>;
|
|
/**
|
|
* Make a parser that returns a Match without consuming input
|
|
* in case the inner parser didn't match
|
|
* and a NonMatch in case the inner parser matched.
|
|
*
|
|
* @param p - A parser.
|
|
* @param value - A value to be returned in case parser didn't match.
|
|
*/
|
|
export declare function not<TToken, TOptions, TValue>(p: Parser<TToken, TOptions, TValue>): Parser<TToken, TOptions, true>;
|
|
/**
|
|
* This overload makes a {@link Matcher} that tries multiple parsers (last entry is a matcher) at the same position
|
|
* and returns the first successful match.
|
|
*
|
|
* @param ps - Parsers to try.
|
|
*/
|
|
export declare function choice<TToken, TOptions, TValue>(...ps: [...Parser<TToken, TOptions, TValue>[], Matcher<TToken, TOptions, TValue>]): Matcher<TToken, TOptions, TValue>;
|
|
/**
|
|
* Make a parser that tries multiple parsers at the same position
|
|
* and returns the first successful match
|
|
* or a nonmatch if there was none.
|
|
*
|
|
* @param ps - Parsers to try.
|
|
*/
|
|
export declare function choice<TToken, TOptions, TValue>(...ps: Parser<TToken, TOptions, TValue>[]): Parser<TToken, TOptions, TValue>;
|
|
export { choice as or };
|
|
/**
|
|
* This overload makes a {@link Matcher} from a parser and a matcher.
|
|
* If the parser matched - return the match,
|
|
* otherwise return the match from the matcher.
|
|
*
|
|
* Can be used to keep the matcher type when you have multiple parsing options
|
|
* and the last one always matches.
|
|
*
|
|
* Combine with {@link choice} if you need multiple alternative parsers of the same value type.
|
|
*
|
|
* Nest calls to have union of more than two different value types derived automatically.
|
|
*
|
|
* Use {@link option} if you just want a constant alternative value
|
|
* without consuming input.
|
|
*
|
|
* @param pa - A parser.
|
|
* @param pb - A matcher that is only called if the parser didn't match.
|
|
*/
|
|
export declare function otherwise<TToken, TOptions, TValueA, TValueB>(pa: Parser<TToken, TOptions, TValueA>, pb: Matcher<TToken, TOptions, TValueB>): Matcher<TToken, TOptions, TValueA | TValueB>;
|
|
/**
|
|
* Make a parser that tries two parsers at the same position
|
|
* and returns the first successful match
|
|
* or a nonmatch if there was none.
|
|
*
|
|
* Use this if you want to combine parsers of different value types.
|
|
*
|
|
* Nest calls to have more than two different value types.
|
|
*
|
|
* Use {@link choice} if you have parsers of the same value type.
|
|
*
|
|
* @param pa - A parser that is tried first.
|
|
* @param pb - A parser that is only tried if the first one didn't match.
|
|
*/
|
|
export declare function otherwise<TToken, TOptions, TValueA, TValueB>(pa: Parser<TToken, TOptions, TValueA>, pb: Parser<TToken, TOptions, TValueB>): Parser<TToken, TOptions, TValueA | TValueB>;
|
|
export { otherwise as eitherOr };
|
|
/**
|
|
* Make a parser that tries all provided parsers at the same position
|
|
* and returns the longest successful match
|
|
* or a nonmatch if there was none.
|
|
*
|
|
* If there are multiple matches of the same maximum length
|
|
* then the first one of them is returned.
|
|
*
|
|
* Use {@link choice} to take the first match.
|
|
*
|
|
* @param ps - Parsers to try.
|
|
*/
|
|
export declare function longest<TToken, TOptions, TValue>(...ps: Parser<TToken, TOptions, TValue>[]): Parser<TToken, TOptions, TValue>;
|
|
/**
|
|
* Make a {@link Matcher} that returns all (0 or more)
|
|
* sequential matches of the same given parser *while* the test function
|
|
* equates to `true`.
|
|
*
|
|
* Use {@link many} if there is no stop condition.
|
|
*
|
|
* Use {@link takeWhileP} if the stop condition is expressed as a parser.
|
|
*
|
|
* @param p - A parser.
|
|
* @param test - Matched results are accumulated *while* the result of this function is `true`.
|
|
*/
|
|
export declare function takeWhile<TToken, TOptions, TValue>(p: Parser<TToken, TOptions, TValue>,
|
|
/**
|
|
* @param value - Current value matched by the parser.
|
|
* @param n - Number of matches so far (including the current value).
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array (before the current value matched).
|
|
* @param j - Parser position in the tokens array (after the current value matched).
|
|
*/
|
|
test: (value: TValue, n: number, data: Data<TToken, TOptions>, i: number, j: number) => boolean): Matcher<TToken, TOptions, TValue[]>;
|
|
/**
|
|
* Make a {@link Matcher} that returns all (0 or more)
|
|
* sequential matches of the same given parser *while* the test function
|
|
* equates to `false` (that is *until* it equates to `true` for the first time).
|
|
*
|
|
* Use {@link many} if there is no stop condition.
|
|
*
|
|
* Use {@link takeUntilP} if the stop condition is expressed as a parser.
|
|
*
|
|
* Implementation is based on {@link takeWhile}.
|
|
*
|
|
* @param p - A parser.
|
|
* @param test - Matched results are accumulated *until* the result of this function is `true`.
|
|
*/
|
|
export declare function takeUntil<TToken, TOptions, TValue>(p: Parser<TToken, TOptions, TValue>,
|
|
/**
|
|
* @param value - Current value matched by the parser.
|
|
* @param n - Number of matches so far (including the current value).
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array (before the current value matched).
|
|
* @param j - Parser position in the tokens array (after the current value matched).
|
|
*/
|
|
test: (value: TValue, n: number, data: Data<TToken, TOptions>, i: number, j: number) => boolean): Matcher<TToken, TOptions, TValue[]>;
|
|
/**
|
|
* Make a {@link Matcher} that returns all (0 or more)
|
|
* sequential matches of the first parser *while* the second parser also matches.
|
|
*
|
|
* Use {@link takeWhile} if the stop condition is based on the parsed value.
|
|
*
|
|
* Implementation is based on {@link takeWhile}.
|
|
*
|
|
* @param pValue - A parser that produces result values.
|
|
* @param pTest - A parser that serves as a stop condition.
|
|
*/
|
|
export declare function takeWhileP<TToken, TOptions, TValue>(pValue: Parser<TToken, TOptions, TValue>, pTest: Parser<TToken, TOptions, unknown>): Matcher<TToken, TOptions, TValue[]>;
|
|
/**
|
|
* Make a {@link Matcher} that returns all (0 or more)
|
|
* sequential matches of the first parser *while* the second parser does not match
|
|
* (that is *until* the second parser matches).
|
|
*
|
|
* Use {@link takeUntil} if the stop condition is based on the parsed value.
|
|
*
|
|
* Implementation is based on {@link takeWhile}.
|
|
*
|
|
* @param pValue - A parser that produces result values.
|
|
* @param pTest - A parser that serves as a stop condition.
|
|
*/
|
|
export declare function takeUntilP<TToken, TOptions, TValue>(pValue: Parser<TToken, TOptions, TValue>, pTest: Parser<TToken, TOptions, unknown>): Matcher<TToken, TOptions, TValue[]>;
|
|
/**
|
|
* Make a {@link Matcher} that returns all (0 or more) sequential matches of the same given parser.
|
|
*
|
|
* A match with empty array is produced if no single match was found.
|
|
*
|
|
* Use {@link many1} if at least one match is required.
|
|
*
|
|
* Implementation is based on {@link takeWhile}.
|
|
*
|
|
* @param p - A parser to apply repeatedly.
|
|
*/
|
|
export declare function many<TToken, TOptions, TValue>(p: Parser<TToken, TOptions, TValue>): Matcher<TToken, TOptions, TValue[]>;
|
|
/**
|
|
* Make a parser that returns all (1 or more) sequential matches of the same parser.
|
|
*
|
|
* A nonmatch is returned if no single match was found.
|
|
*
|
|
* Use {@link many} in case zero matches are allowed.
|
|
*
|
|
* Implementation is based on {@link ab} and {@link many}.
|
|
*
|
|
* @param p - A parser to apply repeatedly.
|
|
*/
|
|
export declare function many1<TToken, TOptions, TValue>(p: Parser<TToken, TOptions, TValue>): Parser<TToken, TOptions, [TValue, ...TValue[]]>;
|
|
export { many1 as some };
|
|
/**
|
|
* This overload makes a {@link Matcher} that applies two matchers one after another and joins the results.
|
|
*
|
|
* Use {@link abc} if you want to join 3 different parsers/matchers.
|
|
*
|
|
* Use {@link left} or {@link right} if you want to keep one result and discard another.
|
|
*
|
|
* Use {@link all} if you want a sequence of parsers of arbitrary length (but they have to share a common value type).
|
|
*
|
|
* @param pa - First matcher.
|
|
* @param pb - Second matcher.
|
|
* @param join - A function to combine values from both matchers.
|
|
*/
|
|
export declare function ab<TToken, TOptions, TValueA, TValueB, TValue>(pa: Matcher<TToken, TOptions, TValueA>, pb: Matcher<TToken, TOptions, TValueB>,
|
|
/**
|
|
* @param va - A value matched by the first matcher.
|
|
* @param vb - A value matched by the second matcher.
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array (before both matchers matched).
|
|
* @param j - Parser position in the tokens array (after both matchers matched).
|
|
*/
|
|
join: (va: TValueA, vb: TValueB, data: Data<TToken, TOptions>, i: number, j: number) => TValue): Matcher<TToken, TOptions, TValue>;
|
|
/**
|
|
* Make a parser that tries two parsers one after another and joins the results.
|
|
*
|
|
* A nonmatch is returned if any of two parsers did not match.
|
|
*
|
|
* Use {@link abc} if you want to join 3 different parsers.
|
|
*
|
|
* Use {@link left} or {@link right} if you want to keep one result and discard another.
|
|
*
|
|
* Use {@link all} if you want a sequence of parsers of arbitrary length (but they have to share a common value type).
|
|
*
|
|
* @param pa - First parser.
|
|
* @param pb - Second parser.
|
|
* @param join - A function to combine matched values from both parsers.
|
|
*/
|
|
export declare function ab<TToken, TOptions, TValueA, TValueB, TValue>(pa: Parser<TToken, TOptions, TValueA>, pb: Parser<TToken, TOptions, TValueB>,
|
|
/**
|
|
* @param va - A value matched by the first parser.
|
|
* @param vb - A value matched by the second parser.
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array (before both parsers matched).
|
|
* @param j - Parser position in the tokens array (after both parsers matched).
|
|
*/
|
|
join: (va: TValueA, vb: TValueB, data: Data<TToken, TOptions>, i: number, j: number) => TValue): Parser<TToken, TOptions, TValue>;
|
|
/**
|
|
* This overload makes a {@link Matcher} that applies two matchers one after another
|
|
* and returns the result from the first one.
|
|
*
|
|
* Implementation is based on {@link ab}.
|
|
*
|
|
* @param pa - First matcher (result is returned).
|
|
* @param pb - Second matcher (result is discarded).
|
|
*/
|
|
export declare function left<TToken, TOptions, TValueA, TValueB>(pa: Matcher<TToken, TOptions, TValueA>, pb: Matcher<TToken, TOptions, TValueB>): Matcher<TToken, TOptions, TValueA>;
|
|
/**
|
|
* Make a parser that tries two parsers one after another
|
|
* and returns the result from the first one if both matched.
|
|
*
|
|
* A nonmatch is returned if any of two parsers did not match.
|
|
*
|
|
* Implementation is based on {@link ab}.
|
|
*
|
|
* @param pa - First parser (result is returned).
|
|
* @param pb - Second parser (result is discarded).
|
|
*/
|
|
export declare function left<TToken, TOptions, TValueA, TValueB>(pa: Parser<TToken, TOptions, TValueA>, pb: Parser<TToken, TOptions, TValueB>): Parser<TToken, TOptions, TValueA>;
|
|
/**
|
|
* This overload makes a {@link Matcher} that applies two matchers one after another
|
|
* and returns the result from the second one.
|
|
*
|
|
* Implementation is based on {@link ab}.
|
|
*
|
|
* @param pa - First matcher (result is discarded).
|
|
* @param pb - Second matcher (result is returned).
|
|
*/
|
|
export declare function right<TToken, TOptions, TValueA, TValueB>(pa: Matcher<TToken, TOptions, TValueA>, pb: Matcher<TToken, TOptions, TValueB>): Matcher<TToken, TOptions, TValueB>;
|
|
/**
|
|
* Make a parser that tries two parsers one after another
|
|
* and returns the result from the second one if both matched.
|
|
*
|
|
* A nonmatch is returned if any of two parsers did not match.
|
|
*
|
|
* Implementation is based on {@link ab}.
|
|
*
|
|
* @param pa - First parser (result is discarded).
|
|
* @param pb - Second parser (result is returned).
|
|
*/
|
|
export declare function right<TToken, TOptions, TValueA, TValueB>(pa: Parser<TToken, TOptions, TValueA>, pb: Parser<TToken, TOptions, TValueB>): Parser<TToken, TOptions, TValueB>;
|
|
/**
|
|
* This overload makes a {@link Matcher} that applies three matchers one after another and joins the results.
|
|
*
|
|
* Use {@link ab} if you want to join just 2 different parsers/matchers.
|
|
*
|
|
* Use {@link middle} if you want to keep only the middle result and discard two others.
|
|
*
|
|
* Use {@link all} if you want a sequence of parsers of arbitrary length (but they have to share a common value type).
|
|
*
|
|
* @param pa - First matcher.
|
|
* @param pb - Second matcher.
|
|
* @param pc - Third matcher.
|
|
* @param join - A function to combine matched values from all three matchers.
|
|
*/
|
|
export declare function abc<TToken, TOptions, TValueA, TValueB, TValueC, TValue>(pa: Matcher<TToken, TOptions, TValueA>, pb: Matcher<TToken, TOptions, TValueB>, pc: Matcher<TToken, TOptions, TValueC>,
|
|
/**
|
|
* @param va - A value matched by the first matcher.
|
|
* @param vb - A value matched by the second matcher.
|
|
* @param vc - A value matched by the third matcher.
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array (before all three matchers matched).
|
|
* @param j - Parser position in the tokens array (after all three matchers matched).
|
|
*/
|
|
join: (va: TValueA, vb: TValueB, vc: TValueC, data: Data<TToken, TOptions>, i: number, j: number) => TValue): Matcher<TToken, TOptions, TValue>;
|
|
/**
|
|
* Make a parser that tries three parsers one after another and joins the results.
|
|
*
|
|
* A nonmatch is returned if any of three parsers did not match.
|
|
*
|
|
* Use {@link ab} if you want to join just 2 different parsers.
|
|
*
|
|
* Use {@link middle} if you want to keep only the middle result and discard two others.
|
|
*
|
|
* Use {@link all} if you want a sequence of parsers of arbitrary length (but they have to share a common value type).
|
|
*
|
|
* @param pa - First parser.
|
|
* @param pb - Second parser.
|
|
* @param pc - Third parser.
|
|
* @param join - A function to combine matched results from all three parsers.
|
|
*/
|
|
export declare function abc<TToken, TOptions, TValueA, TValueB, TValueC, TValue>(pa: Parser<TToken, TOptions, TValueA>, pb: Parser<TToken, TOptions, TValueB>, pc: Parser<TToken, TOptions, TValueC>,
|
|
/**
|
|
* @param va - A value matched by the first parser.
|
|
* @param vb - A value matched by the second parser.
|
|
* @param vc - A value matched by the third parser.
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array (before all three parsers matched).
|
|
* @param j - Parser position in the tokens array (after all three parsers matched).
|
|
*/
|
|
join: (va: TValueA, vb: TValueB, vc: TValueC, data: Data<TToken, TOptions>, i: number, j: number) => TValue): Parser<TToken, TOptions, TValue>;
|
|
/**
|
|
* This overload makes a {@link Matcher} that applies three matchers one after another
|
|
* and returns the middle result.
|
|
*
|
|
* Implementation is based on {@link abc}.
|
|
*
|
|
* @param pa - First matcher (result is discarded).
|
|
* @param pb - Second matcher (result is returned).
|
|
* @param pc - Third matcher (result is discarded).
|
|
*/
|
|
export declare function middle<TToken, TOptions, TValueA, TValueB, TValueC>(pa: Matcher<TToken, TOptions, TValueA>, pb: Matcher<TToken, TOptions, TValueB>, pc: Matcher<TToken, TOptions, TValueC>): Matcher<TToken, TOptions, TValueB>;
|
|
/**
|
|
* Make a parser that tries three parsers one after another
|
|
* and returns the middle result if all three matched.
|
|
*
|
|
* A nonmatch is returned if any of three parsers did not match.
|
|
*
|
|
* Implementation is based on {@link abc}.
|
|
*
|
|
* @param pa - First parser (result is discarded).
|
|
* @param pb - Second parser (result is returned).
|
|
* @param pc - Third parser (result is discarded).
|
|
*/
|
|
export declare function middle<TToken, TOptions, TValueA, TValueB, TValueC>(pa: Parser<TToken, TOptions, TValueA>, pb: Parser<TToken, TOptions, TValueB>, pc: Parser<TToken, TOptions, TValueC>): Parser<TToken, TOptions, TValueB>;
|
|
/**
|
|
* This overload makes a {@link Matcher} that runs all given matchers one after another
|
|
* and returns all results in an array.
|
|
*
|
|
* @param ps - Matchers to run sequentially.
|
|
*/
|
|
export declare function all<TToken, TOptions, TValue>(...ps: Matcher<TToken, TOptions, TValue>[]): Matcher<TToken, TOptions, TValue[]>;
|
|
/**
|
|
* Make a parser that runs all given parsers one after another
|
|
* and returns all results in an array.
|
|
*
|
|
* Nonmatch is returned if any of parsers didn't match.
|
|
*
|
|
* Use {@link ab} or {@link abc} if you need a limited number of parsers of different types.
|
|
*
|
|
* @param ps - Parsers to run sequentially.
|
|
*/
|
|
export declare function all<TToken, TOptions, TValue>(...ps: Parser<TToken, TOptions, TValue>[]): Parser<TToken, TOptions, TValue[]>;
|
|
export { all as and };
|
|
/**
|
|
* This overload makes a {@link Matcher} that runs all given matchers in sequence
|
|
* and discards (skips) all results (Returns a match with a dummy value).
|
|
*
|
|
* Implementation is based on {@link all} and {@link map}.
|
|
*
|
|
* This function only exists to make the intent clear.
|
|
* Use in combination with {@link left}, {@link right} or other combinators
|
|
* to make the `null` result disappear.
|
|
*
|
|
* @param ps - Parsers to run sequentially.
|
|
*/
|
|
export declare function skip<TToken, TOptions>(...ps: Matcher<TToken, TOptions, unknown>[]): Matcher<TToken, TOptions, unknown>;
|
|
/**
|
|
* Make a parser that runs all given parsers in sequence
|
|
* and discards (skips) all results (Returns a match with a dummy value).
|
|
*
|
|
* Nonmatch is returned if any of parsers didn't match.
|
|
*
|
|
* Implementation is based on {@link all} and {@link map}.
|
|
*
|
|
* This function only exists to make the intent clear.
|
|
* Use in combination with {@link left}, {@link right} or other combinators
|
|
* to make the `null` result disappear.
|
|
*
|
|
* @param ps - Parsers to run sequentially.
|
|
*/
|
|
export declare function skip<TToken, TOptions>(...ps: Parser<TToken, TOptions, unknown>[]): Parser<TToken, TOptions, unknown>;
|
|
export { skip as discard };
|
|
/**
|
|
* This overload makes a {@link Matcher} that concatenates values
|
|
* from all provided Matchers into a single array while flattening value arrays.
|
|
*
|
|
* Implementation is based on {@link all} and {@link flatten1}.
|
|
*
|
|
* @param ps - Matchers sequence.
|
|
* Each parser can return a match with a value or an array of values.
|
|
*/
|
|
export declare function flatten<TToken, TOptions, TValue>(...ps: Matcher<TToken, TOptions, TValue | TValue[]>[]): Matcher<TToken, TOptions, TValue[]>;
|
|
/**
|
|
* Make a parser that concatenates values from all provided parsers
|
|
* into a single array while flattening value arrays.
|
|
*
|
|
* Nonmatch is returned if any of parsers didn't match.
|
|
*
|
|
* Implementation is based on {@link all} and {@link flatten1}.
|
|
*
|
|
* @param ps - Parsers sequence.
|
|
* Each parser can return a match with a value or an array of values.
|
|
*/
|
|
export declare function flatten<TToken, TOptions, TValue>(...ps: Parser<TToken, TOptions, TValue | TValue[]>[]): Parser<TToken, TOptions, TValue[]>;
|
|
/**
|
|
* This overload makes a {@link Matcher} that flattens an array
|
|
* of values or value arrays returned by a given Matcher.
|
|
*
|
|
* Implementation is based on {@link map}.
|
|
*
|
|
* @param p - A matcher.
|
|
*/
|
|
export declare function flatten1<TToken, TOptions, TValue>(p: Matcher<TToken, TOptions, (TValue | TValue[])[]>): Matcher<TToken, TOptions, TValue[]>;
|
|
/**
|
|
* Make a parser that flattens an array of values or value arrays
|
|
* returned by a given parser.
|
|
*
|
|
* Implementation is based on {@link map}.
|
|
*
|
|
* @param p - A parser.
|
|
*/
|
|
export declare function flatten1<TToken, TOptions, TValue>(p: Parser<TToken, TOptions, (TValue | TValue[])[]>): Parser<TToken, TOptions, TValue[]>;
|
|
/**
|
|
* Make a parser that matches 1 or more values interleaved with separators.
|
|
*
|
|
* A nonmatch is returned if no single value was matched.
|
|
*
|
|
* Implementation is based on {@link ab}, {@link many} and {@link right}.
|
|
*
|
|
* @param pValue - A parser for values.
|
|
* @param pSep - A parser for separators.
|
|
*/
|
|
export declare function sepBy1<TToken, TOptions, TValue, TSep>(pValue: Parser<TToken, TOptions, TValue>, pSep: Parser<TToken, TOptions, TSep>): Parser<TToken, TOptions, [TValue, ...TValue[]]>;
|
|
/**
|
|
* Make a {@link Matcher} that matches 0 or more values interleaved with separators.
|
|
*
|
|
* A match with an empty array is returned if no single value was matched.
|
|
*
|
|
* Implementation is based on {@link sepBy1}, {@link otherwise} and {@link emit}.
|
|
*
|
|
* @param pValue - A parser for values.
|
|
* @param pSep - A parser for separators.
|
|
*/
|
|
export declare function sepBy<TToken, TOptions, TValue, TSep>(pValue: Parser<TToken, TOptions, TValue>, pSep: Parser<TToken, TOptions, TSep>): Matcher<TToken, TOptions, TValue[]>;
|
|
/**
|
|
* Make a {@link Matcher} that takes 0 or more matches from parsers
|
|
* returned by provided parser-generating function.
|
|
*
|
|
* This is like a combination of {@link chain} and {@link reduceLeft}.
|
|
* Each next parser is made based on previously accumulated value,
|
|
* parsing continues from left to right until first nonmatch.
|
|
*
|
|
* @param acc - Initial value for the accumulator.
|
|
* @param f - A function that returns a parser based on previously accumulated value.
|
|
*/
|
|
export declare function chainReduce<TToken, TOptions, TAcc>(acc: TAcc,
|
|
/**
|
|
* @param acc - Accumulated value.
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array (before each parser called).
|
|
*/
|
|
f: (acc: TAcc, data: Data<TToken, TOptions>, i: number) => Parser<TToken, TOptions, TAcc>): Matcher<TToken, TOptions, TAcc>;
|
|
/**
|
|
* Make a {@link Matcher} that takes 0 or more matches from the same parser
|
|
* and reduces them into one value in left-to-right (first-to-last) order.
|
|
*
|
|
* Note: accumulator is the left (first) argument.
|
|
*
|
|
* Use {@link leftAssoc1} if you have an initial value to be parsed first.
|
|
*
|
|
* Implementation is based on {@link chainReduce} and {@link map}.
|
|
*
|
|
* @param acc - Initial value for the accumulator.
|
|
* @param p - Parser for each next value.
|
|
* @param reducer - Function to combine the accumulator and each parsed value.
|
|
*/
|
|
export declare function reduceLeft<TToken, TOptions, TAcc, TValue>(acc: TAcc, p: Parser<TToken, TOptions, TValue>,
|
|
/**
|
|
* @param acc - Accumulated value.
|
|
* @param v - Value from each successful parsing.
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Position before current match.
|
|
* @param j - Position after current match.
|
|
*/
|
|
reducer: (acc: TAcc, v: TValue, data: Data<TToken, TOptions>, i: number, j: number) => TAcc): Matcher<TToken, TOptions, TAcc>;
|
|
/**
|
|
* Make a {@link Matcher} that takes 0 or more matches from the same parser
|
|
* and reduces them into one value in right-to-left (last-to-first) order.
|
|
*
|
|
* Note: accumulator is the right (second) argument.
|
|
*
|
|
* Use {@link rightAssoc1} if you have an initial value to be parsed after all matches.
|
|
*
|
|
* Implementation is based on {@link many} and {@link map}.
|
|
*
|
|
* @param p - Parser for each next value.
|
|
* @param acc - Initial value for the accumulator.
|
|
* @param reducer - Function to combine the accumulator and each parsed value.
|
|
*/
|
|
export declare function reduceRight<TToken, TOptions, TValue, TAcc>(p: Parser<TToken, TOptions, TValue>, acc: TAcc,
|
|
/**
|
|
* @param v - Value from each successful parsing.
|
|
* @param acc - Accumulated value.
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Position before all successful parsings.
|
|
* @param j - Position after all successful parsings.
|
|
*/
|
|
reducer: (v: TValue, acc: TAcc, data: Data<TToken, TOptions>, i: number, j: number) => TAcc): Matcher<TToken, TOptions, TAcc>;
|
|
/**
|
|
* Make a parser that parses one value and any number of following values
|
|
* to combine with the first one in left-to-right (first-to-last) order.
|
|
*
|
|
* Use {@link leftAssoc2} if the grammar has an explicit operator between values.
|
|
*
|
|
* Implementation is based on {@link chain} and {@link reduceLeft}.
|
|
*
|
|
* @param pLeft - A parser for the first value,
|
|
* also defines the result type (accumulator).
|
|
*
|
|
* @param pOper - A parser for each consecutive value.
|
|
* Result type is a transformation operation for the accumulator.
|
|
*/
|
|
export declare function leftAssoc1<TToken, TOptions, TLeft>(pLeft: Parser<TToken, TOptions, TLeft>, pOper: Parser<TToken, TOptions, (x: TLeft) => TLeft>): Parser<TToken, TOptions, TLeft>;
|
|
/**
|
|
* Make a parser that parses any number of values and then one extra value
|
|
* to combine in right-to-left (last-to-first) order.
|
|
*
|
|
* Note: This can fail if `pOper` and `pRight` can consume same tokens.
|
|
* You'll have to make an {@link ahead} guard to prevent it from consuming the last token.
|
|
*
|
|
* Use {@link rightAssoc2} if the grammar has an explicit operator between values.
|
|
*
|
|
* Implementation is based on {@link ab} and {@link reduceRight}.
|
|
*
|
|
* @param pOper - A parser for each consecutive value.
|
|
* Result type is a transformation operation for the accumulator.
|
|
*
|
|
* @param pRight - A parser for the last value,
|
|
* also defines the result type (accumulator).
|
|
*/
|
|
export declare function rightAssoc1<TToken, TOptions, TRight>(pOper: Parser<TToken, TOptions, (y: TRight) => TRight>, pRight: Parser<TToken, TOptions, TRight>): Parser<TToken, TOptions, TRight>;
|
|
/**
|
|
* Make a parser that parses one value and any number of following operators and values
|
|
* to combine with the first one in left-to-right (first-to-last) order.
|
|
*
|
|
* Use {@link leftAssoc1} if the grammar doesn't have an explicit operator between values.
|
|
*
|
|
* Implementation is based on {@link chain}, {@link reduceLeft} and {@link ab}.
|
|
*
|
|
* @param pLeft - A parser for the first value,
|
|
* also defines the result type (accumulator).
|
|
*
|
|
* @param pOper - A parser for an operator function.
|
|
*
|
|
* @param pRight - A parser for each consecutive value.
|
|
*/
|
|
export declare function leftAssoc2<TToken, TOptions, TLeft, TRight>(pLeft: Parser<TToken, TOptions, TLeft>, pOper: Parser<TToken, TOptions, (x: TLeft, y: TRight) => TLeft>, pRight: Parser<TToken, TOptions, TRight>): Parser<TToken, TOptions, TLeft>;
|
|
/**
|
|
* Make a parser that parses any number of values and operators, then one extra value
|
|
* to combine in right-to-left (last-to-first) order.
|
|
*
|
|
* Use {@link rightAssoc1} if the grammar doesn't have an explicit operator between values.
|
|
*
|
|
* Implementation is based on {@link ab} and {@link reduceRight}.
|
|
*
|
|
* @param pLeft - A parser for each consecutive value.
|
|
*
|
|
* @param pOper - A parser for an operator function.
|
|
*
|
|
* @param pRight - A parser for the last value,
|
|
* also defines the result type (accumulator).
|
|
*/
|
|
export declare function rightAssoc2<TToken, TOptions, TLeft, TRight>(pLeft: Parser<TToken, TOptions, TLeft>, pOper: Parser<TToken, TOptions, (x: TLeft, y: TRight) => TRight>, pRight: Parser<TToken, TOptions, TRight>): Parser<TToken, TOptions, TRight>;
|
|
/**
|
|
* This overload makes a {@link Matcher} that chooses between two given matchers based on a condition.
|
|
* This makes possible to allow/disallow a grammar based on context/options.
|
|
*
|
|
* {@link decide} and {@link chain} allow for more complex dynamic rules.
|
|
*
|
|
* @param cond - Condition.
|
|
* @param pTrue - Matcher to run when the condition is true.
|
|
* @param pFalse - Matcher to run when the condition is false.
|
|
*/
|
|
export declare function condition<TToken, TOptions, TValueA, TValueB>(
|
|
/**
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array (before parsing).
|
|
*/
|
|
cond: (data: Data<TToken, TOptions>, i: number) => boolean, pTrue: Matcher<TToken, TOptions, TValueA>, pFalse: Matcher<TToken, TOptions, TValueB>): Matcher<TToken, TOptions, TValueA | TValueB>;
|
|
/**
|
|
* Make a parser that chooses between two given parsers based on a condition.
|
|
* This makes possible to allow/disallow a grammar based on context/options.
|
|
*
|
|
* {@link decide} and {@link chain} allow for more complex dynamic rules.
|
|
*
|
|
* @param cond - Condition.
|
|
* @param pTrue - Parser to run when the condition is true.
|
|
* @param pFalse - Parser to run when the condition is false.
|
|
*/
|
|
export declare function condition<TToken, TOptions, TValueA, TValueB>(
|
|
/**
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array (before parsing).
|
|
*/
|
|
cond: (data: Data<TToken, TOptions>, i: number) => boolean, pTrue: Parser<TToken, TOptions, TValueA>, pFalse: Parser<TToken, TOptions, TValueB>): Parser<TToken, TOptions, TValueA | TValueB>;
|
|
/**
|
|
* Make a parser that runs a given parser and then a dynamically returned parser.
|
|
*
|
|
* A nonmatch is returned if any of two parsers did not match.
|
|
*
|
|
* Compared to {@link condition} this can have any complex logic inside.
|
|
*
|
|
* {@link chain} allows to reuse the first parser.
|
|
*
|
|
* @param p - A parser that returns another parser as a value.
|
|
* If it consumes the input then the returned parser will be called with the new position.
|
|
*/
|
|
export declare function decide<TToken, TOptions, TValue>(p: Parser<TToken, TOptions, Parser<TToken, TOptions, TValue>>): Parser<TToken, TOptions, TValue>;
|
|
/**
|
|
* Make a parser that runs a given parser,
|
|
* passes the matched value into a parser-generating function
|
|
* and then runs the returned parser.
|
|
*
|
|
* A nonmatch is returned if any of two parsers did not match.
|
|
*
|
|
* Similar to {@link decide} in that it allows for complex logic.
|
|
*
|
|
* Use {@link condition} if there is no dependency on the value of the first parser.
|
|
*
|
|
* Combine with {@link chainReduce} to get a stack-safe chain of arbitrary length.
|
|
*
|
|
* @param p - A parser.
|
|
* @param f - A function that returns a parser based on the input value.
|
|
*/
|
|
export declare function chain<TToken, TOptions, TValue1, TValue2>(p: Parser<TToken, TOptions, TValue1>,
|
|
/**
|
|
* @param v1 - A value from the first parser.
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array (before the first parser matched).
|
|
* @param j - Parser position in the tokens array (after the first parser matched).
|
|
*/
|
|
f: (v1: TValue1, data: Data<TToken, TOptions>, i: number, j: number) => Parser<TToken, TOptions, TValue2>): Parser<TToken, TOptions, TValue2>;
|
|
/**
|
|
* This overload makes a {@link Matcher} that acts like a given one
|
|
* but doesn't consume input.
|
|
*
|
|
* @param p - A matcher.
|
|
*/
|
|
export declare function ahead<TToken, TOptions, TValue>(p: Matcher<TToken, TOptions, TValue>): Matcher<TToken, TOptions, TValue>;
|
|
/**
|
|
* Make a parser that acts like a given one but doesn't consume input.
|
|
*
|
|
* @param p - A parser.
|
|
*/
|
|
export declare function ahead<TToken, TOptions, TValue>(p: Parser<TToken, TOptions, TValue>): Parser<TToken, TOptions, TValue>;
|
|
export { ahead as lookAhead };
|
|
/**
|
|
* A wrapper that helps to create recursive parsers -
|
|
* allows to refer to a parser defined later in the code.
|
|
*
|
|
* Alternatively, parsers defined/wrapped as functions
|
|
* (rather than constants obtained by composition)
|
|
* don't need this.
|
|
*
|
|
* This overload is for {@link Matcher}s.
|
|
*
|
|
* @param f - A function that returns a matcher.
|
|
* @returns A parser wrapped into a function.
|
|
*/
|
|
export declare function recursive<TToken, TOptions, TValue>(f: () => Matcher<TToken, TOptions, TValue>): Matcher<TToken, TOptions, TValue>;
|
|
/**
|
|
* A wrapper that helps to create recursive parsers -
|
|
* allows to refer to a parser defined later in the code.
|
|
*
|
|
* Alternatively, parsers defined/wrapped as functions
|
|
* (rather than constants obtained by composition)
|
|
* don't need this.
|
|
*
|
|
* @param f - A function that returns a parser.
|
|
* @returns A parser wrapped into a function.
|
|
*/
|
|
export declare function recursive<TToken, TOptions, TValue>(f: () => Parser<TToken, TOptions, TValue>): Parser<TToken, TOptions, TValue>;
|
|
/**
|
|
* Parser that matches only at the beginning and doesn't consume input.
|
|
*/
|
|
export declare function start<TToken, TOptions>(data: Data<TToken, TOptions>, i: number): Result<true>;
|
|
/**
|
|
* Parser that matches only at the end of input.
|
|
*/
|
|
export declare function end<TToken, TOptions>(data: Data<TToken, TOptions>, i: number): Result<true>;
|
|
export { end as eof };
|
|
/**
|
|
* Utility function returning the number of tokens
|
|
* that are not yet parsed (current token included).
|
|
*
|
|
* Useful when creating custom base parsers.
|
|
*
|
|
* Note: Can return a negative value if the supplied position
|
|
* goes beyond the tokens array length for whatever reason.
|
|
*
|
|
* @param data - Data.
|
|
* @param i - Current position.
|
|
*
|
|
* @category Utility functions
|
|
*/
|
|
export declare function remainingTokensNumber<TToken>(data: Data<TToken, unknown>, i: number): number;
|
|
/**
|
|
* Utility function to render a given parser position
|
|
* for error reporting and debug purposes.
|
|
*
|
|
* @param data - Data object (tokens and options).
|
|
* @param i - Parser position in the tokens array.
|
|
* @param formatToken - A function to stringify a token.
|
|
* @param contextTokens - How many tokens around the current one to render.
|
|
* @returns A multiline string.
|
|
*
|
|
* @category Utility functions
|
|
*/
|
|
export declare function parserPosition<TToken>(data: Data<TToken, unknown>, i: number, formatToken: (t: TToken) => string, contextTokens?: number): string;
|
|
/**
|
|
* Utility function that provides a bit cleaner interface for running a parser.
|
|
*
|
|
* This one throws an error in case parser didn't match
|
|
* OR the match is incomplete (some part of tokens array left unparsed).
|
|
*
|
|
* @param parser - A parser to run.
|
|
* @param tokens - Input tokens.
|
|
* @param options - Parser options.
|
|
* @param formatToken - A function to stringify a token
|
|
* (Defaults to `JSON.stringify`. For incomplete match error message).
|
|
*
|
|
* @returns A matched value.
|
|
*
|
|
* @category Utility functions
|
|
*/
|
|
export declare function parse<TToken, TOptions, TValue>(parser: Parser<TToken, TOptions, TValue>, tokens: TToken[], options: TOptions, formatToken?: (t: TToken) => string): TValue;
|
|
/**
|
|
* Utility function that provides a bit cleaner interface for running a parser.
|
|
* Returns `undefined` in case parser did not match.
|
|
*
|
|
* Note: this doesn't capture errors thrown during parsing.
|
|
* Nonmatch is considered a part or normal flow.
|
|
* Errors mean unrecoverable state and it's up to client code to decide
|
|
* where to throw errors and how to get back to safe state.
|
|
*
|
|
* @param parser - A parser to run.
|
|
* @param tokens - Input tokens.
|
|
* @param options - Parser options.
|
|
* @returns A matched value or `undefined` in case of nonmatch.
|
|
*
|
|
* @category Utility functions
|
|
*/
|
|
export declare function tryParse<TToken, TOptions, TValue>(parser: Parser<TToken, TOptions, TValue>, tokens: TToken[], options: TOptions): TValue | undefined;
|
|
/**
|
|
* Utility function that provides a bit cleaner interface for running a {@link Matcher}.
|
|
*
|
|
* @param matcher - A matcher to run.
|
|
* @param tokens - Input tokens.
|
|
* @param options - Parser options.
|
|
* @returns A matched value.
|
|
*
|
|
* @category Utility functions
|
|
*/
|
|
export declare function match<TToken, TOptions, TValue>(matcher: Matcher<TToken, TOptions, TValue>, tokens: TToken[], options: TOptions): TValue;
|