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