Phunkie:PHP中的解析器组合(第1部分) >该教程改编自Inviqa博客,演示了如何使用PHP的Phunkie功能库来创建Parser Compinators。 我们将重点介绍核心概念并建立基本的解析器,为更高级的组合者在随后的一部分中奠定了基础。
为什么要为解析器进行功能编程?>
功能编程及其重点是纯粹的功能和合成性,非常适合构建可靠和可维护的解析器。 将较小,定义明确的解析功能结合到较大,更复杂的能力是一个关键优势。
Phunkie库提供了必要的功能结构,以简化此过程。
解析是识别字符串中短语的过程。 我们将使用递归的解析,这是一种简单而功能强大的技术。 组合器:组成功率 组合器是可重复使用的模式,用于组合功能。 在功能编程中,它们是从更简单组件中构建复杂系统的基础。 我们将实现解析器作为函数,并使用组合器将它们组合在一起。 的解析器
类型来表示此结果:一对包含匹配部分和剩余的字符串。 要处理多个可能的匹配,我们将使用 >
原始解析器
,输入字符串不变。
和 更优雅的
Pair
ImmList
Parser
<code class="language-php">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); }
}</code>
:始终失败,返回一个空列表。
)是单调模式的关键组成部分。 它允许链接计算,处理一个解析器的结果并将其传递到下一个。
result(string $a)
$a
<code class="language-php">function result(string $a): Parser {
return new Parser(fn(string $s) => ImmList(Pair($a, $s)));
}</code>
zero()
>解析器组合:<code class="language-php">function zero(): Parser {
return new Parser(fn($s) => Nil());
}</code>
item()
方法<code class="language-php">function item(): Parser {
return new Parser(fn(string $s) => strlen($s) == 0 ? Nil() : ImmList(Pair($s[0], substr($s, 1))));
}</code>
seq
seq
seq
>使用flatMap
和map
:<code class="language-php">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); }
}</code>
或使用Phunkie的理解(0.6.0及以后):<code class="language-php">function result(string $a): Parser {
return new Parser(fn(string $s) => ImmList(Pair($a, $s)));
}</code>
以上是使用Phunkie的功能编程:PHP中的解析器组合器的详细内容。更多信息请关注PHP中文网其他相关文章!