/** * Handle the run shell action * @return ShellResult */ public function doShell() { // $shell is derived from RunResult $shell = new Shell(); while (!$shell->isEOF()) { if ($shell->isFail()) { break; } $input = $shell->readInput(); if ($input === FALSE) { break; } // Available shell commands (for help sreen) $shell_commands = array('dump', 'exit', 'help'); // Interpret shell keywords switch ($input) { case 'exit': break 2; case 'dump': $this->stdout(print_r($this->getMemory()->getData(), true)); break; case 'help': $extension_manager = $this->getExtensionManager(); $exports = $extension_manager->exports(); $this->stdout(PHP_EOL); $this->stdout(str_pad(' Commands:', 13) . join(', ', $shell_commands) . PHP_EOL); $this->stdout(str_pad(' Keywords:', 13) . join(', ', $this->getLanguageKeywords()) . PHP_EOL); $this->stdout(str_pad(' Functions:', 13) . join(', ', $exports) . PHP_EOL); $this->stdout(PHP_EOL); break; default: // Assume is code $this->setCode($input); $result = $this->doRun(); // TODO: Finished this // dd($result); // $this->stdout() // Handle printing errors if ($result->isFail()) { foreach ($result->getErrors() as $error) { $this->stderr($this->outputFormatErrorMessage($error)); } } break; } // TODO: Provide interface for setting position :/ $this->line++; $this->column = 0; } $shell->setData($this->getMemory()->getData()); return $shell; }