public function parseInputStreamWithBacktracking(InputStreamInterface $input, ExpressionResultInterface $previous_result = null)
 {
     /** @var AlternativeExpressionResult $previous_result */
     if ($previous_result !== null && $previous_result instanceof AlternativeExpressionResult === false) {
         throw new \Exception("Expected " . AlternativeExpressionResult::class);
     }
     $alternatives = $this->alternatives;
     /** @var BacktrackingStreamingParserInterface|false $current_alternative */
     $current_alternative = reset($alternatives);
     $active = $previous_result === null;
     while ($active === false) {
         $active = key($alternatives) === $previous_result->getKey();
         if ($active === true) {
             $alternative_result = $current_alternative->parseInputStreamWithBacktracking($input, $previous_result->getResult());
             if ($alternative_result !== null) {
                 return new AlternativeExpressionResult($alternative_result, key($alternatives));
             }
         }
         $current_alternative = next($alternatives);
     }
     while ($current_alternative !== false) {
         $current_alternative = current($alternatives);
         $alternative_result = $current_alternative->parseInputStreamWithBacktracking($input);
         if ($alternative_result !== null) {
             if ($previous_result !== null && $previous_result->getLength() === $alternative_result->getLength()) {
                 return null;
             }
             return new AlternativeExpressionResult($alternative_result, key($alternatives));
         }
         $current_alternative = next($alternatives);
     }
     return null;
 }
 public function reverseRewriteExpressionResult(ExpressionResultInterface $result)
 {
     /** @var \PeterVanDommelen\Parser\Expression\Alternative\AlternativeExpressionResult $result */
     $key = $result->getKey();
     $original_result = $this->alternative_rewriters[$key]->reverseRewriteExpressionResult($result->getResult());
     return new AlternativeExpressionResult($original_result, $key);
 }
 public function reverseRewriteExpressionResult(ExpressionResultInterface $result)
 {
     /** @var AlternativeExpressionResult $result */
     if ($result->getKey() === 1) {
         //empty
         return new JoinedExpressionResult(array(), array());
     }
     /** @var \PeterVanDommelen\Parser\Expression\Concatenated\ConcatenatedExpressionResult $maybe_part */
     $maybe_part = $result->getResult();
     /** @var \PeterVanDommelen\Parser\Expression\Repeater\RepeaterExpressionResult $repeater_part */
     $repeater_part = $maybe_part->getPart(1);
     $results = array($this->inner_result_rewriter->reverseRewriteExpressionResult($maybe_part->getPart(0)));
     $seperators = array();
     foreach ($repeater_part->getResults() as $repeater_part_part) {
         /** @var \PeterVanDommelen\Parser\Expression\Concatenated\ConcatenatedExpressionResult $repeater_part_part */
         $seperators[] = $this->seperator_result_rewriter->reverseRewriteExpressionResult($repeater_part_part->getPart(0));
         $results[] = $this->inner_result_rewriter->reverseRewriteExpressionResult($repeater_part_part->getPart(1));
     }
     return new JoinedExpressionResult($results, $seperators);
 }