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