didn't join a$ + bx as [a,b]$ for local ctx. new unit test to chk
This commit is contained in:
parent
8695210903
commit
829ad9191c
|
@ -249,21 +249,30 @@ public abstract class PredictionContext implements Iterable<SingletonPredictionC
|
|||
return new SingletonPredictionContext(parent, a.invokingState);
|
||||
}
|
||||
else { // a != b payloads differ
|
||||
if ( a.parent.equals(b.parent) ) {
|
||||
// parents are equal, pick left one as parent to reuse
|
||||
PredictionContext parent = a.parent;
|
||||
// see if we can collapse parents due to $+x parents if local ctx
|
||||
PredictionContext singleParent = null;
|
||||
if ( rootIsWildcard ) {
|
||||
if ( a.parent == EMPTY ) singleParent = EMPTY; // $ + b = $
|
||||
if ( b.parent == EMPTY ) singleParent = EMPTY; // a + $ = $
|
||||
}
|
||||
if ( a.parent.equals(b.parent) ) { // ax + bx = [a,b]x
|
||||
singleParent = a.parent;
|
||||
}
|
||||
if ( singleParent!=null ) { // parents are same
|
||||
// sort payloads and use same parent
|
||||
int[] payloads = {a.invokingState, b.invokingState};
|
||||
if ( a.invokingState > b.invokingState ) {
|
||||
payloads = new int[] {b.invokingState, a.invokingState};
|
||||
payloads[0] = b.invokingState;
|
||||
payloads[1] = a.invokingState;
|
||||
}
|
||||
PredictionContext[] parents = {parent, parent};
|
||||
PredictionContext[] parents = {singleParent, singleParent};
|
||||
ArrayPredictionContext joined =
|
||||
new ArrayPredictionContext(parents, payloads);
|
||||
return joined;
|
||||
}
|
||||
// parents differ, just pack together into array; can't merge.
|
||||
// sort though by payload
|
||||
// parents differ and can't merge them. Just pack together
|
||||
// into array; can't merge. sort, though, by payload
|
||||
// ax + by = [ax,by]
|
||||
int[] payloads = {a.invokingState, b.invokingState};
|
||||
PredictionContext[] parents = {a.parent, b.parent};
|
||||
if ( a.invokingState > b.invokingState ) {
|
||||
|
@ -284,8 +293,8 @@ public abstract class PredictionContext implements Iterable<SingletonPredictionC
|
|||
boolean rootIsWildcard)
|
||||
{
|
||||
if ( rootIsWildcard ) {
|
||||
if ( a == EMPTY ) return a; // * + b = *
|
||||
if ( b == EMPTY ) return b; // a + * = *
|
||||
if ( a == EMPTY ) return EMPTY; // * + b = *
|
||||
if ( b == EMPTY ) return EMPTY; // a + * = *
|
||||
}
|
||||
else {
|
||||
if ( a == EMPTY && b == EMPTY ) return EMPTY; // $ + $ = $
|
||||
|
|
|
@ -149,7 +149,7 @@ public class TestGraphNodes extends TestCase {
|
|||
assertEquals(expecting, PredictionContext.toDotString(r));
|
||||
}
|
||||
|
||||
@Test public void test_ax_bx() {
|
||||
@Test public void test_ax_bx_same_x() {
|
||||
PredictionContext x = createSingleton(PredictionContext.EMPTY, 9);
|
||||
PredictionContext a = createSingleton(x, 1);
|
||||
PredictionContext b = createSingleton(x, 2);
|
||||
|
@ -168,6 +168,43 @@ public class TestGraphNodes extends TestCase {
|
|||
assertEquals(expecting, PredictionContext.toDotString(r));
|
||||
}
|
||||
|
||||
@Test public void test_ax_bx() {
|
||||
PredictionContext x1 = createSingleton(PredictionContext.EMPTY, 9);
|
||||
PredictionContext x2 = createSingleton(PredictionContext.EMPTY, 9);
|
||||
PredictionContext a = createSingleton(x1, 1);
|
||||
PredictionContext b = createSingleton(x2, 2);
|
||||
PredictionContext r = PredictionContext.merge(a, b, rootIsWildcard());
|
||||
System.out.println(PredictionContext.toDotString(r));
|
||||
String expecting =
|
||||
"digraph G {\n" +
|
||||
"rankdir=LR;\n" +
|
||||
" s5 [shape=box, label=\"[1, 2]\"];\n" +
|
||||
" s1 [label=\"9\"];\n" +
|
||||
" s0 [label=\"$\"];\n" +
|
||||
" s5->s1 [label=\"parent[0]\"];\n" +
|
||||
" s5->s1 [label=\"parent[1]\"];\n" +
|
||||
" s1->s0;\n" +
|
||||
"}\n";
|
||||
assertEquals(expecting, PredictionContext.toDotString(r));
|
||||
}
|
||||
|
||||
@Test public void test_a$_bx() {
|
||||
PredictionContext x2 = createSingleton(PredictionContext.EMPTY, 9);
|
||||
PredictionContext a = createSingleton(PredictionContext.EMPTY, 1);
|
||||
PredictionContext b = createSingleton(x2, 2);
|
||||
PredictionContext r = PredictionContext.merge(a, b, rootIsWildcard());
|
||||
System.out.println(PredictionContext.toDotString(r));
|
||||
String expecting =
|
||||
"digraph G {\n" +
|
||||
"rankdir=LR;\n" +
|
||||
" s4 [shape=box, label=\"[1, 2]\"];\n" +
|
||||
" s0 [label=\"$\"];\n" +
|
||||
" s4->s0 [label=\"parent[0]\"];\n" +
|
||||
" s4->s0 [label=\"parent[1]\"];\n" +
|
||||
"}\n";
|
||||
assertEquals(expecting, PredictionContext.toDotString(r));
|
||||
}
|
||||
|
||||
@Test public void test_aex_bfx() {
|
||||
PredictionContext x1 = createSingleton(PredictionContext.EMPTY, 9);
|
||||
PredictionContext x2 = createSingleton(PredictionContext.EMPTY, 9);
|
||||
|
|
Loading…
Reference in New Issue