Szybka pomoc

Ściągawka z parserów kombinatorowych Parsimmon

Szybki przewodnik po Parsimmon: biblioteka parser combinator dla JavaScript, parsery atomowe, sekwencje, alternatywy i transformacje.

· Opublikowano

Parsimmon to zwięzła i elegancka biblioteka kombinatorów parserów dla JavaScript i Node.js.

Podstawowy przykład

const P = require('parsimmon');

// Tworzy parser pasujący do małych liter
const word = P.regexp(/[a-z]+/);

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

Parsery atomowe

P.string('function');   // Dokładny literał tekstowy
P.regexp(/[0-9]+/);     // Wyrażenie regularne
P.oneOf('abc');         // Pojedynczy znak 'a', 'b' lub 'c'
P.whitespace;           // Co najmniej jeden biały znak
P.optWhitespace;        // Zero lub więcej białych znaków
P.eof;                  // Koniec strumienia wejściowego (EOF)

Kombinatory

// Sekwencja: dopasowuje wszystkie parsery w podanej kolejności
P.seq(P.string('('), P.number, P.string(')'));

// Alternatywy: dopasowuje pierwszy udany parser
P.alt(P.string('true'), P.string('false'));
// lub z użyciem .or():
a.or(b);

// Listy z separatorami
P.sepBy(P.number, P.string(','));  // Liczby rozdzielone przecinkami (zero lub więcej)
P.sepBy1(P.number, P.string(',')); // Liczby rozdzielone przecinkami (co najmniej jedna)

// Powtórzenia
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

// Odrzucanie tokenów
a.skip(P.string(';')); // Parsuje 'a', dopasowuje ';', zwraca wyłącznie 'a'

Transformacja danych wyjściowych (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');

Źródła i dokumentacja

Powiązane tematy