Exemplo n.º 1
0
 /**
  * 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;
 }
Exemplo n.º 2
0
 /**
  * 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");
     }
 }