/**
  * @param array $expectedTokenCategories
  * @param array $parsedTokenStream
  * @param null  $message
  * @param null  $previous
  */
 public function __construct(array $expectedTokenCategories, array $parsedTokenStream, $message = null, $previous = null)
 {
     $this->expectedTokenCategories = $expectedTokenCategories;
     $message = $message ?: "Unexpected end of expression. Expected token of one of type: " . implode(', ', $expectedTokenCategories);
     parent::__construct($message);
     $this->parsedTokenStream = $parsedTokenStream;
 }
 function __construct($unexpectedTokenName, $unexpectedTokenValue, array $expectedTokenCategories, array $parsedTokenStream, $message = null)
 {
     $this->unexpectedTokenName = $unexpectedTokenName;
     $this->unexpectedTokenValue = $unexpectedTokenValue;
     $this->expectedTokenCategories = $expectedTokenCategories;
     $message = $message ?: 'Unexpected token "' . $unexpectedTokenName . ' (' . $unexpectedTokenValue . ')". ';
     parent::__construct($message);
     $this->parsedTokenStream = $parsedTokenStream;
 }