Краткий справочник

Шпаргалка по комбинаторам парсеров Parsimmon

Краткое руководство по Parsimmon: библиотека комбинаторов парсеров для JavaScript, атомарные парсеры, последовательности и отображения.

· Опубликовано

Parsimmon — элегантная библиотека комбинаторов парсеров для JavaScript и Node.js.

Базовый пример

const P = require('parsimmon');

// Создание парсера для строчных букв
const word = P.regexp(/[a-z]+/);

const result = word.parse('hello');
// => { status: true, value: 'hello' }

Атомарные парсеры

P.string('function');   // Точный строковый литерал
P.regexp(/[0-9]+/);     // Регулярное выражение
P.oneOf('abc');         // Один символ из 'a', 'b' или 'c'
P.whitespace;           // Один или несколько пробельных символов
P.optWhitespace;        // Ноль или более пробельных символов
P.eof;                  // Конец входного потока (EOF)

Комбинаторы

// Последовательность: сопоставляет все парсеры в точном порядке
P.seq(P.string('('), P.number, P.string(')'));

// Альтернативы: выбирает первый успешный парсер
P.alt(P.string('true'), P.string('false'));
// или с использованием .or():
a.or(b);

// Списки с разделителями
P.sepBy(P.number, P.string(','));  // Числа, разделенные запятыми (ноль или более)
P.sepBy1(P.number, P.string(',')); // Числа, разделенные запятыми (минимум одно)

// Повторения
a.many();        // 0 or more
a.atLeast(1);    // 1 or more
a.times(3);      // Exactly 3 times
a.times(1, 4);   // Between 1 and 4 times

// Игнорирование токенов
a.skip(P.string(';')); // Парсит 'a', сопоставляет ';', возвращает только 'a'

Трансформация вывода (map)

const arithmeticExpr = P.seq(
  P.digits.map(Number),
  P.oneOf('+-*/').trim(P.optWhitespace),
  P.digits.map(Number)
).map(([left, operator, right]) => ({
  type: 'BinaryExpression',
  operator,
  left,
  right
}));

arithmeticExpr.parse('10 + 20');

Ссылки и документация

Связанные темы