/**
  * @param string $stringSymbol
  * @return ExpressionSymbol
  */
 public function createTerminal($stringSymbol)
 {
     if ($stringSymbol === '') {
         return ExpressionSymbol::createAdapterForEpsilon();
     }
     return ExpressionSymbol::createAdapterForTerminal($stringSymbol);
 }
 protected function addEpsilonAlternativeForItem(Symbol $nonTerminal, Expression $optionalExpression)
 {
     $alternationItems = array(ExpressionSymbol::createAdapterForEpsilon());
     if ($optionalExpression instanceof Concatenation) {
         $alternationItems[] = $optionalExpression;
     } elseif ($optionalExpression instanceof Choice) {
         $alternationItems[] = new Group($optionalExpression);
     } else {
         $alternationItems[] = $optionalExpression;
     }
     $alternation = new Choice(array_shift($alternationItems), $alternationItems);
     $production = new StandardProduction($nonTerminal, $alternation);
     $this->epsilonAlternatives[] = $production;
     return $production;
 }