1/* 2 * [The "BSD license"] 3 * Copyright (c) 2010 Terence Parr 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. The name of the author may not be used to endorse or promote products 15 * derived from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28package org.antlr.tool; 29 30import org.antlr.analysis.DFAState; 31import org.antlr.analysis.DecisionProbe; 32import org.antlr.analysis.Label; 33import org.antlr.runtime.Token; 34import org.stringtemplate.v4.ST; 35 36import java.util.*; 37 38public class GrammarInsufficientPredicatesMessage extends Message { 39 public DecisionProbe probe; 40 public Map<Integer, Set<Token>> altToLocations; 41 public DFAState problemState; 42 43 public GrammarInsufficientPredicatesMessage(DecisionProbe probe, 44 DFAState problemState, 45 Map<Integer, Set<Token>> altToLocations) 46 { 47 super(ErrorManager.MSG_INSUFFICIENT_PREDICATES); 48 this.probe = probe; 49 this.problemState = problemState; 50 this.altToLocations = altToLocations; 51 } 52 53 public String toString() { 54 GrammarAST decisionASTNode = probe.dfa.getDecisionASTNode(); 55 line = decisionASTNode.getLine(); 56 column = decisionASTNode.getCharPositionInLine(); 57 String fileName = probe.dfa.nfa.grammar.getFileName(); 58 if ( fileName!=null ) { 59 file = fileName; 60 } 61 ST st = getMessageTemplate(); 62 // convert to string key to avoid 3.1 ST bug 63 Map<String, Set<Token>> altToLocationsWithStringKey = new LinkedHashMap<String, Set<Token>>(); 64 List<Integer> alts = new ArrayList<Integer>(); 65 alts.addAll(altToLocations.keySet()); 66 Collections.sort(alts); 67 for (Integer altI : alts) { 68 altToLocationsWithStringKey.put(altI.toString(), altToLocations.get(altI)); 69 /* 70 List<String> tokens = new ArrayList<String>(); 71 for (Token t : altToLocations.get(altI)) { 72 tokens.add(t.toString()); 73 } 74 Collections.sort(tokens); 75 System.out.println("tokens=\n"+tokens); 76 */ 77 } 78 st.add("altToLocations", altToLocationsWithStringKey); 79 80 List<Label> sampleInputLabels = problemState.dfa.probe.getSampleNonDeterministicInputSequence(problemState); 81 String input = problemState.dfa.probe.getInputSequenceDisplay(sampleInputLabels); 82 st.add("upon", input); 83 84 st.add("hasPredicateBlockedByAction", problemState.dfa.hasPredicateBlockedByAction); 85 86 return super.toString(st); 87 } 88 89} 90