|
<?php |
|
|
|
// https://github.com/pear/FSM/blob/master/examples/rpn.php |
|
require_once __DIR__ . '/vendor/autoload.php'; |
|
|
|
function BeginBuildNumber($symbol, $payload) |
|
{ |
|
array_push($payload, $symbol); |
|
} |
|
|
|
function BuildNumber($symbol, $payload) |
|
{ |
|
$n = array_pop($payload); |
|
$n = $n . $symbol; |
|
array_push($payload, $n); |
|
} |
|
|
|
function EndBuildNumber($symbol, $payload) |
|
{ |
|
$n = array_pop($payload); |
|
array_push($payload, (int)$n); |
|
} |
|
|
|
function DoOperator($symbol, $payload) |
|
{ |
|
$ar = array_pop($payload); |
|
$al = array_pop($payload); |
|
|
|
if ($symbol == '+') { |
|
array_push($payload, $al + $ar); |
|
} elseif ($symbol == '-') { |
|
array_push($payload, $al - $ar); |
|
} elseif ($symbol == '*') { |
|
array_push($payload, $al * $ar); |
|
} elseif ($symbol == '/') { |
|
array_push($payload, $al / $ar); |
|
} |
|
} |
|
|
|
function DoEqual($symbol, $payload) |
|
{ |
|
echo array_pop($payload) . "\n"; |
|
} |
|
|
|
function Error($symbol, $payload) |
|
{ |
|
echo "This does not compute: $symbol\n"; |
|
} |
|
|
|
$stack = array(); |
|
|
|
$fsm = new FSM('INIT', $stack); |
|
$fsm->setDefaultTransition('INIT', 'Error'); |
|
|
|
$fsm->addTransitionAny('INIT', 'INIT'); |
|
$fsm->addTransition('=', 'INIT', 'INIT', 'DoEqual'); |
|
$fsm->addTransitions(range(0,9), 'INIT', 'BUILDING_NUMBER', 'BeginBuildNumber'); |
|
$fsm->addTransitions(range(0,9), 'BUILDING_NUMBER', 'BUILDING_NUMBER', 'BuildNumber'); |
|
$fsm->addTransition(' ', 'BUILDING_NUMBER', 'INIT', 'EndBuildNumber'); |
|
$fsm->addTransitions(array('+','-','*','/'), 'INIT', 'INIT', 'DoOperator'); |
|
|