Exemplo n.º 1
0
 /**
  * @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;
 }
Exemplo n.º 2
0
 /**
  * @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;
 }
Exemplo n.º 3
0
 /**
  * @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;
 }