{"record":{"id":"ee5190401a83cfbb","repo":"antlr/antlr4","slug":"unterminated-tag-in-pattern-pattern","errorCode":null,"errorMessage":"unterminated tag in pattern: \"+pattern","messagePattern":"unterminated 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":444,"sourceCode":"\t\t\t}\n\t\t\telse if ( p == pattern.indexOf(start,p) ) {\n\t\t\t\tstarts.add(p);\n\t\t\t\tp += start.length();\n\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}","sourceCodeStart":426,"sourceCodeEnd":462,"githubUrl":"https://github.com/antlr/antlr4/blob/7d5770395bb7b02eb56e7c62662cb1d7c08f42a3/runtime/Java/src/org/antlr/v4/runtime/tree/pattern/ParseTreePatternMatcher.java#L426-L462","documentation":"Error \"unterminated tag in pattern: \"+pattern\" thrown in antlr/antlr4.","triggerScenarios":"Pattern contains a start tag delimiter with no matching stop delimiter.","commonSituations":"Balance every start delimiter with a stop delimiter in the pattern string; escape literal delimiters if needed.","solutions":["Close every tag with the stop delimiter; scan the pattern for a '<' without a matching '>'.","If your pattern literally needs the start delimiter character, pick different delimiters with setDelimiters."],"exampleFix":"// fix \"<expr\" to \"<expr>\"\nParseTreePattern p = matcher.compile(\"<expr> + <expr>\", MyParser.RULE_add);","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-15T17:31:12.345Z"}