Lines Matching refs:a

72      * Convert a {@see RuleContext} tree to a {@see PredictionContext} graph.
87 // If we have a parent, convert it to a PredictionContext graph
129 PredictionContext $a,
135 if ($a->equals($b)) {
136 return $a;
139 if ($a instanceof SingletonPredictionContext && $b instanceof SingletonPredictionContext) {
140 return self::mergeSingletons($a, $b, $rootIsWildcard, $mergeCache);
143 // At least one of a or b is array
146 if ($a instanceof EmptyPredictionContext) {
147 return $a;
156 if ($a instanceof SingletonPredictionContext) {
157 $a = ArrayPredictionContext::fromOne($a);
164 if (!$a instanceof ArrayPredictionContext || !$b instanceof ArrayPredictionContext) {
168 return self::mergeArrays($a, $b, $rootIsWildcard, $mergeCache);
188 * @param SingletonPredictionContext $a The first {@see SingletonPredictionContext}
190 * @param bool $rootIsWildcard `true` if this is a local-context merge,
191 * otherwise false to indicate a full-context merge
194 SingletonPredictionContext $a,
200 $previous = $mergeCache->getByTwoKeys($a, $b);
206 $previous = $mergeCache->getByTwoKeys($b, $a);
213 $rootMerge = self::mergeRoot($a, $b, $rootIsWildcard);
217 $mergeCache->set($a, $b, $rootMerge);
223 if ($a->returnState === $b->returnState) {
224 if ($a->parent === null || $b->parent === null) {
228 $parent = self::merge($a->parent, $b->parent, $rootIsWildcard, $mergeCache);
230 // If parent is same as existing a or b parent or reduced to a parent, return it
231 if ($parent === $a->parent) {
232 return $a; // ax + bx = ax, if a=b
236 return $b; // ax + bx = bx, if a=b
239 // Else: ax + ay = a'[x,y]
242 // of those graphs. dup a, a' points at merged array new joined parent
243 // so create new singleton pointing to it, a'
244 $spc = SingletonPredictionContext::create($parent, $a->returnState);
247 $mergeCache->set($a, $b, $spc);
251 // a != b payloads differ
255 if ($a === $b || ($a->parent !== null && $a->parent === $b->parent)) {
258 // [a,b]x
259 $singleParent = $a->parent;
265 $payloads = [$a->returnState, $b->returnState];
267 if ($a->returnState > $b->returnState) {
269 $payloads[1] = $a->returnState;
276 $mergeCache->set($a, $b, $apc);
285 $payloads = [$a->returnState, $b->returnState];
286 $parents = [$a->parent, $b->parent];
288 if ($a->returnState > $b->returnState) {
291 $payloads[1] = $a->returnState;
292 $parents = [$b->parent, $a->parent];
298 $mergeCache->set($a, $b, $a_);
306 * Handle case where at least one of `a` or `b` is
335 * a special value (and null parent).
342 SingletonPredictionContext $a,
347 if ($a === self::empty()) {
352 return self::empty();// a +// =//
355 if ($a === self::empty() && $b === self::empty()) {
359 if ($a === self::empty()) {
369 $payloads = [$a->returnState, self::EMPTY_RETURN_STATE];
370 $parents = [$a->parent, null];
404 ArrayPredictionContext $a,
410 $previous = $mergeCache->getByTwoKeys($a, $b);
416 $previous = $mergeCache->getByTwoKeys($b, $a);
423 // merge sorted payloads a + b => M
424 $i = 0;// walks a
432 while ($i < \count($a->returnStates) && $j < \count($b->returnStates)) {
433 $a_parent = $a->parents[$i];
436 if ($a->returnStates[$i] === $b->returnStates[$j]) {
438 $payload = $a->returnStates[$i];
454 // ax+ay -> a'[x,y]
462 } elseif ($a->returnStates[$i] < $b->returnStates[$j]) {
463 // copy a[i] to M
465 $mergedReturnStates[$k] = $a->returnStates[$i];
468 // b > a, copy b[j] to M
478 if ($i < \count($a->returnStates)) {
479 for ($p = $i, $count = \count($a->returnStates); $p < $count; $p++) {
480 $mergedParents[$k] = $a->parents[$p];
481 $mergedReturnStates[$k] = $a->returnStates[$p];
492 // trim merged if we combined a few that had same stack tops
500 $mergeCache->set($a, $b, $a_);
514 // if we created same array as a or b, return that instead
516 if ($M === $a) {
518 $mergeCache->set($a, $b, $a);
521 return $a;
526 $mergeCache->set($a, $b, $b);
533 $mergeCache->set($a, $b, $M);