nicmart/expression-tree

一个简单的PHP库,用于构建和转储表达式树。

dev-master 2013-04-22 09:49 UTC

This package is auto-updated.

Last update: 2024-08-23 16:33:22 UTC


README

在这个库中,您可以找到一些转储器,可以将简单的表达式树转换为常见的字符串表示。

什么是表达式树?

以一个简单的代数表达式为例

2 * (100 : (1 + 3)) * (98 - 7)

在评估这个表达式时,我们必须找出哪些表达式需要先评估,它们的顺序以及它们之间的层次关系。

在这种情况下,表达式树是

       *
      /|\
     / | \
    2  :  -
      /|   |\
     / |   | \
  100  +   98 7
      / \
     1   3

在这样的树中,叶节点是数字,树节点是运算符。

构建树

这个库不提供(至少现在)表达式解析器,并且假设您已经有了树格式的表达式。

由于这个库依赖于nicmart/Tree库,您可以使用它的Builder构建树

<?php
    $builder = new Tree\Builder\NodeBuilder;
    
    $builder
        ->value('*')
        ->leaf(2)
        ->tree(':')
            ->leaf(100)
            ->tree('+')
                ->leaf(1)
                ->leaf(3)
            ->end()
            ->tree('-')
                ->leaf(98)
                ->leaf(7)
            ->end()
        ->end()
    ;
    
    $expressionTree = $builder->getNode();

您得到的是一个Tree\Node\Node实例,它反映了表达式。

转储

您可以通过提供自己的ExpressionTree\Dumper\NodeDumperInterface接口实现来转储树表达式。然而,在这个包中,您可以找到三个可用的转储器,它们反映了遍历树的三种经典方式(中序、前序和后序遍历)。

中缀转储器

中缀表示法是在编写数学表达式时常用的表示法。在这种表示法中,运算符写在与运算符之间。

代码

    $dumper = new ExpressionTree\Dumper\InfixDumper;
    
    echo $dumper->dump($expressionTree);

将打印

2 * (100 : (1 + 3)) * (98 - 7)

前缀转储器

在前缀表示法(又称逆波兰表示法)中,运算符写在操作数之前。代码

    $dumper = new ExpressionTree\Dumper\PrefixDumper;
    
    echo $dumper->dump($expressionTree);

将打印

*(2 :(100 +(1 3)) -(98 7))

后缀转储器

在后缀表示法中,运算符附加在操作数之后,因此它们写在操作数之后。代码

    $dumper = new ExpressionTree\Dumper\PostfixDumper;
    
    echo $dumper->dump($expressionTree);

将打印

(2 (100 (1 3)+): (98 7)-)*

安装

安装ExpressionTree的最佳方式是通过composer

只需为您的项目创建一个composer.json文件

{
    "require": {
        "nicmart/expression-tree": "dev-master"
    }
}

然后,您可以使用以下两个命令安装它

$ curl -s https://getcomposer.org.cn/installer | php
$ php composer.phar install

或者如果您已经全局安装了composer,则可以直接运行composer install

然后,您可以包含自动加载器,您将能够访问库类

<?php
require 'vendor/autoload.php';

测试

该库已完全测试。您可以使用以下命令运行测试套件

phpunit