/** */ public function parseAttributeOrMethod() { $exprToken = $this->tokenStream->expect(Token::TYPE_VARIABLE); //start by variable $exprNode = new VarNode($exprToken); while (!$this->tokenStream->isEOF()) { if ($this->tokenStream->test(Token::TYPE_PUNCTUATION, '.')) { $this->tokenStream->next(); //not function if ($this->tokenStream->test(Token::TYPE_NAME) && $this->tokenStream->lookNext(2)->value != '(') { $nameToken = $this->tokenStream->next(); $rightNode = new AttributeNameNode(['name' => $nameToken]); $exprNode = new AttributeNode([$nameToken], ['left' => $exprNode, 'right' => $rightNode]); } else { $rightNode = $this->parseFunction(); $exprNode = new MethodNode([$rightNode->tokens['funcName']], ['left' => $exprNode, 'right' => $rightNode]); } } else { if ($this->tokenStream->test(Token::TYPE_PUNCTUATION, '[')) { $this->tokenStream->next(); $rightNode = $this->parsePrimary(); $exprNode = new AttributeNode([$exprToken], ['left' => $exprNode, 'right' => $rightNode]); $this->tokenStream->expect(Token::TYPE_PUNCTUATION, ']'); } else { break; } } } return $exprNode; }
public function parse(TokenStream $tokenStream) { while (!$tokenStream->isEOF() && $tokenStream->lookNext()->getType() != Token::TYPE_TAG_END) { $paramNameToken = $tokenStream->expect(Token::TYPE_NAME); $tokenStream->expect(Token::TYPE_OPERATOR, '='); $expressionNode = $this->getExpressionParser()->parse($tokenStream); $this->attributes[$paramNameToken->getValue()] = $expressionNode; } $tokenStream->expect(Token::TYPE_TAG_END); foreach ($this->getRequiredAttributes() as $attributeName) { if (!isset($this->attributes[$attributeName])) { throw new ParseException($tokenStream->getFileName(), sprintf('%s require %s attribute', $this->getTagName(), $attributeName), $this->tagToken->line, $this->tagToken->col); } } if ($this->hasCloseTag()) { $this->bodyNode = $this->rootParser->parseBody($this); } return new CommonTagNode($this); }
/** * @return bool 若标签到达关闭,返回true,否则false */ public function parseTagBreak(TokenStream $tokenStream) { $endTagName = 'end' . $this->getTagName(); if ($tokenStream->test(Token::TYPE_NAME, $endTagName)) { $tokenStream->next(); $tokenStream->expect(Token::TYPE_TAG_END); $this->isClosed = true; return true; } else { return false; } }