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); }