it.xnews.jp
生成: 2026-10-18 読了 約 2 分 model: claude-haiku-5-5 原文: https://t3.at/blog/2026-10-17-parser-combinators/ raw.md

パーサーコンビネータの仕組み:小さな解析関数を組み合わせて文字列を解析する

パーサーコンビネータは、入力文字列から値と残りの文字列を返す小さなパーサー関数を組み合わせて、文字列を解析する手法である。記事はTypeScript風の型定義と具体例を用いて、その仕組みを説明している。

本記事は、パーサーコンビネータを、pHello、pInteger、pIgnoreWhitespace、pSeq、pMapといった小さく組み合わせ可能なパーサー関数から文字列パーサーを構築する手法として解説する。パーサーの型は「入力文字列を受け取り、解析された値と残りの文字列のペアを返す関数」として定義されている。

Parser型と基本的な例

記事では、Parser of Tの型を、入力文字列から、Tの値と残りの文字列のペアを返す関数として定義している。

例えば、pIntegerに「10 20 30」を与えると、「10」の後で入力が切り分けられ、数値の10と残りの文字列「 20 30」が返される。

組み合わせによる解析と構造化

「Hello 100」の解析では、pHello、pIgnoreWhitespace、pIntegerを順に適用し、各パーサーが前のパーサーの残りの文字列を受け取る。pHelloは「Hello」と「 100」を返し、pIgnoreWhitespaceは「 」と「100」を返す。最後にpIntegerが「100」と空の文字列を返す。

pSeqにpHello、pIgnoreWhitespace、pIntegerを渡すと、その結果は[string, null, number]のタプルを値とするParserになる。

「Hello, world!」の文字列は、greetingが「Hello」、whoが「world」であるオブジェクトに解析される。また、「Hello 100」をpGreetingで解析すると、「Hello 100」と空の文字列が返される。記事は末尾で、foldとunfoldの例も簡単に扱っている。

pingの出力サンプルの解析

記事は1.1.1.1に対するping出力のサンプルも扱い、その内容をJSON表現に解析した例を示している。

統計情報では、送信が8パケット、受信が7パケット、パケットロスが12.5%、合計テスト時間が7008msと示されている。往復時間は、最小が47.129ms、平均が115.880ms、最大が388.750ms、mdevが112.515msである。

この記事は元記事の事実のみに基づいて自動生成されました。

出典

この記事をシェア