tarsec 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -142,12 +142,22 @@ export declare function between<O, C, P>(open: Parser<O>, close: Parser<C>, pars
142
142
  export declare function between1<O, C, P>(open: Parser<O>, close: Parser<C>, parser: Parser<P>): Parser<P[]>;
143
143
  /**
144
144
  * Parses many instances of the parser separated by separator.
145
- * The parser needs to succeed at least once, otherwise sepBy fails.
145
+ * The parser will succeed even if it consumes zero instances.
146
+ * To require at least one instance, use `sepBy1`.
146
147
  * @param separator
147
148
  * @param parser
148
149
  * @returns a parser that runs the given parser zero to many times, separated by the separator parser.
149
150
  */
150
151
  export declare function sepBy<S, P>(separator: Parser<S>, parser: Parser<P>): Parser<P[]>;
152
+ /**
153
+ * Parses many instances of the parser separated by separator.
154
+ * The parser needs to succeed at least once, otherwise sepBy fails.
155
+ * To not require at least one instance, use `sepBy`.
156
+ * @param separator
157
+ * @param parser
158
+ * @returns a parser that runs the given parser one to many times, separated by the separator parser.
159
+ */
160
+ export declare function sepBy1<S, P>(separator: Parser<S>, parser: Parser<P>): Parser<P[]>;
151
161
  /**
152
162
  * Convenience function to use as the second argument to `seq` to get all the results from `seq`
153
163
  * @param results
@@ -300,7 +300,8 @@ export function between1(open, close, parser) {
300
300
  }
301
301
  /**
302
302
  * Parses many instances of the parser separated by separator.
303
- * The parser needs to succeed at least once, otherwise sepBy fails.
303
+ * The parser will succeed even if it consumes zero instances.
304
+ * To require at least one instance, use `sepBy1`.
304
305
  * @param separator
305
306
  * @param parser
306
307
  * @returns a parser that runs the given parser zero to many times, separated by the separator parser.
@@ -312,28 +313,37 @@ export function sepBy(separator, parser) {
312
313
  while (true) {
313
314
  const result = parser(rest);
314
315
  if (!result.success) {
315
- if (results.length === 0) {
316
- return failure(result.message, input);
317
- }
318
- else {
319
- return success(results, rest);
320
- }
316
+ return success(results, rest);
321
317
  }
322
318
  results.push(result.result);
323
319
  rest = result.rest;
324
320
  const sepResult = separator(rest);
325
321
  if (!sepResult.success) {
326
- if (results.length === 0) {
327
- return failure(sepResult.message, input);
328
- }
329
- else {
330
- return success(results, rest);
331
- }
322
+ return success(results, rest);
332
323
  }
333
324
  rest = sepResult.rest;
334
325
  }
335
326
  };
336
327
  }
328
+ /**
329
+ * Parses many instances of the parser separated by separator.
330
+ * The parser needs to succeed at least once, otherwise sepBy fails.
331
+ * To not require at least one instance, use `sepBy`.
332
+ * @param separator
333
+ * @param parser
334
+ * @returns a parser that runs the given parser one to many times, separated by the separator parser.
335
+ */
336
+ export function sepBy1(separator, parser) {
337
+ return (input) => {
338
+ const result = sepBy(separator, parser)(input);
339
+ if (result.success) {
340
+ if (result.result.length === 0) {
341
+ return failure("expected at least one match", input);
342
+ }
343
+ }
344
+ return result;
345
+ };
346
+ }
337
347
  /**
338
348
  * Convenience function to use as the second argument to `seq` to get all the results from `seq`
339
349
  * @param results
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tarsec",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "A parser combinator library for TypeScript, inspired by Parsec.",
5
5
  "homepage": "https://github.com/egonSchiele/tarsec",
6
6
  "scripts": {