1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * [The "BSD license"] 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2010 Terence Parr 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved. 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Redistribution and use in source and binary forms, with or without 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * modification, are permitted provided that the following conditions 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * are met: 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1. Redistributions of source code must retain the above copyright 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * notice, this list of conditions and the following disclaimer. 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 2. Redistributions in binary form must reproduce the above copyright 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * notice, this list of conditions and the following disclaimer in the 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * documentation and/or other materials provided with the distribution. 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 3. The name of the author may not be used to endorse or promote products 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * derived from this software without specific prior written permission. 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage org.antlr.tool; 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.Tool; 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.analysis.DFAState; 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.analysis.DecisionProbe; 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.misc.BitSet; 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.runtime.RecognitionException; 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.runtime.Token; 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.stringtemplate.v4.ST; 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.stringtemplate.v4.STErrorListener; 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.stringtemplate.v4.STGroup; 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.stringtemplate.v4.STGroupFile; 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.stringtemplate.v4.misc.STMessage; 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.io.BufferedReader; 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.io.IOException; 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.io.InputStream; 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.io.InputStreamReader; 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.lang.reflect.Field; 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.lang.reflect.InvocationTargetException; 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.util.*; 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Defines all the errors ANTLR can generator for both the tool and for 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * issues with a grammar. 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Here is a list of language names: 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * http://ftp.ics.uci.edu/pub/ietf/http/related/iso639.txt 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Here is a list of country names: 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * I use constants not strings to identify messages as the compiler will 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * find any errors/mismatches rather than leaving a mistyped string in 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the code to be found randomly in the future. Further, Intellij can 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * do field name expansion to save me some typing. I have to map 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * int constants to template names, however, which could introduce a mismatch. 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Someone could provide a .stg file that had a template name wrong. When 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * I load the group, then, I must verify that all messages are there. 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This is essentially the functionality of the resource bundle stuff Java 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * has, but I don't want to load a property file--I want to load a template 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * group file and this is so simple, why mess with their junk. 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * I use the default Locale as defined by java to compute a group file name 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in the org/antlr/tool/templates/messages dir called en_US.stg and so on. 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Normally we want to use the default locale, but often a message file will 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * not exist for it so we must fall back on the US local. 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * During initialization of this class, all errors go straight to System.err. 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * There is no way around this. If I have not set up the error system, how 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * can I do errors properly? For example, if the string template group file 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * full of messages has an error, how could I print to anything but System.err? 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * TODO: how to map locale to a file encoding for the stringtemplate group file? 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ST knows how to pay attention to the default encoding so it 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * should probably just work unless a GUI sets the local to some chinese 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * variation but System.getProperty("file.encoding") is US. Hmm... 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * TODO: get antlr.g etc.. parsing errors to come here. 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic class ErrorManager { 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // TOOL ERRORS 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // file errors 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_CANNOT_WRITE_FILE = 1; 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_CANNOT_CLOSE_FILE = 2; 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_CANNOT_FIND_TOKENS_FILE = 3; 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_ERROR_READING_TOKENS_FILE = 4; 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_DIR_NOT_FOUND = 5; 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_OUTPUT_DIR_IS_FILE = 6; 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_CANNOT_OPEN_FILE = 7; 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_FILE_AND_GRAMMAR_NAME_DIFFER = 8; 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_FILENAME_EXTENSION_ERROR = 9; 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_INTERNAL_ERROR = 10; 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_INTERNAL_WARNING = 11; 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_ERROR_CREATING_ARTIFICIAL_RULE = 12; 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_TOKENS_FILE_SYNTAX_ERROR = 13; 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_CANNOT_GEN_DOT_FILE = 14; 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_BAD_AST_STRUCTURE = 15; 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_BAD_ACTION_AST_STRUCTURE = 16; 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // code gen errors 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_MISSING_CODE_GEN_TEMPLATES = 20; 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_MISSING_CYCLIC_DFA_CODE_GEN_TEMPLATES = 21; 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_CODE_GEN_TEMPLATES_INCOMPLETE = 22; 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_CANNOT_CREATE_TARGET_GENERATOR = 23; 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //public static final int MSG_CANNOT_COMPUTE_SAMPLE_INPUT_SEQ = 24; 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // GRAMMAR ERRORS 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_SYNTAX_ERROR = 100; 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_RULE_REDEFINITION = 101; 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_LEXER_RULES_NOT_ALLOWED = 102; 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_PARSER_RULES_NOT_ALLOWED = 103; 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_CANNOT_FIND_ATTRIBUTE_NAME_IN_DECL = 104; 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_NO_TOKEN_DEFINITION = 105; 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_UNDEFINED_RULE_REF = 106; 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_LITERAL_NOT_ASSOCIATED_WITH_LEXER_RULE = 107; 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_CANNOT_ALIAS_TOKENS_IN_LEXER = 108; 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_ATTRIBUTE_REF_NOT_IN_RULE = 111; 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_INVALID_RULE_SCOPE_ATTRIBUTE_REF = 112; 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_UNKNOWN_ATTRIBUTE_IN_SCOPE = 113; 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_UNKNOWN_SIMPLE_ATTRIBUTE = 114; 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_INVALID_RULE_PARAMETER_REF = 115; 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_UNKNOWN_RULE_ATTRIBUTE = 116; 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_ISOLATED_RULE_SCOPE = 117; 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_SYMBOL_CONFLICTS_WITH_GLOBAL_SCOPE = 118; 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_LABEL_CONFLICTS_WITH_RULE = 119; 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_LABEL_CONFLICTS_WITH_TOKEN = 120; 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_LABEL_CONFLICTS_WITH_RULE_SCOPE_ATTRIBUTE = 121; 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_LABEL_CONFLICTS_WITH_RULE_ARG_RETVAL = 122; 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_ATTRIBUTE_CONFLICTS_WITH_RULE = 123; 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_ATTRIBUTE_CONFLICTS_WITH_RULE_ARG_RETVAL = 124; 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_LABEL_TYPE_CONFLICT = 125; 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_ARG_RETVAL_CONFLICT = 126; 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_NONUNIQUE_REF = 127; 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_FORWARD_ELEMENT_REF = 128; 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_MISSING_RULE_ARGS = 129; 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_RULE_HAS_NO_ARGS = 130; 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_ARGS_ON_TOKEN_REF = 131; 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_RULE_REF_AMBIG_WITH_RULE_IN_ALT = 132; 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_ILLEGAL_OPTION = 133; 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_LIST_LABEL_INVALID_UNLESS_RETVAL_STRUCT = 134; 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_UNDEFINED_TOKEN_REF_IN_REWRITE = 135; 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_REWRITE_ELEMENT_NOT_PRESENT_ON_LHS = 136; 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_UNDEFINED_LABEL_REF_IN_REWRITE = 137; 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_NO_GRAMMAR_START_RULE = 138; 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_EMPTY_COMPLEMENT = 139; 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_UNKNOWN_DYNAMIC_SCOPE = 140; 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_UNKNOWN_DYNAMIC_SCOPE_ATTRIBUTE = 141; 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_ISOLATED_RULE_ATTRIBUTE = 142; 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_INVALID_ACTION_SCOPE = 143; 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_ACTION_REDEFINITION = 144; 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_DOUBLE_QUOTES_ILLEGAL = 145; 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_INVALID_TEMPLATE_ACTION = 146; 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_MISSING_ATTRIBUTE_NAME = 147; 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_ARG_INIT_VALUES_ILLEGAL = 148; 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_REWRITE_OR_OP_WITH_NO_OUTPUT_OPTION = 149; 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_NO_RULES = 150; 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_WRITE_TO_READONLY_ATTR = 151; 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_MISSING_AST_TYPE_IN_TREE_GRAMMAR = 152; 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_REWRITE_FOR_MULTI_ELEMENT_ALT = 153; 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_RULE_INVALID_SET = 154; 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_HETERO_ILLEGAL_IN_REWRITE_ALT = 155; 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_NO_SUCH_GRAMMAR_SCOPE = 156; 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_NO_SUCH_RULE_IN_SCOPE = 157; 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_TOKEN_ALIAS_CONFLICT = 158; 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_TOKEN_ALIAS_REASSIGNMENT = 159; 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_TOKEN_VOCAB_IN_DELEGATE = 160; 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_INVALID_IMPORT = 161; 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_IMPORTED_TOKENS_RULE_EMPTY = 162; 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_IMPORT_NAME_CLASH = 163; 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_AST_OP_WITH_NON_AST_OUTPUT_OPTION = 164; 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_AST_OP_IN_ALT_WITH_REWRITE = 165; 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_WILDCARD_AS_ROOT = 166; 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_CONFLICTING_OPTION_IN_TREE_FILTER = 167; 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_ILLEGAL_OPTION_VALUE = 168; 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_ALL_OPS_NEED_SAME_ASSOC = 169; 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // GRAMMAR WARNINGS 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_GRAMMAR_NONDETERMINISM = 200; // A predicts alts 1,2 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_UNREACHABLE_ALTS = 201; // nothing predicts alt i 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_DANGLING_STATE = 202; // no edges out of state 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_INSUFFICIENT_PREDICATES = 203; 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_DUPLICATE_SET_ENTRY = 204; // (A|A) 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_ANALYSIS_ABORTED = 205; 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_RECURSION_OVERLOW = 206; 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_LEFT_RECURSION = 207; 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_UNREACHABLE_TOKENS = 208; // nothing predicts token 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_TOKEN_NONDETERMINISM = 209; // alts of Tokens rule 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_LEFT_RECURSION_CYCLES = 210; 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_NONREGULAR_DECISION = 211; 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Dependency sorting errors 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MSG_CIRCULAR_DEPENDENCY = 212; // t1.g -> t2.g -> t3.g ->t1.g 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int MAX_MESSAGE_NUMBER = 212; 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Do not do perform analysis if one of these happens */ 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final BitSet ERRORS_FORCING_NO_ANALYSIS = new BitSet() { 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver add(MSG_RULE_REDEFINITION); 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver add(MSG_UNDEFINED_RULE_REF); 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver add(MSG_LEFT_RECURSION_CYCLES); 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver add(MSG_REWRITE_OR_OP_WITH_NO_OUTPUT_OPTION); 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver add(MSG_NO_RULES); 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver add(MSG_NO_SUCH_GRAMMAR_SCOPE); 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver add(MSG_NO_SUCH_RULE_IN_SCOPE); 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver add(MSG_LEXER_RULES_NOT_ALLOWED); 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver add(MSG_WILDCARD_AS_ROOT); 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver add(MSG_CIRCULAR_DEPENDENCY); 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // TODO: ... 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }; 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Do not do code gen if one of these happens */ 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final BitSet ERRORS_FORCING_NO_CODEGEN = new BitSet() { 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver add(MSG_NONREGULAR_DECISION); 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver add(MSG_RECURSION_OVERLOW); 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver add(MSG_UNREACHABLE_ALTS); 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver add(MSG_FILE_AND_GRAMMAR_NAME_DIFFER); 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver add(MSG_INVALID_IMPORT); 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver add(MSG_AST_OP_WITH_NON_AST_OUTPUT_OPTION); 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver add(MSG_CIRCULAR_DEPENDENCY); 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // TODO: ... 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }; 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Only one error can be emitted for any entry in this table. 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Map<String,Set> where the key is a method name like danglingState. 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The set is whatever that method accepts or derives like a DFA. 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final Map emitSingleError = new HashMap() { 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver put("danglingState", new HashSet()); 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }; 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Messages should be sensitive to the locale. */ 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private static Locale locale; 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private static String formatName; 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Each thread might need it's own error listener; e.g., a GUI with 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * multiple window frames holding multiple grammars. 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private static Map threadToListenerMap = new HashMap(); 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver static class ErrorState { 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public int errors; 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public int warnings; 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public int infos; 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Track all msgIDs; we use to abort later if necessary 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * also used in Message to find out what type of message it is via getMessageType() 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public BitSet errorMsgIDs = new BitSet(); 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public BitSet warningMsgIDs = new BitSet(); 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // TODO: figure out how to do info messages. these do not have IDs...kr 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //public BitSet infoMsgIDs = new BitSet(); 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Track the number of errors regardless of the listener but track 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * per thread. 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private static Map threadToErrorStateMap = new HashMap(); 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Each thread has its own ptr to a Tool object, which knows how 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to panic, for example. In a GUI, the thread might just throw an Error 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to exit rather than the suicide System.exit. 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private static Map threadToToolMap = new HashMap(); 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** The group of templates that represent all possible ANTLR errors. */ 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private static STGroup messages; 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** The group of templates that represent the current message format. */ 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private static STGroup format; 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** From a msgID how can I get the name of the template that describes 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the error or warning? 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private static String[] idToMessageTemplateName = new String[MAX_MESSAGE_NUMBER+1]; 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver static ANTLRErrorListener theDefaultErrorListener = new ANTLRErrorListener() { 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void info(String msg) { 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (formatWantsSingleLineMessage()) { 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver msg = msg.replaceAll("\n", " "); 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(msg); 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void error(Message msg) { 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String outputMsg = msg.toString(); 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (formatWantsSingleLineMessage()) { 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outputMsg = outputMsg.replaceAll("\n", " "); 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(outputMsg); 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void warning(Message msg) { 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String outputMsg = msg.toString(); 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (formatWantsSingleLineMessage()) { 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outputMsg = outputMsg.replaceAll("\n", " "); 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(outputMsg); 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void error(ToolMessage msg) { 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String outputMsg = msg.toString(); 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (formatWantsSingleLineMessage()) { 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outputMsg = outputMsg.replaceAll("\n", " "); 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(outputMsg); 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }; 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Handle all ST error listeners here (code gen, Grammar, and this class 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * use templates. 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver static STErrorListener initSTListener = 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver new STErrorListener() { 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void compileTimeError(STMessage msg) { 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("ErrorManager init error: "+msg); 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void runTimeError(STMessage msg) { 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("ErrorManager init error: "+msg); 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void IOError(STMessage msg) { 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("ErrorManager init error: "+msg); 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void internalError(STMessage msg) { 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("ErrorManager init error: "+msg); 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }; 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** During verification of the messages group file, don't gen errors. 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * I'll handle them here. This is used only after file has loaded ok 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * and only for the messages STG. 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver static STErrorListener blankSTListener = 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver new STErrorListener() { 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void compileTimeError(STMessage msg) { } 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void runTimeError(STMessage msg) { } 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void IOError(STMessage msg) { } 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void internalError(STMessage msg) { } 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }; 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Errors during initialization related to ST must all go to System.err. 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver static STErrorListener theDefaultSTListener = 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver new STErrorListener() { 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void compileTimeError(STMessage msg) { 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.error(ErrorManager.MSG_INTERNAL_ERROR, msg.toString(), msg.cause); 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void runTimeError(STMessage msg) { 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.error(ErrorManager.MSG_INTERNAL_ERROR, msg.toString(), msg.cause); 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void IOError(STMessage msg) { 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.error(ErrorManager.MSG_INTERNAL_ERROR, msg.toString(), msg.cause); 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void internalError(STMessage msg) { 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.error(ErrorManager.MSG_INTERNAL_ERROR, msg.toString(), msg.cause); 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }; 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // make sure that this class is ready to use after loading 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver static { 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver initIdToMessageNameMapping(); 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // it is inefficient to set the default locale here if another 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // piece of code is going to set the locale, but that would 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // require that a user call an init() function or something. I prefer 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // that this class be ready to go when loaded as I'm absentminded ;) 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setLocale(Locale.getDefault()); 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // try to load the message format group 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // the user might have specified one on the command line 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // if not, or if the user has given an illegal value, we will fall back to "antlr" 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setFormat("antlr"); 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static STErrorListener getSTErrorListener() { 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return theDefaultSTListener; 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** We really only need a single locale for entire running ANTLR code 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in a single VM. Only pay attention to the language, not the country 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * so that French Canadians and French Frenchies all get the same 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * template file, fr.stg. Just easier this way. 405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void setLocale(Locale locale) { 407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.locale = locale; 408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String language = locale.getLanguage(); 409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String fileName = "org/antlr/tool/templates/messages/languages/"+language+".stg"; 410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try { 411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver messages = new STGroupFile(fileName); 412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver catch (IllegalArgumentException iae) { 414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( language.equals(Locale.US.getLanguage()) ) { 415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rawError("ANTLR installation corrupted; cannot find English messages file "+fileName); 416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver panic(); 417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setLocale(Locale.US); // recurse on this rule, trying the US locale 420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver messages.setListener(blankSTListener); 424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver boolean messagesOK = verifyMessages(); 425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !messagesOK && language.equals(Locale.US.getLanguage()) ) { 426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rawError("ANTLR installation corrupted; English messages file "+language+".stg incomplete"); 427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver panic(); 428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if ( !messagesOK ) { 430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setLocale(Locale.US); // try US to see if that will work 431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** The format gets reset either from the Tool if the user supplied a command line option to that effect 435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Otherwise we just use the default "antlr". 436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void setFormat(String formatName) { 438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.formatName = formatName; 439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String fileName = "org/antlr/tool/templates/messages/formats/"+formatName+".stg"; 440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver format = new STGroupFile(fileName); 441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver format.setListener(initSTListener); 442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !format.isDefined("message") ) { // pick random msg to load 443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( formatName.equals("antlr") ) { 444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rawError("no such message format file "+fileName+" retrying with default ANTLR format"); 445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setFormat("antlr"); // recurse on this rule, trying the default message format 446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setFormat("antlr"); // recurse on this rule, trying the default message format 450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver format.setListener(blankSTListener); 454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver boolean formatOK = verifyFormat(); 455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !formatOK && formatName.equals("antlr") ) { 456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rawError("ANTLR installation corrupted; ANTLR messages format file "+formatName+".stg incomplete"); 457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver panic(); 458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if ( !formatOK ) { 460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setFormat("antlr"); // recurse on this rule, trying the default message format 461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Encodes the error handling found in setLocale, but does not trigger 465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * panics, which would make GUI tools die if ANTLR's installation was 466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * a bit screwy. Duplicated code...ick. 467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static Locale getLocaleForValidMessages(Locale locale) { 468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.locale = locale; 469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String language = locale.getLanguage(); 470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String fileName = "org/antlr/tool/templates/messages/"+language+".stg"; 471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ClassLoader cl = Thread.currentThread().getContextClassLoader(); 472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver InputStream is = cl.getResourceAsStream(fileName); 473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( is==null && language.equals(Locale.US.getLanguage()) ) { 474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if ( is==null ) { 477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return getLocaleForValidMessages(Locale.US); // recurse on this rule, trying the US locale 478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver boolean messagesOK = verifyMessages(); 481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !messagesOK && language.equals(Locale.US.getLanguage()) ) { 482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if ( !messagesOK ) { 485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return getLocaleForValidMessages(Locale.US); // try US to see if that will work 486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** In general, you'll want all errors to go to a single spot. 492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * However, in a GUI, you might have two frames up with two 493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * different grammars. Two threads might launch to process the 494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * grammars--you would want errors to go to different objects 495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * depending on the thread. I store a single listener per 496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * thread. 497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void setErrorListener(ANTLRErrorListener listener) { 499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver threadToListenerMap.put(Thread.currentThread(), listener); 500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void removeErrorListener() { 503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver threadToListenerMap.remove(Thread.currentThread()); 504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void setTool(Tool tool) { 507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver threadToToolMap.put(Thread.currentThread(), tool); 508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Given a message ID, return a ST that somebody can fill 511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * with data. We need to convert the int ID to the name of a template 512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in the messages ST group. 513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static ST getMessage(int msgID) { 515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String msgName = idToMessageTemplateName[msgID]; 516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return messages.getInstanceOf(msgName); 517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static String getMessageType(int msgID) { 519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (getErrorState().warningMsgIDs.member(msgID)) { 520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return messages.getInstanceOf("warning").render(); 521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (getErrorState().errorMsgIDs.member(msgID)) { 523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return messages.getInstanceOf("error").render(); 524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertTrue(false, "Assertion failed! Message ID " + msgID + " created but is not present in errorMsgIDs or warningMsgIDs."); 526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ""; 527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Return a ST that refers to the current format used for 530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * emitting messages. 531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static ST getLocationFormat() { 533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return format.getInstanceOf("location"); 534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static ST getReportFormat() { 536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return format.getInstanceOf("report"); 537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static ST getMessageFormat() { 539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return format.getInstanceOf("message"); 540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static boolean formatWantsSingleLineMessage() { 542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return format.getInstanceOf("wantsSingleLineMessage").render().equals("true"); 543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static ANTLRErrorListener getErrorListener() { 546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLRErrorListener el = 547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (ANTLRErrorListener)threadToListenerMap.get(Thread.currentThread()); 548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( el==null ) { 549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return theDefaultErrorListener; 550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return el; 552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static ErrorState getErrorState() { 555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorState ec = 556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (ErrorState)threadToErrorStateMap.get(Thread.currentThread()); 557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( ec==null ) { 558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ec = new ErrorState(); 559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver threadToErrorStateMap.put(Thread.currentThread(), ec); 560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ec; 562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static int getNumErrors() { 565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return getErrorState().errors; 566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void resetErrorState() { 569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver threadToListenerMap = new HashMap(); 570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorState ec = new ErrorState(); 571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver threadToErrorStateMap.put(Thread.currentThread(), ec); 572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void info(String msg) { 575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().infos++; 576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorListener().info(msg); 577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void error(int msgID) { 580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errors++; 581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errorMsgIDs.add(msgID); 582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorListener().error(new ToolMessage(msgID)); 583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void error(int msgID, Throwable e) { 586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errors++; 587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errorMsgIDs.add(msgID); 588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorListener().error(new ToolMessage(msgID,e)); 589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void error(int msgID, Object arg) { 592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errors++; 593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errorMsgIDs.add(msgID); 594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorListener().error(new ToolMessage(msgID, arg)); 595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void error(int msgID, Object arg, Object arg2) { 598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errors++; 599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errorMsgIDs.add(msgID); 600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorListener().error(new ToolMessage(msgID, arg, arg2)); 601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void error(int msgID, Object arg, Throwable e) { 604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errors++; 605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errorMsgIDs.add(msgID); 606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorListener().error(new ToolMessage(msgID, arg, e)); 607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void warning(int msgID, Object arg) { 610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().warnings++; 611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().warningMsgIDs.add(msgID); 612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorListener().warning(new ToolMessage(msgID, arg)); 613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void nondeterminism(DecisionProbe probe, 616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DFAState d) 617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().warnings++; 619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Message msg = new GrammarNonDeterminismMessage(probe,d); 620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().warningMsgIDs.add(msg.msgID); 621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorListener().warning(msg); 622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void danglingState(DecisionProbe probe, 625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DFAState d) 626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errors++; 628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Message msg = new GrammarDanglingStateMessage(probe,d); 629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errorMsgIDs.add(msg.msgID); 630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Set seen = (Set)emitSingleError.get("danglingState"); 631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !seen.contains(d.dfa.decisionNumber+"|"+d.getAltSet()) ) { 632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorListener().error(msg); 633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // we've seen this decision and this alt set; never again 634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver seen.add(d.dfa.decisionNumber+"|"+d.getAltSet()); 635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void analysisAborted(DecisionProbe probe) 639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().warnings++; 641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Message msg = new GrammarAnalysisAbortedMessage(probe); 642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().warningMsgIDs.add(msg.msgID); 643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorListener().warning(msg); 644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void unreachableAlts(DecisionProbe probe, 647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver List alts) 648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errors++; 650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Message msg = new GrammarUnreachableAltsMessage(probe,alts); 651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errorMsgIDs.add(msg.msgID); 652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorListener().error(msg); 653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void insufficientPredicates(DecisionProbe probe, 656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DFAState d, 657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Map<Integer, Set<Token>> altToUncoveredLocations) 658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().warnings++; 660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Message msg = new GrammarInsufficientPredicatesMessage(probe,d,altToUncoveredLocations); 661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().warningMsgIDs.add(msg.msgID); 662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorListener().warning(msg); 663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void nonLLStarDecision(DecisionProbe probe) { 666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errors++; 667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Message msg = new NonRegularDecisionMessage(probe, probe.getNonDeterministicAlts()); 668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errorMsgIDs.add(msg.msgID); 669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorListener().error(msg); 670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void recursionOverflow(DecisionProbe probe, 673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DFAState sampleBadState, 674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int alt, 675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Collection targetRules, 676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Collection callSiteStates) 677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errors++; 679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Message msg = new RecursionOverflowMessage(probe,sampleBadState, alt, 680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver targetRules, callSiteStates); 681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errorMsgIDs.add(msg.msgID); 682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorListener().error(msg); 683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* 686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // TODO: we can remove I think. All detected now with cycles check. 687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void leftRecursion(DecisionProbe probe, 688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int alt, 689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Collection targetRules, 690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Collection callSiteStates) 691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().warnings++; 693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Message msg = new LeftRecursionMessage(probe, alt, targetRules, callSiteStates); 694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().warningMsgIDs.add(msg.msgID); 695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorListener().warning(msg); 696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void leftRecursionCycles(Collection cycles) { 700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errors++; 701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Message msg = new LeftRecursionCyclesMessage(cycles); 702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errorMsgIDs.add(msg.msgID); 703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorListener().error(msg); 704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void grammarError(int msgID, 707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar g, 708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Token token, 709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Object arg, 710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Object arg2) 711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errors++; 713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Message msg = new GrammarSemanticsMessage(msgID,g,token,arg,arg2); 714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errorMsgIDs.add(msgID); 715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorListener().error(msg); 716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void grammarError(int msgID, 719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar g, 720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Token token, 721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Object arg) 722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammarError(msgID,g,token,arg,null); 724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void grammarError(int msgID, 727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar g, 728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Token token) 729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammarError(msgID,g,token,null,null); 731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void grammarWarning(int msgID, 734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar g, 735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Token token, 736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Object arg, 737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Object arg2) 738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().warnings++; 740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Message msg = new GrammarSemanticsMessage(msgID,g,token,arg,arg2); 741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().warningMsgIDs.add(msgID); 742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorListener().warning(msg); 743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void grammarWarning(int msgID, 746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar g, 747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Token token, 748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Object arg) 749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammarWarning(msgID,g,token,arg,null); 751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void grammarWarning(int msgID, 754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar g, 755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Token token) 756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammarWarning(msgID,g,token,null,null); 758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void syntaxError(int msgID, 761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar grammar, 762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Token token, 763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Object arg, 764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver RecognitionException re) 765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errors++; 767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorState().errorMsgIDs.add(msgID); 768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getErrorListener().error( 769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver new GrammarSyntaxMessage(msgID,grammar,token,arg,re) 770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ); 771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void internalError(Object error, Throwable e) { 774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StackTraceElement location = getLastNonErrorManagerCodeLocation(e); 775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String msg = "Exception "+e+"@"+location+": "+error; 776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver error(MSG_INTERNAL_ERROR, msg); 777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void internalError(Object error) { 780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StackTraceElement location = 781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getLastNonErrorManagerCodeLocation(new Exception()); 782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String msg = location+": "+error; 783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver error(MSG_INTERNAL_ERROR, msg); 784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static boolean doNotAttemptAnalysis() { 787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return !getErrorState().errorMsgIDs.and(ERRORS_FORCING_NO_ANALYSIS).isNil(); 788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static boolean doNotAttemptCodeGen() { 791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return doNotAttemptAnalysis() || 792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver !getErrorState().errorMsgIDs.and(ERRORS_FORCING_NO_CODEGEN).isNil(); 793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Return first non ErrorManager code location for generating messages */ 796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private static StackTraceElement getLastNonErrorManagerCodeLocation(Throwable e) { 797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StackTraceElement[] stack = e.getStackTrace(); 798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int i = 0; 799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (; i < stack.length; i++) { 800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StackTraceElement t = stack[i]; 801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( t.toString().indexOf("ErrorManager")<0 ) { 802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StackTraceElement location = stack[i]; 806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return location; 807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // A S S E R T I O N C O D E 810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void assertTrue(boolean condition, String message) { 812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !condition ) { 813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver internalError(message); 814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // S U P P O R T C O D E 818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected static boolean initIdToMessageNameMapping() { 820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // make sure a message exists, even if it's just to indicate a problem 821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (int i = 0; i < idToMessageTemplateName.length; i++) { 822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver idToMessageTemplateName[i] = "INVALID MESSAGE ID: "+i; 823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // get list of fields and use it to fill in idToMessageTemplateName mapping 825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Field[] fields = ErrorManager.class.getFields(); 826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (int i = 0; i < fields.length; i++) { 827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Field f = fields[i]; 828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String fieldName = f.getName(); 829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !fieldName.startsWith("MSG_") ) { 830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver continue; 831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String templateName = 833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fieldName.substring("MSG_".length(),fieldName.length()); 834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int msgID = 0; 835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try { 836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // get the constant value from this class object 837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver msgID = f.getInt(ErrorManager.class); 838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver catch (IllegalAccessException iae) { 840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("cannot get const value for "+f.getName()); 841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver continue; 842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( fieldName.startsWith("MSG_") ) { 844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver idToMessageTemplateName[msgID] = templateName; 845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Use reflection to find list of MSG_ fields and then verify a 851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * template exists for each one from the locale's group. 852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected static boolean verifyMessages() { 854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver boolean ok = true; 855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Field[] fields = ErrorManager.class.getFields(); 856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (int i = 0; i < fields.length; i++) { 857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Field f = fields[i]; 858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String fieldName = f.getName(); 859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String templateName = 860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fieldName.substring("MSG_".length(),fieldName.length()); 861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( fieldName.startsWith("MSG_") ) { 862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !messages.isDefined(templateName) ) { 863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("Message "+templateName+" in locale "+ 864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver locale+" not found"); 865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ok = false; 866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // check for special templates 870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!messages.isDefined("warning")) { 871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("Message template 'warning' not found in locale "+ locale); 872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ok = false; 873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!messages.isDefined("error")) { 875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("Message template 'error' not found in locale "+ locale); 876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ok = false; 877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ok; 879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Verify the message format template group */ 882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected static boolean verifyFormat() { 883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver boolean ok = true; 884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!format.isDefined("location")) { 885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("Format template 'location' not found in " + formatName); 886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ok = false; 887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!format.isDefined("message")) { 889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("Format template 'message' not found in " + formatName); 890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ok = false; 891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!format.isDefined("report")) { 893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("Format template 'report' not found in " + formatName); 894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ok = false; 895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ok; 897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** If there are errors during ErrorManager init, we have no choice 900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * but to go to System.err. 901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver static void rawError(String msg) { 903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println(msg); 904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver static void rawError(String msg, Throwable e) { 907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rawError(msg); 908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver e.printStackTrace(System.err); 909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** I *think* this will allow Tool subclasses to exit gracefully 912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * for GUIs etc... 913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void panic() { 915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Tool tool = (Tool)threadToToolMap.get(Thread.currentThread()); 916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( tool==null ) { 917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // no tool registered, exit 918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("ANTLR ErrorManager panic"); 919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tool.panic(); 922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 925