public function isPotentiallyEmpty(ExpressionInterface $expression)
 {
     /** @var RegexExpression $expression */
     $parser = new RegexParser($expression->getRegex());
     $able_to_match_empty_string = $parser->parse("") !== null;
     return $able_to_match_empty_string;
 }
 public function rewriteExpression(ExpressionInterface $expression)
 {
     /** @var ConcatenatedExpression $expression */
     $part_expressions = array();
     $mapping = array();
     foreach ($expression->getParts() as $key => $part) {
         if ($part instanceof ConcatenatedExpression === true && $part !== $expression) {
             /** @var ConcatenatedExpression $part */
             //                $rewritten_inner_parts = array_map(function (ExpressionInterface $inner_part) {
             //                    return $this->getRecursiveHandler()->rewriteExpression($inner_part);
             //                }, array_values($part->getParts()));
             //
             //                $rewritten_inner_part_expressions = array_map(function (RewrittenExpressionContainer $rewritten) {
             //                    return $rewritten->getExpression();
             //                }, $rewritten_inner_parts);
             $part_expressions = array_merge($part_expressions, array_values($part->getParts()));
             //                $rewritten_part_expressions = array_map(function (RewrittenExpressionContainer $rewritten) {
             //                    return $rewritten->getExpression();
             //                }, $rewritten_parts);
             $mapping[] = array($key, array_keys($part->getParts()));
         } else {
             $part_expressions[] = $part;
             $mapping[] = $key;
         }
     }
     return new RewrittenExpressionContainer(new ConcatenatedExpression($part_expressions), new ConcatenatedResultFlattenSimplifier($mapping));
 }
 public function compile(ExpressionInterface $expression)
 {
     /** @var $expression \PeterVanDommelen\Parser\Expression\Constant\ConstantExpression */
     if (strlen($expression->getString()) === 1) {
         return new SingleByteParser($expression->getString());
     }
     return new ConstantParser($expression->getString());
 }
 public function rewriteExpression(ExpressionInterface $expression)
 {
     /** @var ConcatenatedExpression $expression */
     $parts = $expression->getParts();
     $key = key($parts);
     $part = current($parts);
     $rewritten_part = $this->getRecursiveHandler()->rewriteExpression($part);
     return new RewrittenExpressionContainer($rewritten_part->getExpression(), new ConcatenatedResultSimplifier($key, $rewritten_part->getResultRewriter()));
 }
 public function flattenExpression(ExpressionInterface $expression)
 {
     /** @var $expression \PeterVanDommelen\Parser\Expression\Concatenated\ConcatenatedExpression */
     $expressions = array($expression);
     foreach ($expression->getParts() as $part) {
         $expressions = array_merge($expressions, $this->getRecursiveHandler()->flattenExpression($part));
     }
     return array_unique($expressions, SORT_REGULAR);
 }
 public function rewriteExpression(ExpressionInterface $expression)
 {
     /** @var AlternativeExpression $expression */
     $alternatives = $expression->getAlternatives();
     $alternative = current($alternatives);
     $key = key($alternatives);
     $rewritten = $this->getRecursiveHandler()->rewriteExpression($alternative);
     return new RewrittenExpressionContainer($rewritten->getExpression(), new AlternativeResultSimplifier($key, $rewritten->getResultRewriter()));
 }
 public function flattenExpression(ExpressionInterface $expression)
 {
     /** @var $expression AlternativeExpression */
     $expressions = array($expression);
     foreach ($expression->getAlternatives() as $alternative) {
         $expressions = array_merge($expressions, $this->getRecursiveHandler()->flattenExpression($alternative));
     }
     return array_unique($expressions, SORT_REGULAR);
 }
 public function isPotentiallyEmpty(ExpressionInterface $expression)
 {
     /** @var $expression ConcatenatedExpression */
     foreach ($expression->getParts() as $part) {
         if ($this->getRecursiveHandler()->isPotentiallyEmpty($part) === false) {
             return false;
         }
     }
     return true;
 }
 public function isPotentiallyEmpty(ExpressionInterface $expression)
 {
     /** @var $expression AlternativeExpression */
     $potentially_empty = false;
     foreach ($expression->getAlternatives() as $alternative) {
         $alternative_is_potentially_empty = $this->getRecursiveHandler()->isPotentiallyEmpty($alternative) === true;
         $potentially_empty = $potentially_empty || $alternative_is_potentially_empty;
     }
     return $potentially_empty;
 }
 public function rewriteExpression(ExpressionInterface $expression)
 {
     /** @var AlternativeExpression $expression */
     $rewritten_alternatives = array_map(array($this->getRecursiveHandler(), "rewriteExpression"), $expression->getAlternatives());
     $rewritten_alternative_expressions = array_map(function (RewrittenExpressionContainer $rewritten) {
         return $rewritten->getExpression();
     }, $rewritten_alternatives);
     $rewritten_alternative_result_rewriters = array_map(function (RewrittenExpressionContainer $rewritten) {
         return $rewritten->getResultRewriter();
     }, $rewritten_alternatives);
     return new RewrittenExpressionContainer(new AlternativeExpression($rewritten_alternative_expressions), new AlternativeExpressionResultRewriter($rewritten_alternative_result_rewriters));
 }
 public function isPotentiallyEmpty(ExpressionInterface $expression)
 {
     /** @var $expression RepeaterExpression */
     //because this method is also used to detect left recursion we always need to access the inner expression
     $inner_expression_empty = $this->getRecursiveHandler()->isPotentiallyEmpty($expression->getExpression());
     if ($expression->getMinimum() === 0) {
         return true;
     }
     if ($inner_expression_empty === true) {
         return true;
     }
     return false;
 }
 public function compile(ExpressionInterface $expression)
 {
     /** @var $expression \PeterVanDommelen\Parser\Expression\Repeater\RepeaterExpression */
     if ($expression->isLazy() === true) {
         return new LazyRepeaterParser($this->getRecursiveHandler()->compile($expression->getExpression()), $expression->getMinimum(), $expression->getMaximum());
     }
     return new GreedyRepeaterParser($this->getRecursiveHandler()->compile($expression->getExpression()), $expression->getMinimum(), $expression->getMaximum());
 }
 public function rewriteExpression(ExpressionInterface $expression)
 {
     /** @var JoinedExpression $expression */
     $rewritten_inner_expression = $this->getRecursiveHandler()->rewriteExpression($expression->getExpression());
     $rewritten_seperator_expression = $this->getRecursiveHandler()->rewriteExpression($expression->getSeperator());
     $repeater_part = new ConcatenatedExpression(array($rewritten_seperator_expression->getExpression(), $rewritten_inner_expression->getExpression()));
     $maximum = $expression->getMaximum();
     if ($maximum !== null) {
         $maximum = $maximum - 1;
     }
     $maybe_part = new ConcatenatedExpression(array($rewritten_inner_expression->getExpression(), new RepeaterExpression($repeater_part, $expression->isLazy(), max(0, $expression->getMinimum() - 1), $maximum)));
     return new RewrittenExpressionContainer(new AlternativeExpression(array($maybe_part, new ConstantExpression(""))), new JoinedExpressionResultRewriter($rewritten_inner_expression->getResultRewriter(), $rewritten_seperator_expression->getResultRewriter()));
 }
 public function flattenExpression(ExpressionInterface $expression)
 {
     /** @var $expression NotExpression */
     return array_unique(array_merge(array($expression), $this->getRecursiveHandler()->flattenExpression($expression->getExpression())), SORT_REGULAR);
 }
 public function flattenExpression(ExpressionInterface $expression)
 {
     /** @var $expression \PeterVanDommelen\Parser\Expression\Repeater\RepeaterExpression */
     return array_unique(array_merge(array($expression), $this->getRecursiveHandler()->flattenExpression($expression->getExpression())), SORT_REGULAR);
 }
 public function rewriteExpression(ExpressionInterface $expression)
 {
     /** @var NamedExpression $expression */
     return $this->getRecursiveHandler()->rewriteExpression($this->grammar->getExpression($expression->getName()));
 }
 public function rewriteExpression(ExpressionInterface $expression)
 {
     /** @var RepeaterExpression $expression */
     $rewritten_inner = $this->getRecursiveHandler()->rewriteExpression($expression->getExpression());
     return new RewrittenExpressionContainer(new RepeaterExpression($rewritten_inner->getExpression(), $expression->isLazy(), $expression->getMinimum(), $expression->getMaximum()), new RepeaterExpressionResultRewriter($rewritten_inner->getResultRewriter()));
 }
 public function isPotentiallyEmpty(ExpressionInterface $expression)
 {
     /** @var $expression \PeterVanDommelen\Parser\Expression\Constant\ConstantExpression */
     return $expression->getString() === "";
 }
 public function compile(ExpressionInterface $expression)
 {
     /** @var $expression \PeterVanDommelen\Parser\Expression\Concatenated\ConcatenatedExpression */
     return new ConcatenatedParser(array_map(array($this->getRecursiveHandler(), "compile"), $expression->getParts()));
 }
 public function compile(ExpressionInterface $expression)
 {
     /** @var $expression NotExpression */
     return new NotParser($this->getRecursiveHandler()->compile($expression->getExpression()), $this->encoding);
 }
 public function compile(ExpressionInterface $expression)
 {
     /** @var RegexExpression $expression */
     return new RegexParser($expression->getRegex());
 }
 public function rewriteExpression(ExpressionInterface $expression)
 {
     /** @var NotExpression $expression */
     $inner = $this->getRecursiveHandler()->rewriteExpression($expression->getExpression());
     return new RewrittenExpressionContainer(new NotExpression($inner->getExpression()), new TerminateExpressionResultRewriter());
 }
 public function compile(ExpressionInterface $expression)
 {
     /** @var $expression AlternativeExpression */
     return new AlternativeParser(array_map(array($this->getRecursiveHandler(), "compile"), $expression->getAlternatives()));
 }