/** * @return \Helstern\Nomsky\GrammarAnalysis\ParseTable\LLParseTable */ public function build() { $parseTable = new LLParseTable($this->nonTerminals, $this->terminals, $this->productionHashAlgorithm); /** @var NormalizedProduction $production */ foreach ($this->lookAheadSets->getEntrySetIterator() as $production => $terminalSet) { $lhs = $production->getLeftHandSide(); /** @var Symbol $terminal */ foreach ($terminalSet as $terminal) { $parseTable->add($lhs, $terminal, $production); } } return $parseTable; }
/** * @return LookAheadSets */ public static function predictSets() { $productions = self::normalizedProductions(); $sets = new LookAheadSets(new SimpleHashKeyFactory()); $set = new ArraySet(); $set->add(StandardSymbol::terminal('a')); $sets->add($productions[0], $set); $set = new ArraySet(); $set->add(StandardSymbol::terminal('b')); $set->add(StandardSymbol::terminal('c')); $set->add(StandardSymbol::terminal('d')); $sets->add($productions[1], $set); $set = new ArraySet(); $set->add(StandardSymbol::terminal('b')); $sets->add($productions[2], $set); $set = new ArraySet(); $set->add(StandardSymbol::terminal('c')); $set->add(StandardSymbol::terminal('d')); $sets->add($productions[3], $set); $set = new ArraySet(); $set->add(StandardSymbol::terminal('c')); $sets->add($productions[4], $set); $set = new ArraySet(); $set->add(StandardSymbol::terminal('d')); $sets->add($productions[5], $set); return $sets; }
/** * @param array|NormalizedProduction[] $productions * @param LookAheadSets $lookAheadSets * @param \Helstern\Nomsky\GrammarAnalysis\ParseSets\ParseSets $followSets * @param \Helstern\Nomsky\GrammarAnalysis\ParseSets\ParseSets $firstSets * * @return \Helstern\Nomsky\GrammarAnalysis\ParseSets\SetsGenerator */ public function generateLookAheadSets(array $productions, LookAheadSets $lookAheadSets, ParseSets $followSets, ParseSets $firstSets) { foreach ($productions as $production) { $predictSet = new ArraySet(); $this->predictSetCalculator->processProduction($predictSet, $production, $followSets, $firstSets); $lookAheadSets->add($production, $predictSet); } return $this; }