Parsimmon Parser Combinator Library

1.18.1 · active · verified Tue Apr 21

Parsimmon is a compact, monadic LL(infinity) parser combinator library for JavaScript, enabling the construction of complex parsers from smaller, composable units. It is currently at version 1.18.1 and supports both modern Node.js environments and older browser versions (down to IE7). Its release cadence appears to be infrequent, with the last major feature release (1.7.0) being in 2018, though bug fixes and minor updates have occurred more recently. Key differentiators include its inspiration from Haskell's Parsec and Promises/A+ for its API design, its support for binary parsing using Node.js Buffers, and its compatibility with the Fantasy Land specification, implementing several algebraic structures like Semigroup, Apply, Applicative, Functor, Chain, and Monad. It distinguishes itself by offering a functional and declarative approach to parsing, making grammars easy to read and maintain.

Common errors

Warnings

Install

Imports

Quickstart

Demonstrates defining basic parsers for digits and operators, combining them to parse arithmetic expressions and comma-separated lists, and handling parse results.

import Parsimmon from 'parsimmon';

// Define basic parsers
const digit = Parsimmon.regexp(/[0-9]/);
const plus = Parsimmon.string('+');
const minus = Parsimmon.string('-');

// Combine parsers to recognize an integer (one or more digits)
const integer = digit.atLeast(1).map(digits => parseInt(digits.join(''), 10));

// Combine parsers to recognize an operator
const operator = plus.or(minus);

// Define a parser for a simple arithmetic expression like '123+45'
const expression = Parsimmon.seq(integer, operator, integer).map(
  ([left, op, right]) => {
    if (op === '+') return left + right;
    if (op === '-') return left - right;
    return NaN; // Should not happen with defined operators
  }
);

// Parse some input strings
const result1 = expression.parse('123+45');
const result2 = expression.parse('99-10');
const result3 = expression.parse('5*2'); // Will fail

console.log('Result for "123+45":', result1);
console.log('Result for "99-10":', result2);
console.log('Result for "5*2" (expected failure):', result3);

// Example of parsing a more complex structure (e.g., a comma-separated list of numbers)
const comma = Parsimmon.string(',');
const listOfNumbers = integer.sepBy(comma).map(nums => nums.join(', '));
const listResult = listOfNumbers.parse('1,2,3,4,5');
console.log('List of numbers for "1,2,3,4,5":', listResult);

view raw JSON →