Example #1
0
 /**
  * Parse variable name: $a, $a.b, $a.b['c'], $a:index
  * @param Tokenizer $tokens
  * @param $var
  * @return string
  * @throws Error\UnexpectedTokenException
  */
 public function parseVariable(Tokenizer $tokens, $var = null)
 {
     if (!$var) {
         if ($tokens->isNext('@')) {
             //                $v = $tokens->get(T_VARIABLE);
             $prop = $tokens->next()->next()->get(T_STRING);
             if ($tag = $this->getParentScope("foreach")) {
                 $tokens->next();
                 return Compiler::foreachProp($tag, $prop);
             } else {
                 throw new UnexpectedTokenException($tokens);
             }
         } else {
             $var = '$var["' . substr($tokens->get(T_VARIABLE), 1) . '"]';
             $tokens->next();
         }
     }
     while ($t = $tokens->key()) {
         if ($t === ".") {
             $tokens->next();
             if ($tokens->is(T_VARIABLE)) {
                 $key = '[ $var["' . substr($tokens->getAndNext(), 1) . '"] ]';
             } elseif ($tokens->is(Tokenizer::MACRO_STRING)) {
                 $key = '["' . $tokens->getAndNext() . '"]';
             } elseif ($tokens->is(Tokenizer::MACRO_SCALAR)) {
                 $key = "[" . $tokens->getAndNext() . "]";
             } elseif ($tokens->is('"')) {
                 $key = "[" . $this->parseQuote($tokens) . "]";
             } elseif ($tokens->is('.')) {
                 $tokens->back();
                 break;
             } else {
                 throw new UnexpectedTokenException($tokens);
             }
             $var .= $key;
         } elseif ($t === "[") {
             if ($tokens->isNext(']')) {
                 break;
             }
             $tokens->next();
             if ($tokens->is(Tokenizer::MACRO_STRING)) {
                 if ($tokens->isNext("(")) {
                     $key = "[" . $this->parseExpr($tokens) . "]";
                 } else {
                     $key = '["' . $tokens->current() . '"]';
                     $tokens->next();
                 }
             } else {
                 $key = "[" . $this->parseExpr($tokens) . "]";
             }
             $tokens->get("]");
             $tokens->next();
             $var .= $key;
         } elseif ($t === T_DNUMBER) {
             $var .= '[' . substr($tokens->getAndNext(), 1) . ']';
         } elseif ($t === T_OBJECT_OPERATOR) {
             $var .= "->" . $tokens->getNext(T_STRING);
             $tokens->next();
         } else {
             break;
         }
     }
     return $var;
 }