Example #1
0
 /**
  */
 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;
 }
Example #2
0
 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);
 }