Parsimmon هي مكتبة مجمعات تحليل لغوي (Parser Combinator) صغيرة وأنيقة لجافا سكريبت وبيئة Node.js.
مثال أساسي
const P = require('parsimmon');
// إنشاء محلل يطابق حرفاً أو أكثر من الأحرف الصغيرة
const word = P.regexp(/[a-z]+/);
const result = word.parse('hello');
// => { status: true, value: 'hello' }
المحللات الذرية (Atomic Parsers)
P.string('function'); // نص صريح ومطابق تماماً
P.regexp(/[0-9]+/); // مطابقة عبر التعبيرات النمطية Regular Expression
P.oneOf('abc'); // حرف واحد يطابق أي من "a" أو "b" أو "c"
P.whitespace; // مسافة بيضاء واحدة أو أكثر
P.optWhitespace; // صفر أو أكثر من المسافات البيضاء
P.eof; // نهاية دفق الإدخال (EOF)
المجمعات (Combinators)
// تسلسل: يطابق جميع المحللات بالترتيب الصارم
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');