/** * 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 'is' and 'is not' operators * @see _tests * @param Tokenizer $tokens * @param string $value * @param bool $variable * @throws InvalidUsageException * @return string */ public function parseIs(Tokenizer $tokens, $value, $variable = false) { $tokens->next(); if ($tokens->current() == 'not') { $invert = '!'; $equal = '!='; $tokens->next(); } else { $invert = ''; $equal = '=='; } if ($tokens->is(Tokenizer::MACRO_STRING)) { $action = $tokens->current(); if (!$variable && ($action == "set" || $action == "empty")) { $action = "_{$action}"; $tokens->next(); return $invert . sprintf($this->_fenom->getTest($action), $value); } elseif ($test = $this->_fenom->getTest($action)) { $tokens->next(); return $invert . sprintf($test, $value); } elseif ($tokens->isSpecialVal()) { $tokens->next(); return '(' . $value . ' ' . $equal . '= ' . $action . ')'; } return $invert . '(' . $value . ' instanceof \\' . $this->parseName($tokens) . ')'; } elseif ($tokens->is(T_VARIABLE, '[', Tokenizer::MACRO_SCALAR, '"')) { return '(' . $value . ' ' . $equal . '= ' . $this->parseTerm($tokens) . ')'; } elseif ($tokens->is(T_NS_SEPARATOR)) { // return $invert . '(' . $value . ' instanceof \\' . $this->parseName($tokens) . ')'; } else { throw new InvalidUsageException("Unknown argument"); } }