/** * 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 = { /** 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 = { 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 = Match | 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 = (data: Data, i: number) => Result; /** * 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 = (data: Data, i: number) => Match; /** * 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(value: TValue): Matcher; 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( /** * @param data - Data object (tokens and options). * @param i - Parser position in the tokens array. */ f: (data: Data, i: number) => TValue): Matcher; /** * 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( /** * @param data - Data object (tokens and options). * @param i - Parser position in the tokens array. */ f: (data: Data, i: number) => void): Matcher; /** * 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(data: Data, 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(message: string | ((data: Data, i: number) => string)): Matcher; /** * 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( /** * @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, 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, i: number) => void): Parser; /** * 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(data: Data, i: number): Result; /** * 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( /** * @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, i: number) => boolean): Parser; /** * 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(p: Matcher, /** * @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, i: number, j: number) => TValue2): Matcher; /** * 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(p: Parser, /** * @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, i: number, j: number) => TValue2): Parser; /** * 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(p: Parser, /** * @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, data: Data, i: number) => Result): Parser; /** * 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(p: Matcher, /** * @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, data: Data, i: number) => void): Matcher; /** * 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(p: Parser, /** * @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, data: Data, i: number) => void): Parser; /** * 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(p: Parser, def: TValue): Matcher; /** * 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(p: Parser): Parser; /** * 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(...ps: [...Parser[], Matcher]): Matcher; /** * 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(...ps: Parser[]): Parser; 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(pa: Parser, pb: Matcher): Matcher; /** * 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(pa: Parser, pb: Parser): Parser; 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(...ps: Parser[]): Parser; /** * 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(p: Parser, /** * @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, i: number, j: number) => boolean): Matcher; /** * 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(p: Parser, /** * @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, i: number, j: number) => boolean): Matcher; /** * 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(pValue: Parser, pTest: Parser): Matcher; /** * 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(pValue: Parser, pTest: Parser): Matcher; /** * 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(p: Parser): Matcher; /** * 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(p: Parser): Parser; 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(pa: Matcher, pb: Matcher, /** * @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, i: number, j: number) => TValue): Matcher; /** * 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(pa: Parser, pb: Parser, /** * @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, i: number, j: number) => TValue): Parser; /** * 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(pa: Matcher, pb: Matcher): Matcher; /** * 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(pa: Parser, pb: Parser): Parser; /** * 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(pa: Matcher, pb: Matcher): Matcher; /** * 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(pa: Parser, pb: Parser): Parser; /** * 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(pa: Matcher, pb: Matcher, pc: Matcher, /** * @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, i: number, j: number) => TValue): Matcher; /** * 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(pa: Parser, pb: Parser, pc: Parser, /** * @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, i: number, j: number) => TValue): Parser; /** * 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(pa: Matcher, pb: Matcher, pc: Matcher): Matcher; /** * 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(pa: Parser, pb: Parser, pc: Parser): Parser; /** * 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(...ps: Matcher[]): Matcher; /** * 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(...ps: Parser[]): Parser; 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(...ps: Matcher[]): Matcher; /** * 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(...ps: Parser[]): Parser; 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(...ps: Matcher[]): Matcher; /** * 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(...ps: Parser[]): Parser; /** * 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(p: Matcher): Matcher; /** * 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(p: Parser): Parser; /** * 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(pValue: Parser, pSep: Parser): Parser; /** * 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(pValue: Parser, pSep: Parser): Matcher; /** * 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(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, i: number) => Parser): Matcher; /** * 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(acc: TAcc, p: Parser, /** * @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, i: number, j: number) => TAcc): Matcher; /** * 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(p: Parser, 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, i: number, j: number) => TAcc): Matcher; /** * 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(pLeft: Parser, pOper: Parser TLeft>): Parser; /** * 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(pOper: Parser TRight>, pRight: Parser): Parser; /** * 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(pLeft: Parser, pOper: Parser TLeft>, pRight: Parser): Parser; /** * 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(pLeft: Parser, pOper: Parser TRight>, pRight: Parser): Parser; /** * 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( /** * @param data - Data object (tokens and options). * @param i - Parser position in the tokens array (before parsing). */ cond: (data: Data, i: number) => boolean, pTrue: Matcher, pFalse: Matcher): Matcher; /** * 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( /** * @param data - Data object (tokens and options). * @param i - Parser position in the tokens array (before parsing). */ cond: (data: Data, i: number) => boolean, pTrue: Parser, pFalse: Parser): Parser; /** * 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(p: Parser>): Parser; /** * 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(p: Parser, /** * @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, i: number, j: number) => Parser): Parser; /** * 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(p: Matcher): Matcher; /** * Make a parser that acts like a given one but doesn't consume input. * * @param p - A parser. */ export declare function ahead(p: Parser): Parser; 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(f: () => Matcher): Matcher; /** * 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(f: () => Parser): Parser; /** * Parser that matches only at the beginning and doesn't consume input. */ export declare function start(data: Data, i: number): Result; /** * Parser that matches only at the end of input. */ export declare function end(data: Data, i: number): Result; 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(data: Data, 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(data: Data, 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(parser: Parser, 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(parser: Parser, 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(matcher: Matcher, tokens: TToken[], options: TOptions): TValue;