From 7e9a86a3e1a9db96dea0867d0073d4b8310bc61c Mon Sep 17 00:00:00 2001 From: Terence Parr Date: Mon, 19 Mar 2012 18:47:41 -0700 Subject: [PATCH] got TestATNInterpreter working --- .../src/org/antlr/v4/runtime/atn/ATNConfig.java | 3 ++- .../org/antlr/v4/runtime/atn/ATNConfigSet.java | 17 +++++++++++++---- .../v4/runtime/atn/ArrayPredictionContext.java | 9 ++++++++- .../org/antlr/v4/runtime/atn/LL1Analyzer.java | 6 +++--- .../v4/runtime/atn/ParserATNSimulator.java | 2 +- .../antlr/v4/runtime/atn/PredictionContext.java | 4 ++-- .../runtime/atn/SingletonPredictionContext.java | 4 ++-- tool/playground/U.g | 17 ++++------------- .../org/antlr/v4/test/TestATNInterpreter.java | 4 ++-- 9 files changed, 37 insertions(+), 29 deletions(-) diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/ATNConfig.java b/runtime/Java/src/org/antlr/v4/runtime/atn/ATNConfig.java index eafc1764b..6201274d5 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/ATNConfig.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/ATNConfig.java @@ -170,8 +170,9 @@ public class ATNConfig { buf.append(alt); } if ( context!=null ) { - buf.append(","); + buf.append(",["); buf.append(context.toString(recog)); + buf.append("]"); } if ( semanticContext!=null && semanticContext != SemanticContext.NONE ) { buf.append(","); diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/ATNConfigSet.java b/runtime/Java/src/org/antlr/v4/runtime/atn/ATNConfigSet.java index 9493b410f..4970a8072 100755 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/ATNConfigSet.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/ATNConfigSet.java @@ -127,9 +127,15 @@ public class ATNConfigSet implements Set { public boolean add(ATNConfig value) { Key key = new Key(value); PredictionContext existing = configToContext.get(key); - if ( existing==null ) return false; + if ( existing==null ) { // nothing there yet; easy, just add + configs.add(value); + configToContext.put(key, value.context); + return true; + } + // a previous (s,i,pi,_), merge with it and save result PredictionContext merged = PredictionContext.merge(existing, value.context, true); - configToContext.put(key, merged); + configToContext.put(key, merged); // replace + // if already there, must be in configs already return true; } @@ -173,7 +179,7 @@ public class ATNConfigSet implements Set { @Override public String toString() { StringBuilder buf = new StringBuilder(); - buf.append(super.toString()); + buf.append(configs.toString()); if ( hasSemanticContext ) buf.append(",hasSemanticContext="+hasSemanticContext); if ( uniqueAlt!=ATN.INVALID_ALT_NUMBER ) buf.append(",uniqueAlt="+uniqueAlt); if ( conflictingAlts!=null ) buf.append(",conflictingAlts="+conflictingAlts); @@ -190,7 +196,10 @@ public class ATNConfigSet implements Set { } @Override - public boolean addAll(Collection c) { + public boolean addAll(Collection coll) { + for (ATNConfig c : coll) { + add(c); + } return false; } diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/ArrayPredictionContext.java b/runtime/Java/src/org/antlr/v4/runtime/atn/ArrayPredictionContext.java index 63442a979..c8af958a6 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/ArrayPredictionContext.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/ArrayPredictionContext.java @@ -113,6 +113,13 @@ public class ArrayPredictionContext extends PredictionContext { @Override public String toString() { - return Arrays.toString(invokingStates); + StringBuilder buf = new StringBuilder(); + buf.append("["); + for (int i=0; i< invokingStates.length; i++) { + buf.append(invokingStates[i]); + buf.append(parents[i].toString()); + } + buf.append("["); + return buf.toString(); } } diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/LL1Analyzer.java b/runtime/Java/src/org/antlr/v4/runtime/atn/LL1Analyzer.java index d95248d94..12716da1e 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/LL1Analyzer.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/LL1Analyzer.java @@ -93,7 +93,7 @@ public class LL1Analyzer { @NotNull Set lookBusy, boolean seeThruPreds) { - System.out.println("_LOOK("+s.stateNumber+", ctx="+ctx); +// System.out.println("_LOOK("+s.stateNumber+", ctx="+ctx); ATNConfig c = new ATNConfig(s, 0, ctx); if ( !lookBusy.add(c) ) return; @@ -108,7 +108,7 @@ public class LL1Analyzer { ATNState invokingState = atn.states.get(p.invokingState); RuleTransition rt = (RuleTransition)invokingState.transition(0); ATNState retState = rt.followState; - System.out.println("popping back to "+retState); +// System.out.println("popping back to "+retState); _LOOK(retState, p.parent, look, lookBusy, seeThruPreds); } return; @@ -135,7 +135,7 @@ public class LL1Analyzer { look.addAll( IntervalSet.of(Token.MIN_USER_TOKEN_TYPE, atn.maxTokenType) ); } else { - System.out.println("adding "+ t); +// System.out.println("adding "+ t); IntervalSet set = t.label(); if (set != null) { if (t instanceof NotSetTransition) { diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/ParserATNSimulator.java b/runtime/Java/src/org/antlr/v4/runtime/atn/ParserATNSimulator.java index b7d599c29..984a261aa 100755 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/ParserATNSimulator.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/ParserATNSimulator.java @@ -239,7 +239,7 @@ import java.util.Set; * holds the decision were evaluating */ public class ParserATNSimulator extends ATNSimulator { - public static boolean debug = false; + public static boolean debug = true; public static boolean dfa_debug = false; public static boolean retry_debug = false; diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/PredictionContext.java b/runtime/Java/src/org/antlr/v4/runtime/atn/PredictionContext.java index f14c81268..a0f231385 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/PredictionContext.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/PredictionContext.java @@ -1,6 +1,5 @@ package org.antlr.v4.runtime.atn; -import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.Recognizer; import org.antlr.v4.runtime.RuleContext; import org.antlr.v4.runtime.misc.Nullable; @@ -86,7 +85,8 @@ public abstract class PredictionContext implements Iterable recog) { - return toString(recog, ParserRuleContext.EMPTY); + return toString(); +// return toString(recog, ParserRuleContext.EMPTY); } // recog null unless ParserRuleContext, in which case we use subclass toString(...) diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/SingletonPredictionContext.java b/runtime/Java/src/org/antlr/v4/runtime/atn/SingletonPredictionContext.java index 3b6b3f882..45905a1b3 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/SingletonPredictionContext.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/SingletonPredictionContext.java @@ -17,7 +17,7 @@ public class SingletonPredictionContext extends PredictionContext { return new Iterator() { int i = 0; @Override - public boolean hasNext() { return i>0; } + public boolean hasNext() { return i==0; } @Override public SingletonPredictionContext next() { i++; return self; } @@ -73,6 +73,6 @@ public class SingletonPredictionContext extends PredictionContext { @Override public String toString() { - return String.valueOf(invokingState); + return String.valueOf(invokingState)+" "+parent.toString(); } } diff --git a/tool/playground/U.g b/tool/playground/U.g index ae193e846..216fa14b9 100644 --- a/tool/playground/U.g +++ b/tool/playground/U.g @@ -1,13 +1,4 @@ -grammar U; -s @after {System.out.println($ctx.toStringTree(this));} : e EOF ; -e : e '.' ID - | e '.' 'this' - | '-' e - | e '*' e - | e ('+'|'-') e - | INT - | ID - ; -ID : 'a'..'z'+ ; -INT : '0'..'9'+ ; -WS : (' '|'\n') {skip();} ; +lexer grammar U; +A : 'a' ; +B : 'b' ; +C : 'c' ; diff --git a/tool/test/org/antlr/v4/test/TestATNInterpreter.java b/tool/test/org/antlr/v4/test/TestATNInterpreter.java index fd813435c..c1dd604d5 100644 --- a/tool/test/org/antlr/v4/test/TestATNInterpreter.java +++ b/tool/test/org/antlr/v4/test/TestATNInterpreter.java @@ -2,7 +2,6 @@ package org.antlr.v4.test; import org.antlr.v4.automata.ParserATNFactory; import org.antlr.v4.runtime.NoViableAltException; -import org.antlr.v4.runtime.TokenStream; import org.antlr.v4.runtime.atn.ATN; import org.antlr.v4.runtime.atn.ATNState; import org.antlr.v4.runtime.atn.BlockStartState; @@ -285,7 +284,8 @@ public class TestATNInterpreter extends BaseTest { ParserATNFactory f = new ParserATNFactory(g); ATN atn = f.createATN(); - TokenStream input = new IntTokenStream(types); + IntTokenStream input = new IntTokenStream(types); + System.out.println("input="+input.types); ParserInterpreter interp = new ParserInterpreter(g, input); ATNState startState = atn.ruleToStartState[g.getRule("a").index]; if ( startState.transition(0).target instanceof BlockStartState ) {