Referencia rápida

Chuleta de Parser Combinators con Parsimmon

Guía rápida de Parsimmon: librería de parser combinators para JavaScript, analizadores atómicos, secuenciación, alternativas y mapeo.

· Publicado

Parsimmon es una librería de combinadores de analizadores sintácticos elegante y ligera para JavaScript y Node.js.

Ejemplo básico

const P = require('parsimmon');

// Crear analizador que coincida con letras minúsculas
const word = P.regexp(/[a-z]+/);

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

Analizadores atómicos

P.string('function');   // Cadena literal exacta
P.regexp(/[0-9]+/);     // Coincidencia con expresión regular
P.oneOf('abc');         // Carácter individual 'a', 'b' o 'c'
P.whitespace;           // Uno o más espacios en blanco
P.optWhitespace;        // Cero o más espacios en blanco
P.eof;                  // Fin del flujo de entrada (EOF)

Combinadores

// Secuencia: coincide con todos en orden exacto
P.seq(P.string('('), P.number, P.string(')'));

// Alternativas: coincide con el primer analizador que tenga éxito
P.alt(P.string('true'), P.string('false'));
// o usando .or():
a.or(b);

// Listas delimitadas o separadas
P.sepBy(P.number, P.string(','));  // Números separados por comas (cero o más)
P.sepBy1(P.number, P.string(',')); // Números separados por comas (al menos uno)

// Repetición
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

// Descartar tokens
a.skip(P.string(';')); // Analiza 'a', coincide con ';', devuelve sólo 'a'

Transformación de salida (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');

Referencias

Temas relacionados