Phunkie:PHPのパーサーコンビネーターの構築(パート1)
Inviqaブログから編集されたこのチュートリアルは、PHPのPhunkie機能ライブラリを使用してパーサーコンビネーターを作成する方法を示しています。 コアの概念に焦点を当て、基本的なパーサーを構築し、より高度なコンビネーターの段階を後続の部分に設定します。
機能プログラミングは、純粋な機能と複合性に重点を置いており、堅牢で保守可能なパーサーの構築に理想的に適しています。 小さく、明確に定義された解析機能をより大きく、より複雑なものに組み合わせる能力が重要な利点です。
Phunkieライブラリは、このプロセスをPHPで簡素化するために必要な機能構造を提供します。
パーサーの理解解析は、文字列内のフレーズを認識するプロセスです。 再帰的なデセント解析、簡単でありながら強力なテクニックを使用します
組み合わせ:組成能力
組み合わせは、機能を構成するための再利用可能なパターンです。 機能プログラミングでは、よりシンプルなコンポーネントから複雑なシステムを構築するための基本です。 パーサーを関数として実装し、コンビネーターを使用してそれらを結合します。 タイプのパーサーを表す
パーサーは入力として文字列を取り、文法の定義と一致させようとします。 その結果、残りの文字列との一致が成功するか、障害が発生します。 Phunkieの
タイプを使用して、この結果を表します。一致した部分と残りの文字列を含むペア。 複数の試合を処理するために、
(不変リスト)を使用します。php
のタイプ
Pair
プリミティブパーサーImmList
Parser
use Phunkie\Types\Pair; use Phunkie\Types\ImmList; class Parser { private $run; public function __construct(callable $run) { $this->run = $run; } public function run(string $toParse): ImmList { return ($this->run)($toParse); } }
:常に失敗し、空のリストを返します。result(string $a)
$a
function result(string $a): Parser { return new Parser(fn(string $s) => ImmList(Pair($a, $s))); }
zero()
function zero(): Parser { return new Parser(fn($s) => Nil()); }
item()
function item(): Parser { return new Parser(fn(string $s) => strlen($s) == 0 ? Nil() : ImmList(Pair($s[0], substr($s, 1)))); }
seq
メソッド(
seq
およびflatMap
seq
およびflatMap
:map
を使用した、よりエレガントな
use Phunkie\Types\Pair; use Phunkie\Types\ImmList; class Parser { private $run; public function __construct(callable $run) { $this->run = $run; } public function run(string $toParse): ImmList { return ($this->run)($toParse); } }
または、フィーリングのためにPhunkieを使用して(0.6.0以降):
function result(string $a): Parser { return new Parser(fn(string $s) => ImmList(Pair($a, $s))); }
これでパート1を終了します。パート2では、より高度なコンビネーターと解析戦略を調査します。
以上がPHPのパーサーコンビネーターを使用した機能プログラミングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。