/** * 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; }