/** * @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); }
/** * @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())); } }