Parsimmon è una libreria di parser combinator per JavaScript e Node.js elegante e minimale.
Esempio di base
const P = require('parsimmon');
// Crea un parser per lettere minuscole
const word = P.regexp(/[a-z]+/);
const result = word.parse('hello');
// => { status: true, value: 'hello' }
Parser atomici
P.string('function'); // Stringa letterale esatta
P.regexp(/[0-9]+/); // Espressione regolare
P.oneOf('abc'); // Singolo carattere 'a', 'b' o 'c'
P.whitespace; // Uno o più spazi bianchi
P.optWhitespace; // Zero o più spazi bianchi
P.eof; // Fine dello stream di input (EOF)
Combinatori
// Sequenza: analizza in ordine esatto
P.seq(P.string('('), P.number, P.string(')'));
// Alternative: seleziona il primo parser riuscito
P.alt(P.string('true'), P.string('false'));
// o usando .or():
a.or(b);
// Liste con separatore
P.sepBy(P.number, P.string(',')); // Numeri separati da virgola (zero o più)
P.sepBy1(P.number, P.string(',')); // Numeri separati da virgola (almeno uno)
// Ripetizioni
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
// Scartare token
a.skip(P.string(';')); // Analizza 'a', matcha ';', restituisce solo 'a'
Trasformare l output (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');