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);
 }
Пример #2
0
 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 ConcatenatedExpressionResult $result */
     $rewritten_parts = array();
     foreach ($result->getParts() as $key => $result) {
         $rewritten_parts[$key] = $this->part_rewriters[$key]->reverseRewriteExpressionResult($result);
     }
     return new ConcatenatedExpressionResult($rewritten_parts);
 }
 public function reverseRewriteExpressionResult(ExpressionResultInterface $result)
 {
     /** @var ConcatenatedExpressionResult $result */
     $parts = array();
     $current_index = 0;
     foreach ($this->mapping as $item) {
         if (is_array($item) === true) {
             $subparts = array();
             foreach ($item[1] as $subitem) {
                 $subparts[$subitem] = $result->getPart($current_index);
                 $current_index += 1;
             }
             $parts[$item[0]] = new ConcatenatedExpressionResult($subparts);
         } else {
             $parts[$item] = $result->getPart($current_index);
             $current_index += 1;
         }
     }
     return new ConcatenatedExpressionResult($parts);
 }
 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);
 }
Пример #6
0
 public function parseInputStreamWithBacktracking(InputStreamInterface $input, ExpressionResultInterface $previous_result = null)
 {
     if ($previous_result !== null && $previous_result instanceof ConcatenatedExpressionResult === false) {
         throw new \Exception("Expected " . ConcatenatedExpressionResult::class);
     }
     /** @var ConcatenatedExpressionResult|null $previous_result */
     $position = 0;
     if ($previous_result !== null) {
         $part_results = array_values($previous_result->getParts());
         $index = count($this->parts) - 1;
         for ($i = 0; $i < count($this->parts); $i += 1) {
             $position += $part_results[$i]->getLength();
         }
         $input->move($position);
     } else {
         $part_results = array_fill(0, count($this->parts), null);
         $index = 0;
     }
     for (; $index < count($this->parts);) {
         $part = $this->parts[$index];
         if ($part_results[$index] !== null) {
             $input->move(-$part_results[$index]->getLength());
             $position -= $part_results[$index]->getLength();
         }
         $part_result = $part->parseInputStreamWithBacktracking($input, $part_results[$index]);
         if ($part_result === null) {
             if ($index === 0) {
                 $input->move(-$position);
                 return null;
             }
             $part_results[$index] = $part_result;
             $index -= 1;
         } else {
             $position += $part_result->getLength();
             $part_results[$index] = $part_result;
             $index += 1;
         }
     }
     $corrected_part_results = array_combine($this->key_to_index, $part_results);
     return new ConcatenatedExpressionResult($corrected_part_results);
 }
 public function reverseRewriteExpressionResult(ExpressionResultInterface $result)
 {
     /** @var RepeaterExpressionResult $result */
     return new RepeaterExpressionResult(new \ArrayIterator(array_map(array($this->inner_rewriter, "reverseRewriteExpressionResult"), iterator_to_array($result->getResults()))));
 }
 public function getString()
 {
     return $this->part_result->getString();
 }