getOption($v)) { switch ($c) { case 'h': case '?': return $this->usage(); case '__ambiguous': $this->resolveOptionAmbiguity($v); break; } } $this->parser->listInputs($expression); $compiler = Compiler\Llk::load( new File\Read('hoa://Library/Math/Arithmetic.pp') ); $visitor = new Math\Visitor\Arithmetic(); $dump = new Compiler\Visitor\Dump(); if (null !== $expression) { $ast = $compiler->parse($expression); echo $expression . ' = ' . $visitor->visit($ast), "\n"; return; } $readline = new Console\Readline(); $readline->setAutocompleter( new Console\Readline\Autocompleter\Word( array_merge( array_keys($visitor->getConstants()->getArrayCopy()), array_keys($visitor->getFunctions()->getArrayCopy()) ) ) ); $handle = null; $expression = 'h'; do { switch ($expression) { case 'h': case 'help': echo 'Usage:', "\n", ' h[elp] to print this help;', "\n", ' c[onstants] to print available constants;', "\n", ' f[unctions] to print available functions;', "\n", ' e[xpression] to print the current expression;', "\n", ' d[ump] to dump the tree of the expression;', "\n", ' q[uit] to quit.', "\n"; break; case 'c': case 'constants': echo implode( ', ', array_keys( $visitor->getConstants()->getArrayCopy() ) ), "\n"; break; case 'f': case 'functions': echo implode( ', ', array_keys( $visitor->getFunctions()->getArrayCopy() ) ), "\n"; break; case 'e': case 'expression': echo $handle, "\n"; break; case 'd': case 'dump': if (null === $handle) { echo 'Type a valid expression before (“> 39 + 3”).', "\n"; } else { echo $dump->visit($compiler->parse($handle)), "\n"; } break; case 'q': case 'quit': break 2; default: if (null === $expression) { break; } try { echo $visitor->visit($compiler->parse($expression)), "\n"; } catch (Compiler\Exception $e) { echo $e->getMessage(), "\n"; break; } $handle = $expression; break; } } while (false !== $expression = $readline->readLine('> ')); return; } /** * The command usage. * * @return int */ public function usage() { echo 'Usage : math:calc [expression]', "\n", 'Options :', "\n", $this->makeUsageOptionsList([ 'help' => 'This help.' ]), "\n"; return; } } __halt_compiler(); A simple calculator.