1 /* 2 * Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. 3 * Use of this file is governed by the BSD 3-clause license that 4 * can be found in the LICENSE.txt file in the project root. 5 */ 6 7 package org.antlr.v4.test.tool; 8 9 import org.antlr.v4.Tool; 10 import org.antlr.v4.runtime.Parser; 11 import org.antlr.v4.runtime.ParserRuleContext; 12 import org.antlr.v4.runtime.TokenStream; 13 import org.antlr.v4.runtime.atn.ATN; 14 import org.antlr.v4.runtime.atn.ATNState; 15 import org.antlr.v4.runtime.atn.DecisionState; 16 import org.antlr.v4.runtime.atn.ParserATNSimulator; 17 import org.antlr.v4.runtime.atn.PredictionContextCache; 18 import org.antlr.v4.runtime.dfa.DFA; 19 import org.antlr.v4.tool.Grammar; 20 21 public class ParserInterpreterForTesting { 22 public static class DummyParser extends Parser { 23 public final ATN atn; 24 public final DFA[] decisionToDFA; // not shared for interp 25 public final PredictionContextCache sharedContextCache = 26 new PredictionContextCache(); 27 28 public Grammar g; DummyParser(Grammar g, ATN atn, TokenStream input)29 public DummyParser(Grammar g, ATN atn, TokenStream input) { 30 super(input); 31 this.g = g; 32 this.atn = atn; 33 this.decisionToDFA = new DFA[atn.getNumberOfDecisions()]; 34 for (int i = 0; i < decisionToDFA.length; i++) { 35 decisionToDFA[i] = new DFA(atn.getDecisionState(i), i); 36 } 37 } 38 39 @Override getGrammarFileName()40 public String getGrammarFileName() { 41 throw new UnsupportedOperationException("not implemented"); 42 } 43 44 @Override getRuleNames()45 public String[] getRuleNames() { 46 return g.rules.keySet().toArray(new String[g.rules.size()]); 47 } 48 49 @Override 50 @Deprecated getTokenNames()51 public String[] getTokenNames() { 52 return g.getTokenNames(); 53 } 54 55 @Override getATN()56 public ATN getATN() { 57 return atn; 58 } 59 } 60 61 protected Grammar g; 62 public DummyParser parser; 63 protected ParserATNSimulator atnSimulator; 64 protected TokenStream input; 65 ParserInterpreterForTesting(Grammar g)66 public ParserInterpreterForTesting(Grammar g) { 67 this.g = g; 68 } 69 ParserInterpreterForTesting(Grammar g, TokenStream input)70 public ParserInterpreterForTesting(Grammar g, TokenStream input) { 71 Tool antlr = new Tool(); 72 antlr.process(g,false); 73 parser = new DummyParser(g, g.atn, input); 74 atnSimulator = 75 new ParserATNSimulator(parser, g.atn, parser.decisionToDFA, 76 parser.sharedContextCache); 77 } 78 adaptivePredict(TokenStream input, int decision, ParserRuleContext outerContext)79 public int adaptivePredict(TokenStream input, int decision, 80 ParserRuleContext outerContext) 81 { 82 return atnSimulator.adaptivePredict(input, decision, outerContext); 83 } 84 matchATN(TokenStream input, ATNState startState)85 public int matchATN(TokenStream input, 86 ATNState startState) 87 { 88 if (startState.getNumberOfTransitions() == 1) { 89 return 1; 90 } 91 else if (startState instanceof DecisionState) { 92 return atnSimulator.adaptivePredict(input, ((DecisionState)startState).decision, null); 93 } 94 else if (startState.getNumberOfTransitions() > 0) { 95 return 1; 96 } 97 else { 98 return -1; 99 } 100 } 101 getATNSimulator()102 public ParserATNSimulator getATNSimulator() { 103 return atnSimulator; 104 } 105 106 } 107