diff --git a/tool/src/org/antlr/v4/tool/ErrorType.java b/tool/src/org/antlr/v4/tool/ErrorType.java index 4e7222754..451a03a41 100644 --- a/tool/src/org/antlr/v4/tool/ErrorType.java +++ b/tool/src/org/antlr/v4/tool/ErrorType.java @@ -30,6 +30,7 @@ package org.antlr.v4.tool; import org.antlr.v4.Tool; +import org.antlr.v4.runtime.Lexer; /** * A complex enumeration of all the error messages that the tool can issue. @@ -42,97 +43,577 @@ import org.antlr.v4.Tool; * @since 4.0 */ public enum ErrorType { - // Tool errors + /* + * Tool errors + */ + + /** + * Compiler Error 1. + * + *
cannot write file 'filename': reason
+ */ CANNOT_WRITE_FILE(1, "cannot write file 'unknown command-line option 'option'
+ */ INVALID_CMDLINE_ARG(2, "unknown command-line option 'cannot find tokens file 'filename'
+ */ CANNOT_FIND_TOKENS_FILE(3, "cannot find tokens file 'cannot find tokens file 'filename': reason
+ */ ERROR_READING_TOKENS_FILE(4, "cannot find tokens file 'directory not found: directory
+ */ DIR_NOT_FOUND(5, "directory not found:output directory is a file: filename
+ */ OUTPUT_DIR_IS_FILE(6, "output directory is a file:cannot find or open file: filename
+ */ CANNOT_OPEN_FILE(7, "cannot find or open file:+ * grammar name 'name' and file name 'filename' differ
+ */ FILE_AND_GRAMMAR_NAME_DIFFER(8, "grammar name 'invalid {@code -Dname=value} syntax: 'syntax'
+ */ BAD_OPTION_SET_SYNTAX(9, "invalid -Dname=value syntax: 'warning treated as error
+ */ WARNING_TREATED_AS_ERROR(10, "warning treated as error", ErrorSeverity.ERROR_ONE_OFF), + /** + * Compiler Error 20. + * + *internal error: message
+ */ INTERNAL_ERROR(20, "internal error:.tokens file syntax error filename: message
+ */ TOKENS_FILE_SYNTAX_ERROR(21, ".tokens file syntax errortemplate error: message
+ */ STRING_TEMPLATE_WARNING(22, "template error:can't find code generation templates: group
+ */ MISSING_CODE_GEN_TEMPLATES(30, "can't find code generation templates:+ * ANTLR cannot generate 'language' code as of version + * version
+ */ CANNOT_CREATE_TARGET_GENERATOR(31, "ANTLR cannot generate '+ * code generation template 'template' has missing, misnamed, or + * incomplete arg list; missing 'field'
+ */ CODE_TEMPLATE_ARG_ISSUE(32, "code generation template 'missing code generation template 'template'
+ */ CODE_GEN_TEMPLATES_INCOMPLETE(33, "missing code generation template '+ * no mapping to template name for output model class 'class'
+ */ NO_MODEL_TO_TEMPLATE_MAPPING(34, "no mapping to template name for output model class 'syntax error: message
+ */ SYNTAX_ERROR(50, "syntax error:rule 'rule' redefinition; previous at line line
+ */ RULE_REDEFINITION(51, "rule 'lexer rule 'rule' not allowed in parser
+ */ LEXER_RULES_NOT_ALLOWED(52, "lexer rule 'parser rule 'rule' not allowed in lexer
+ */ PARSER_RULES_NOT_ALLOWED(53, "parser rule '+ * repeated grammar prequel spec ({@code options}, {@code tokens}, or + * {@code import}); please merge
+ */ + REPEATED_PREQUEL(54, "repeated grammar prequel spec (options, tokens, or import); please merge", ErrorSeverity.ERROR), + /** + * Compiler Error 56. + * + *reference to undefined rule: rule
+ */ UNDEFINED_RULE_REF(56, "reference to undefined rule:+ * reference to undefined rule 'rule' in non-local ref + * 'reference'
+ */ UNDEFINED_RULE_IN_NONLOCAL_REF(57, "reference to undefined rule 'token names must start with an uppercase letter: name
+ */ TOKEN_NAMES_MUST_START_UPPER(60, "token names must start with an uppercase letter:+ * unknown attribute reference 'attribute' in + * 'expression'
+ */ UNKNOWN_SIMPLE_ATTRIBUTE(63, "unknown attribute reference '+ * parameter 'parameter' of rule 'rule' is not accessible + * in this scope: expression
+ */ INVALID_RULE_PARAMETER_REF(64, "parameter '+ * unknown attribute 'attribute' for rule 'rule' in + * 'expression'
+ */ UNKNOWN_RULE_ATTRIBUTE(65, "unknown attribute '+ * attribute 'attribute' isn't a valid property in + * 'expression'
+ */ UNKNOWN_ATTRIBUTE_IN_SCOPE(66, "attribute '+ * missing attribute access on rule reference 'rule' in + * 'expression'
+ */ ISOLATED_RULE_REF(67, "missing attribute access on rule reference 'label 'label' conflicts with rule with same name
+ */ LABEL_CONFLICTS_WITH_RULE(69, "label 'label 'label' conflicts with token with same name
+ */ LABEL_CONFLICTS_WITH_TOKEN(70, "label 'label 'label' conflicts with parameter with same name
+ */ LABEL_CONFLICTS_WITH_ARG(72, "label 'label 'label' conflicts with return value with same name
+ */ LABEL_CONFLICTS_WITH_RETVAL(73, "label 'label 'label' conflicts with local with same name
+ */ LABEL_CONFLICTS_WITH_LOCAL(74, "label '+ * label 'label' type mismatch with previous definition: + * message
+ */ LABEL_TYPE_CONFLICT(75, "label '+ * return value 'name' conflicts with parameter with same name
+ */ RETVAL_CONFLICTS_WITH_ARG(76, "return value 'missing arguments(s) on rule reference: rule
+ */ MISSING_RULE_ARGS(79, "missing arguments(s) on rule reference:rule 'rule' has no defined parameters
+ */ RULE_HAS_NO_ARGS(80, "rule 'unsupported option 'option'
+ */ ILLEGAL_OPTION(83, "unsupported option 'unsupported option value 'name=value'
+ */ ILLEGAL_OPTION_VALUE(84, "unsupported option value 'redefinition of 'action' action
+ */ ACTION_REDEFINITION(94, "redefinition of 'This error may take any of the following forms.
+ * + *+ * reference to undefined grammar in rule reference: + * grammar.rule
+ */ NO_SUCH_GRAMMAR_SCOPE(105, "reference to undefined grammar in rule reference:rule 'rule' is not defined in grammar 'grammar'
+ */ NO_SUCH_RULE_IN_SCOPE(106, "rule 'token name 'Token' is already defined
+ */ TOKEN_NAME_REASSIGNMENT(108, "token name 'options ignored in imported grammar 'grammar'
+ */ OPTIONS_IN_DELEGATE(109, "options ignored in imported grammar '+ * can't find or load grammar 'grammar' from + * 'filename'
+ */ CANNOT_FIND_IMPORTED_GRAMMAR(110, "can't find or load grammar '+ * grammartype grammar 'grammar1' cannot import + * grammartype grammar 'grammar2'
+ */ INVALID_IMPORT(111, "+ * grammartype grammar 'grammar1' and imported + * grammartype grammar 'grammar2' both generate + * 'recognizer'
+ */ IMPORT_NAME_CLASH(113, "+ * all operators of alt 'alt' of left-recursive rule must have same + * associativity
+ */ ALL_OPS_NEED_SAME_ASSOC(118, "all operators of alt '+ * The following sets of rules are mutually left-recursive + * [rules]
+ */ LEFT_RECURSION_CYCLES(119, "The following sets of rules are mutually left-recursivelexical modes are only allowed in lexer grammars
+ */ MODE_NOT_IN_LEXER(120, "lexical modes are only allowed in lexer grammars", ErrorSeverity.ERROR), + /** + * Compiler Error 121. + * + *cannot find an attribute name in attribute declaration
+ */ CANNOT_FIND_ATTRIBUTE_NAME_IN_DECL(121, "cannot find an attribute name in attribute declaration", ErrorSeverity.ERROR), + /** + * Compiler Error 122. + * + *rule 'rule': must label all alternatives or none
+ */ RULE_WITH_TOO_FEW_ALT_LABELS(122, "rule '+ * rule alt label 'label' redefined in rule 'rule1', + * originally in rule 'rule2'
+ */ ALT_LABEL_REDEF(123, "rule alt label '+ * rule alt label 'label' conflicts with rule 'rule'
+ */ ALT_LABEL_CONFLICTS_WITH_RULE(124, "rule alt label 'implicit definition of token 'Token' in parser
+ */ IMPLICIT_TOKEN_DEFINITION(125, "implicit definition of token '+ * cannot create implicit token for string literal in non-combined grammar: + * literal
+ */ IMPLICIT_STRING_DEFINITION(126, "cannot create implicit token for string literal in non-combined grammar:+ * attribute references not allowed in lexer actions: + * expression
+ */ ATTRIBUTE_IN_LEXER_ACTION(128, "attribute references not allowed in lexer actions: $label 'label' assigned to a block which is not a set
+ */ LABEL_BLOCK_NOT_A_SET(130, "label 'This warning may take any of the following forms.
+ * + *+ * action in lexer rule 'rule' must be last element of single + * outermost alt
+ * + * @deprecated This error is no longer issued by ANTLR 4.2. + */ @Deprecated LEXER_ACTION_PLACEMENT_ISSUE(132, "action in lexer rule '+ * {@code ->command} in lexer rule 'rule' must be last element of + * single outermost alt
+ */ LEXER_COMMAND_PLACEMENT_ISSUE(133, "->command in lexer rule '+ * symbol 'symbol' conflicts with generated code in target language + * or runtime
+ * + *+ * Note: This error has the same number as the unrelated error + * {@link #UNSUPPORTED_REFERENCE_IN_LEXER_SET}.
+ */ USE_OF_BAD_WORD(134, "symbol 'rule reference 'rule' is not currently supported in a set
+ * + *+ * Note: This error has the same number as the unrelated error + * {@link #USE_OF_BAD_WORD}.
+ */ UNSUPPORTED_REFERENCE_IN_LEXER_SET(134, "rule reference 'cannot assign a value to list label 'label'
+ */ ASSIGNMENT_TO_LIST_LABEL(135, "cannot assign a value to list label 'return value 'name' conflicts with rule with same name
+ */ RETVAL_CONFLICTS_WITH_RULE(136, "return value 'return value 'name' conflicts with token with same name
+ */ RETVAL_CONFLICTS_WITH_TOKEN(137, "return value 'parameter 'parameter' conflicts with rule with same name
+ */ ARG_CONFLICTS_WITH_RULE(138, "parameter 'parameter 'parameter' conflicts with token with same name
+ */ ARG_CONFLICTS_WITH_TOKEN(139, "parameter 'local 'local' conflicts with rule with same name
+ */ LOCAL_CONFLICTS_WITH_RULE(140, "local 'local 'local' conflicts with rule token same name
+ */ LOCAL_CONFLICTS_WITH_TOKEN(141, "local 'local 'local' conflicts with parameter with same name
+ */ LOCAL_CONFLICTS_WITH_ARG(142, "local 'local 'local' conflicts with return value with same name
+ */ LOCAL_CONFLICTS_WITH_RETVAL(143, "local '+ * multi-character literals are not allowed in lexer sets: + * literal
+ */ INVALID_LITERAL_IN_LEXER_SET(144, "multi-character literals are not allowed in lexer sets:+ * lexer mode 'mode' must contain at least one non-fragment + * rule
+ * + *+ * Every lexer mode must contain at least one rule which is not declared + * with the {@code fragment} modifier.
+ */ MODE_WITHOUT_RULES(145, "lexer mode 'non-fragment lexer rule 'rule' can match the empty string
+ * + *All non-fragment lexer rules must match at least one character.
+ * + *The following example shows this error.
* ** Whitespace : [ \t]+; // ok @@ -145,10 +626,16 @@ public enum ErrorType { */ EPSILON_TOKEN(146, "non-fragment lexer rule '' can match the empty string", ErrorSeverity.WARNING), /** - * Left-recursive rules must contain at least one alternative which is not - * left recursive. - * - * The following rule produces this error. + * Compiler Error 147. + * + * + * left recursive rule 'rule' must contain an alternative which is + * not left recursive
+ * + *Left-recursive rules must contain at least one alternative which is not + * left recursive.
+ * + *The following rule produces this error.
* ** // error 147: @@ -159,10 +646,16 @@ public enum ErrorType { */ NO_NON_LR_ALTS(147, "left recursive rule '' must contain an alternative which is not left recursive", ErrorSeverity.ERROR), /** - * In left-recursive rules, all left-recursive alternatives must match at - * least one symbol following the recursive rule invocation. - * - * The following rule produces this error. + * Compiler Error 148. + * + * + * left recursive rule 'rule' contains a left recursive alternative + * which can be followed by the empty string
+ * + *In left-recursive rules, all left-recursive alternatives must match at + * least one symbol following the recursive rule invocation.
+ * + *The following rule produces this error.
* ** a : ID // ok (alternative is not left recursive) @@ -173,57 +666,89 @@ public enum ErrorType { */ EPSILON_LR_FOLLOW(148, "left recursive rule '' contains a left recursive alternative which can be followed by the empty string", ErrorSeverity.ERROR), /** - * Each lexer command requires an explicit implementation in the target + * Compiler Error 149. + * + * + * lexer command 'command' does not exist or is not supported by + * the current target
+ * + *Each lexer command requires an explicit implementation in the target * templates. This error indicates that the command was incorrectly written - * or is not supported by the current target. - *
- * The following rule produces this error. - * + * or is not supported by the current target. + * + *The following rule produces this error.
+ * ** X : 'foo' -> type(Foo); // ok * Y : 'foo' -> token(Foo); // error 149 (token is not a supported lexer command) *+ * + * @since 4.1 */ INVALID_LEXER_COMMAND(149, "lexer command '' does not exist or is not supported by the current target", ErrorSeverity.ERROR), /** - * Some lexer commands require an argument. - * - * The following rule produces this error. + * Compiler Error 150. + * + * missing argument for lexer command 'command'
+ * + *Some lexer commands require an argument.
+ * + *The following rule produces this error.
* ** X : 'foo' -> type(Foo); // ok * Y : 'foo' -> type; // error 150 (the type command requires an argument) *+ * + * @since 4.1 */ MISSING_LEXER_COMMAND_ARGUMENT(150, "missing argument for lexer command ''", ErrorSeverity.ERROR), /** - * A lexer command which does not take parameters was invoked with an - * argument. - * - * The following rule produces this error. + * Compiler Error 151. + * + * lexer command 'command' does not take any arguments
+ * + *A lexer command which does not take parameters was invoked with an + * argument.
+ * + *The following rule produces this error.
* ** X : 'foo' -> popMode; // ok * Y : 'foo' -> popMode(A); // error 151 (the popMode command does not take an argument) *+ * + * @since 4.1 */ UNWANTED_LEXER_COMMAND_ARGUMENT(151, "lexer command '' does not take any arguments", ErrorSeverity.ERROR), /** - * The parser contains an unterminated string literal. - * - * The following rule produces this error. + * Compiler Error 152. + * + * unterminated string literal
+ * + *The parser contains an unterminated string literal.
+ * + *The following rule produces this error.
* ** x : 'x'; // ok * y : 'y; // error 152 *+ * + * @since 4.1 */ UNTERMINATED_STRING_LITERAL(152, "unterminated string literal", ErrorSeverity.ERROR), /** - * A rule contains a closure ({@code (...)*}) or positive closure - * ({@code (...)+}) around an empty alternative. - * - * The following rule produces this error. + * Compiler Error 153. + * + *+ * rule 'rule' contains a closure with at least one alternative + * that can match an empty string
+ * + *A rule contains a closure ({@code (...)*}) or positive closure + * ({@code (...)+}) around an empty alternative.
+ * + *The following rule produces this error.
* ** x : ; @@ -231,13 +756,21 @@ public enum ErrorType { * z1 : ('foo' | 'bar'? 'bar2'?)*; // error 153 * z2 : ('foo' | 'bar' 'bar2'? | 'bar2')*; // ok *+ * + * @since 4.1 */ EPSILON_CLOSURE(153, "rule '' contains a closure with at least one alternative that can match an empty string", ErrorSeverity.ERROR), /** - * A rule contains an optional block ({@code (...)?}) around an empty - * alternative. - * - * The following rule produces this warning. + * Compiler Warning 154. + * + * + * rule 'rule' contains an optional block with at least one + * alternative that can match an empty string
+ * + *A rule contains an optional block ({@code (...)?}) around an empty + * alternative.
+ * + *The following rule produces this warning.
* ** x : ; @@ -245,16 +778,24 @@ public enum ErrorType { * z1 : ('foo' | 'bar'? 'bar2'?)?; // warning 154 * z2 : ('foo' | 'bar' 'bar2'? | 'bar2')?; // ok *+ * + * @since 4.1 */ EPSILON_OPTIONAL(154, "rule '' contains an optional block with at least one alternative that can match an empty string", ErrorSeverity.WARNING), /** - * A lexer rule contains a standard lexer command, but the constant value + * Compiler Warning 155. + * + * + * rule 'rule' contains a lexer command with an unrecognized + * constant value; lexer interpreters may produce incorrect output
+ * + *A lexer rule contains a standard lexer command, but the constant value * argument for the command is an unrecognized string. As a result, the * lexer command will be translated as a custom lexer action, preventing the * command from executing in some interpreted modes. The output of the lexer - * interpreter may not match the output of the generated lexer. - *
- * The following rule produces this warning. + * interpreter may not match the output of the generated lexer. + * + *The following rule produces this warning.
* ** @members { @@ -264,17 +805,102 @@ public enum ErrorType { * X : 'foo' -> channel(HIDDEN); // ok * Y : 'bar' -> channel(CUSTOM); // warning 155 *+ * + * @since 4.2 */ UNKNOWN_LEXER_CONSTANT(155, "rule '' contains a lexer command with an unrecognized constant value; lexer interpreters may produce incorrect output", ErrorSeverity.WARNING), - // Backward incompatibility errors + /* + * Backward incompatibility errors + */ + + /** + * Compiler Error 200. + * + * tree grammars are not supported in ANTLR 4
+ * + *+ * This error message is provided as a compatibility notice for users + * migrating from ANTLR 3. ANTLR 4 does not support tree grammars, but + * instead offers automatically generated parse tree listeners and visitors + * as a more maintainable alternative.
+ */ V3_TREE_GRAMMAR(200, "tree grammars are not supported in ANTLR 4", ErrorSeverity.ERROR), + /** + * Compiler Warning 201. + * + *+ * labels in lexer rules are not supported in ANTLR 4; actions cannot + * reference elements of lexical rules but you can use + * {@link Lexer#getText()} to get the entire text matched for the rule
+ * + *+ * ANTLR 4 uses a DFA for recognition of entire tokens, resulting in faster + * and smaller lexers than ANTLR 3 produced. As a result, sub-rules + * referenced within lexer rules are not tracked independently, and cannot + * be assigned to labels.
+ */ V3_LEXER_LABEL(201, "labels in lexer rules are not supported in ANTLR 4; " + "actions cannot reference elements of lexical rules but you can use " + "getText() to get the entire text matched for the rule", ErrorSeverity.WARNING), + /** + * Compiler Warning 202. + * + *+ * '{@code tokens {A; B;}}' syntax is now '{@code tokens {A, B}}' in ANTLR + * 4
+ * + *+ * ANTLR 4 uses comma-separated token declarations in the {@code tokens{}} + * block. This warning appears when the tokens block is written using the + * ANTLR 3 syntax of semicolon-terminated token declarations.
+ * + *+ * NOTE: ANTLR 4 does not allow a trailing comma to appear following the + * last token declared in the {@code tokens{}} block.
+ */ V3_TOKENS_SYNTAX(202, "'tokens {A; B;}' syntax is now 'tokens {A, B}' in ANTLR 4", ErrorSeverity.WARNING), + /** + * Compiler Error 203. + * + *+ * assignments in {@code tokens{}} are not supported in ANTLR 4; use lexical + * rule 'TokenName : LiteralValue;' instead
+ * + *+ * ANTLR 3 allowed literal tokens to be declared and assigned a value within + * the {@code tokens{}} block. ANTLR 4 no longer offers this syntax. When + * migrating a grammar from ANTLR 3 to ANTLR 4, any tokens with a literal + * value declared in the {@code tokens{}} block should be converted to + * standard lexer rules.
+ */ V3_ASSIGN_IN_TOKENS(203, "assignments in tokens{} are not supported in ANTLR 4; use lexical rule ': ;' instead", ErrorSeverity.ERROR), + /** + * Compiler Warning 204. + * + * + * {@code {...}?=>} explicitly gated semantic predicates are deprecated in + * ANTLR 4; use {@code {...}?} instead
+ * + *+ * ANTLR 4 treats semantic predicates consistently in a manner similar to + * gated semantic predicates in ANTLR 3. When migrating a grammar from ANTLR + * 3 to ANTLR 4, all uses of the gated semantic predicate syntax can be + * safely converted to the standard semantic predicated syntax, which is the + * only form used by ANTLR 4.
+ */ V3_GATED_SEMPRED(204, "{...}?=> explicitly gated semantic predicates are deprecated in ANTLR 4; use {...}? instead", ErrorSeverity.WARNING), + /** + * Compiler Error 205. + * + *{@code (...)=>} syntactic predicates are not supported in ANTLR 4
+ * + *+ * ANTLR 4's improved lookahead algorithms do not require the use of + * syntactic predicates to disambiguate long lookahead sequences. The + * syntactic predicates should be removed when migrating a grammar from + * ANTLR 3 to ANTLR 4.
+ */ V3_SYNPRED(205, "(...)=> syntactic predicates are not supported in ANTLR 4", ErrorSeverity.ERROR), // Dependency sorting errors @@ -283,10 +909,41 @@ public enum ErrorType { //CIRCULAR_DEPENDENCY(200, "your grammars contain a circular dependency and cannot be sorted into a valid build order", ErrorSeverity.ERROR), ; + /** + * The error or warning message, in StringTemplate 4 format using {@code <} + * and {@code >} as the delimiters. Arguments for the message may be + * referenced using the following names: + * + *+ *
+ */ public final String msg; - public final int code; // unique, deterministic unchanging error code once we release + /** + * The error or warning number. + * + *- {@code arg}: The first template argument
+ *- {@code arg2}: The second template argument
+ *- {@code arg3}: The third template argument
+ *- {@code verbose}: {@code true} if verbose messages were requested; otherwise, {@code false}
+ *- {@code exception}: The exception which resulted in the error, if any.
+ *- {@code stackTrace}: The stack trace for the exception, when available.
+ *The code should be unique, and following its + * use in a release should not be altered or reassigned.
+ */ + public final int code; + /** + * The error severity. + */ public final ErrorSeverity severity; + /** + * Constructs a new {@link ErrorType} with the specified code, message, and + * severity. + * + * @param code The unique error number. + * @param msg The error message template. + * @param severity The error severity. + */ ErrorType(int code, String msg, ErrorSeverity severity) { this.code = code; this.msg = msg;