{"record":{"id":"0cc823e5f0f5468a","repo":"antlr/antlr4","slug":"missing-start-tag-in-pattern-pattern","errorCode":null,"errorMessage":"missing start tag in pattern: \"+pattern","messagePattern":"missing start tag in pattern: \"\\+pattern","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"runtime/Java/src/org/antlr/v4/runtime/tree/pattern/ParseTreePatternMatcher.java","lineNumber":448,"sourceCode":"\t\t\t}\n\t\t\telse if ( p == pattern.indexOf(stop,p) ) {\n\t\t\t\tstops.add(p);\n\t\t\t\tp += stop.length();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tp++;\n\t\t\t}\n\t\t}\n\n//\t\tSystem.out.println(\"\");\n//\t\tSystem.out.println(starts);\n//\t\tSystem.out.println(stops);\n\t\tif ( starts.size() > stops.size() ) {\n\t\t\tthrow new IllegalArgumentException(\"unterminated tag in pattern: \"+pattern);\n\t\t}\n\n\t\tif ( starts.size() < stops.size() ) {\n\t\t\tthrow new IllegalArgumentException(\"missing start tag in pattern: \"+pattern);\n\t\t}\n\n\t\tint ntags = starts.size();\n\t\tfor (int i=0; i<ntags; i++) {\n\t\t\tif ( starts.get(i)>=stops.get(i) ) {\n\t\t\t\tthrow new IllegalArgumentException(\"tag delimiters out of order in pattern: \"+pattern);\n\t\t\t}\n\t\t}\n\n\t\t// collect into chunks now\n\t\tif ( ntags==0 ) {\n\t\t\tString text = pattern.substring(0, n);\n\t\t\tchunks.add(new TextChunk(text));\n\t\t}\n\n\t\tif ( ntags>0 && starts.get(0)>0 ) { // copy text up to first tag into chunks\n\t\t\tString text = pattern.substring(0, starts.get(0));\n\t\t\tchunks.add(new TextChunk(text));","sourceCodeStart":430,"sourceCodeEnd":466,"githubUrl":"https://github.com/antlr/antlr4/blob/7d5770395bb7b02eb56e7c62662cb1d7c08f42a3/runtime/Java/src/org/antlr/v4/runtime/tree/pattern/ParseTreePatternMatcher.java#L430-L466","documentation":"Error \"missing start tag in pattern: \"+pattern\" thrown in antlr/antlr4.","triggerScenarios":"Pattern contains a stop tag delimiter with no preceding start delimiter.","commonSituations":"Ensure stop delimiters only appear after a matching start delimiter in the pattern.","solutions":["Every stop delimiter must be preceded by a start delimiter; remove the stray stop delimiter or open a tag first.","If the character is literal text, change delimiters with setDelimiters to characters not used in the pattern."],"exampleFix":"matcher.setDelimiters(\"<<\", \">>\", \"$\");\nParseTreePattern p = matcher.compile(\"a > b\", MyParser.RULE_rel);","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"}