Example #1
0
 /**
  * @param State $state
  * @return Item[]
  */
 private function getCompletedItems(State $state)
 {
     $finalItem = $state->getFinalItem();
     $items = [];
     foreach ($state->getSets() as $set) {
         foreach ($set->getItems() as $item) {
             if ($item->isComplete() && $item !== $finalItem) {
                 $items[] = $item;
             }
         }
     }
     return array_reverse($items);
 }
Example #2
0
 /**
  * @param State $state
  * @param Token[] $input
  * @param Item $item
  * @param TokenReference $tokenReference
  */
 private function scan(State $state, $input, Item $item, TokenReference $tokenReference)
 {
     $inputPosition = $state->getSets()->key();
     if (!array_key_exists($inputPosition, $input)) {
         return;
     }
     $token = $input[$inputPosition];
     if ($tokenReference->matchesToken($token)) {
         $nextInputPosition = $inputPosition + 1;
         if (!array_key_exists($nextInputPosition, $state->getSets())) {
             $state->addSet(new Set());
         }
         $nextSet = $state->getSets()[$nextInputPosition];
         $nextSet->addItem(new Item($item->getRule(), $item->getEntryPosition() + 1, $item->getInputPosition()));
     }
 }