Example #1
0
 /**
  * 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;
             }
         }
     }
 }