forked from jasder/antlr
nongreedy decisions can't be LL(1)
This commit is contained in:
parent
c073835186
commit
a5016b60f9
|
@ -59,19 +59,26 @@ public class AnalysisPipeline {
|
||||||
g.decisionLOOK = new ArrayList<IntervalSet[]>(g.atn.getNumberOfDecisions()+1);
|
g.decisionLOOK = new ArrayList<IntervalSet[]>(g.atn.getNumberOfDecisions()+1);
|
||||||
for (DecisionState s : g.atn.decisionToState) {
|
for (DecisionState s : g.atn.decisionToState) {
|
||||||
g.tool.log("LL1", "\nDECISION "+s.decision+" in rule "+g.getRule(s.ruleIndex).name);
|
g.tool.log("LL1", "\nDECISION "+s.decision+" in rule "+g.getRule(s.ruleIndex).name);
|
||||||
LL1Analyzer anal = new LL1Analyzer(g.atn);
|
IntervalSet[] look;
|
||||||
IntervalSet[] look = anal.getDecisionLookahead(s);
|
if ( s.nonGreedy ) { // nongreedy decisions can't be LL(1)
|
||||||
g.tool.log("LL1", "look=" + Arrays.toString(look));
|
look = new IntervalSet[s.getNumberOfTransitions()+1];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LL1Analyzer anal = new LL1Analyzer(g.atn);
|
||||||
|
look = anal.getDecisionLookahead(s);
|
||||||
|
g.tool.log("LL1", "look=" + Arrays.toString(look));
|
||||||
|
}
|
||||||
Utils.setSize(g.decisionLOOK, s.decision+1);
|
Utils.setSize(g.decisionLOOK, s.decision+1);
|
||||||
g.decisionLOOK.set(s.decision, look);
|
g.decisionLOOK.set(s.decision, look);
|
||||||
g.tool.log("LL1", "LL(1)? " + disjoint(look));
|
g.tool.log("LL1", "LL(1)? " + disjoint(look));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Return lookahead depth at which lookahead sets are disjoint or return 0 */
|
/** Return whether lookahead sets are disjoint; no lookahead => not disjoint */
|
||||||
public static boolean disjoint(IntervalSet[] altLook) {
|
public static boolean disjoint(IntervalSet[] altLook) {
|
||||||
boolean collision = false;
|
boolean collision = false;
|
||||||
IntervalSet combined = new IntervalSet();
|
IntervalSet combined = new IntervalSet();
|
||||||
|
if ( altLook==null ) return false;
|
||||||
for (int a=1; a<altLook.length; a++) {
|
for (int a=1; a<altLook.length; a++) {
|
||||||
IntervalSet look = altLook[a];
|
IntervalSet look = altLook[a];
|
||||||
if ( look==null ) return false; // lookahead must've computation failed
|
if ( look==null ) return false; // lookahead must've computation failed
|
||||||
|
|
Loading…
Reference in New Issue