/** * Parses a parameter of a routine. * * @param string $param Parameter's definition. * * @return array */ public function getParameter($param) { $lexer = new Lexer('(' . $param . ')'); // A dummy parser is used for error reporting. $param = ParamDefFragment::parse(new Parser(), $lexer->list); if (empty($param[0])) { return array('', '', '', '', ''); } $param = $param[0]; $options = array(); foreach ($param->type->options->options as $opt) { $options[] = is_string($opt) ? $opt : $opt['value']; } return array(empty($param->inOut) ? '' : $param->inOut, $param->name, $param->type->name, implode(',', $param->type->parameters), implode(' ', $options)); }
/** * Parsing the `CREATE` statement. * * @param Parser $parser The instance that requests parsing. * @param TokensList $list The list of tokens to be parsed. * @param Token $token The token that is being parsed. * * @return void */ public function before(Parser $parser, TokensList $list, Token $token) { ++$list->idx; $this->name = CreateDefFragment::parse($parser, $list); if ($this->options->has('TABLE')) { ++$list->idx; $this->fields = FieldDefFragment::parse($parser, $list); ++$list->idx; $this->entityOptions = OptionsFragment::parse($parser, $list, CreateDefFragment::$TABLE_OPTIONS); } elseif ($this->options->has('PROCEDURE') || $this->options->has('FUNCTION')) { ++$list->idx; $this->parameters = ParamDefFragment::parse($parser, $list); if ($this->options->has('FUNCTION')) { $token = $list->getNextOfType(Token::TYPE_KEYWORD); if ($token->value !== 'RETURNS') { $parser->error('\'RETURNS\' keyword was expected.', $token); } else { ++$list->idx; $this->return = DataTypeFragment::parse($parser, $list); } } ++$list->idx; $this->entityOptions = OptionsFragment::parse($parser, $list, CreateDefFragment::$FUNC_OPTIONS); ++$list->idx; $this->body = array(); for (; $list->idx < $list->count; ++$list->idx) { $token = $list->tokens[$list->idx]; $this->body[] = $token; if ($token->type === Token::TYPE_KEYWORD && $token->value === 'END') { break; } } } }