private function _declare() {
    $node = new DeclareNode();
    $this->mustMatch(T_DECLARE, $node);
    $this->mustMatch('(', $node, 'openParen');
    $directives = new CommaListNode();
    $node->addChild($directives, 'directives');
    if (!$this->tryMatch(')', $node, 'closeParen', FALSE, TRUE)) {
      do {
        $declare_directive = new DeclareDirectiveNode();
        $this->tryMatch(T_STRING, $declare_directive, 'name');
        if ($this->tryMatch('=', $declare_directive)) {
          $declare_directive->addChild($this->staticScalar(), 'value');
        }
        $directives->addChild($declare_directive);
      } while ($this->tryMatch(',', $directives));
      $this->mustMatch(')', $node, 'closeParen', FALSE, TRUE);
    }
    if ($this->tryMatch(':', $node, NULL, FALSE, TRUE)) {
      $node->addChild($this->innerStatementListNode(T_ENDDECLARE), 'body');
      $this->mustMatch(T_ENDDECLARE, $node);
      $this->endStatement($node);
      return $node;
    }
    else {
      $node->addChild($this->statement(), 'body');
      return $node;
    }
  }