クイックリファレンス

Parsimmon パーサーコンビネータ チートシート

Parsimmon のクイックリファレンス:JavaScript 向けパーサーコンビネータライブラリ、アトミックパーサー、順序付け、代替、セパレータ、マッピング処理。

· 公開日

Parsimmon は、JavaScript および Node.js 向けのエレガントで軽量なパーサーコンビネータライブラリです。

基本的な使用例

const P = require('parsimmon');

// 1文字以上の小文字英字に一致するパーサーを作成
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' のいずれか1文字に一致
P.whitespace;           // 1文字以上の空白文字
P.optWhitespace;        // 0文字以上の空白文字(省略可能)
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(','));  // カンマ区切りの数値(0個以上)
P.sepBy1(P.number, P.string(',')); // カンマ区切りの数値(1個以上)

// 繰り返し
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');

参考リンク

関連テーマ