/** * @param Tokenizer $tokens * @throws \LogicException * @throws \RuntimeException * @return string */ public function parseStatic(Tokenizer $tokens) { if ($this->_options & Fenom::DENY_STATICS) { throw new \LogicException("Static methods are disabled"); } $tokens->skipIf(T_NS_SEPARATOR); $name = ""; if ($tokens->is(T_STRING)) { $name .= $tokens->getAndNext(); while ($tokens->is(T_NS_SEPARATOR)) { $name .= '\\' . $tokens->next()->get(T_STRING); $tokens->next(); } } $tokens->need(T_DOUBLE_COLON)->next()->need(T_STRING); $static = $name . "::" . $tokens->getAndNext(); if (!is_callable($static)) { throw new \RuntimeException("Method {$static} doesn't exist"); } return $static; }
/** * Define macro * * @param Tokenizer $tokens * @param Scope $scope * @throws InvalidUsageException */ public static function macroOpen(Tokenizer $tokens, Scope $scope) { $scope["name"] = $tokens->get(Tokenizer::MACRO_STRING); $scope["recursive"] = false; $args = array(); $defaults = array(); if (!$tokens->valid()) { return; } $tokens->next()->need('(')->next(); if ($tokens->is(')')) { return; } while ($tokens->is(Tokenizer::MACRO_STRING, T_VARIABLE)) { $args[] = $param = $tokens->getAndNext(); if ($tokens->is('=')) { $tokens->next(); if ($tokens->is(T_CONSTANT_ENCAPSED_STRING, T_LNUMBER, T_DNUMBER) || $tokens->isSpecialVal()) { $defaults[$param] = $tokens->getAndNext(); } else { throw new InvalidUsageException("Macro parameters may have only scalar defaults"); } } $tokens->skipIf(','); } $tokens->skipIf(')'); $scope["macro"] = array("name" => $scope["name"], "args" => $args, "defaults" => $defaults, "body" => "", "recursive" => false); return; }
/** * Parse method, class or constant name * * @param Tokenizer $tokens * @return string */ public function parseName(Tokenizer $tokens) { $tokens->skipIf(T_NS_SEPARATOR); $name = ""; if ($tokens->is(T_STRING)) { $name .= $tokens->getAndNext(); while ($tokens->is(T_NS_SEPARATOR)) { $name .= '\\' . $tokens->next()->get(T_STRING); $tokens->next(); } } return $name; }