Skip to content

Instantly share code, notes, and snippets.

@christianchristensen
Last active December 18, 2015 21:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save christianchristensen/5850371 to your computer and use it in GitHub Desktop.
Save christianchristensen/5850371 to your computer and use it in GitHub Desktop.
Pear FSM composer example
{
"repositories": [
{
"type": "pear",
"url": "http://pear.php.net"
}
],
"require": {
"pear-pear/FSM": "*",
"pear-pear/Image_GraphViz": "*",
"pear-pear/PEAR": "*"
}
}
<?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');
#!/bin/sh
echo "2 3 + =" | php rpn_cli.php
# Output:
# Expression:
# 5
<?php
include __DIR__ . '/rpn.php';
echo "Expression:\n";
$stdin = fopen('php://stdin', 'r');
$expression = rtrim(fgets($stdin));
$symbols = preg_split('//', $expression, -1, PREG_SPLIT_NO_EMPTY);
$fsm->processList($symbols);
<?php
include __DIR__ . '/rpn.php';
$converter = new FSM_GraphViz($fsm);
$graph = $converter->export();
// $graph->image('png'); // svg, plain, etc...
// $graph->saveParsedGraph('output.dot');
echo "https://chart.googleapis.com/chart?cht=gv&chl=" . urlencode($graph->parse());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment