{"record":{"id":"4485f51ca573de57","repo":"antlr/antlr4","slug":"unknown-rule-tagchunk-gettag-in-pattern-p","errorCode":null,"errorMessage":"Unknown rule \"+tagChunk.getTag()+\" in pattern: \"+pattern","messagePattern":"Unknown rule \"\\+tagChunk\\.getTag\\(\\)\\+\" in pattern: \"\\+pattern","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"runtime/Java/src/org/antlr/v4/runtime/tree/pattern/ParseTreePatternMatcher.java","lineNumber":386,"sourceCode":"\n\t\t// create token stream from text and tags\n\t\tList<Token> tokens = new ArrayList<Token>();\n\t\tfor (Chunk chunk : chunks) {\n\t\t\tif ( chunk instanceof TagChunk ) {\n\t\t\t\tTagChunk tagChunk = (TagChunk)chunk;\n\t\t\t\t// add special rule token or conjure up new token from name\n\t\t\t\tif ( Character.isUpperCase(tagChunk.getTag().charAt(0)) ) {\n\t\t\t\t\tInteger ttype = parser.getTokenType(tagChunk.getTag());\n\t\t\t\t\tif ( ttype==Token.INVALID_TYPE ) {\n\t\t\t\t\t\tthrow new IllegalArgumentException(\"Unknown token \"+tagChunk.getTag()+\" in pattern: \"+pattern);\n\t\t\t\t\t}\n\t\t\t\t\tTokenTagToken t = new TokenTagToken(tagChunk.getTag(), ttype, tagChunk.getLabel());\n\t\t\t\t\ttokens.add(t);\n\t\t\t\t}\n\t\t\t\telse if ( Character.isLowerCase(tagChunk.getTag().charAt(0)) ) {\n\t\t\t\t\tint ruleIndex = parser.getRuleIndex(tagChunk.getTag());\n\t\t\t\t\tif ( ruleIndex==-1 ) {\n\t\t\t\t\t\tthrow new IllegalArgumentException(\"Unknown rule \"+tagChunk.getTag()+\" in pattern: \"+pattern);\n\t\t\t\t\t}\n\t\t\t\t\tint ruleImaginaryTokenType = parser.getATNWithBypassAlts().ruleToTokenType[ruleIndex];\n\t\t\t\t\ttokens.add(new RuleTagToken(tagChunk.getTag(), ruleImaginaryTokenType, tagChunk.getLabel()));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow new IllegalArgumentException(\"invalid tag: \"+tagChunk.getTag()+\" in pattern: \"+pattern);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tTextChunk textChunk = (TextChunk)chunk;\n\t\t\t\tANTLRInputStream in = new ANTLRInputStream(textChunk.getText());\n\t\t\t\tlexer.setInputStream(in);\n\t\t\t\tToken t = lexer.nextToken();\n\t\t\t\twhile ( t.getType()!=Token.EOF ) {\n\t\t\t\t\ttokens.add(t);\n\t\t\t\t\tt = lexer.nextToken();\n\t\t\t\t}\n\t\t\t}","sourceCodeStart":368,"sourceCodeEnd":404,"githubUrl":"https://github.com/antlr/antlr4/blob/7d5770395bb7b02eb56e7c62662cb1d7c08f42a3/runtime/Java/src/org/antlr/v4/runtime/tree/pattern/ParseTreePatternMatcher.java#L368-L404","documentation":"Error \"Unknown rule \"+tagChunk.getTag()+\" in pattern: \"+pattern\" thrown in antlr/antlr4.","triggerScenarios":"A <tag> in a pattern refers to a rule name not defined in the parser grammar.","commonSituations":"Check the tag against the parser's rule names; rule tags must be valid rule references or label:rule forms.","solutions":["Use a rule name that exists in the target grammar inside the tag.","Rule tags must match the parser rule name exactly (lowercase by convention), e.g. <expr>, and the rule must exist in the grammar the matcher was built for."],"exampleFix":"ParseTreePattern p = matcher.compile(\"foo(<arg>)\", MyParser.RULE_call);","handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"7d5770395bb7b02eb56e7c62662cb1d7c08f42a3","analyzedAt":"2026-08-14T14:47:56.354Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}