{"record":{"id":"2efa06c68ca65645","repo":"antlr/antlr4","slug":"tag-delimiters-out-of-order-in-pattern-pattern","errorCode":null,"errorMessage":"tag delimiters out of order in pattern: \"+pattern","messagePattern":"tag delimiters out of order in pattern: \"\\+pattern","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"runtime/Java/src/org/antlr/v4/runtime/tree/pattern/ParseTreePatternMatcher.java","lineNumber":454,"sourceCode":"\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));\n\t\t}\n\t\tfor (int i=0; i<ntags; i++) {\n\t\t\t// copy inside of <tag>\n\t\t\tString tag = pattern.substring(starts.get(i) + start.length(), stops.get(i));\n\t\t\tString ruleOrToken = tag;\n\t\t\tString label = null;","sourceCodeStart":436,"sourceCodeEnd":472,"githubUrl":"https://github.com/antlr/antlr4/blob/7d5770395bb7b02eb56e7c62662cb1d7c08f42a3/runtime/Java/src/org/antlr/v4/runtime/tree/pattern/ParseTreePatternMatcher.java#L436-L472","documentation":"Error \"tag delimiters out of order in pattern: \"+pattern\" thrown in antlr/antlr4.","triggerScenarios":"Start delimiter of a tag appears after its stop delimiter in the pattern.","commonSituations":"Order delimiters correctly (start before stop); do not swap the configured start/stop strings.","solutions":["Make sure the start delimiter appears before the stop delimiter in each tag; reorder the pattern text.","Check for typos like 'expr>' instead of '<expr>'."],"exampleFix":"ParseTreePattern p = matcher.compile(\"<expr>\", MyParser.RULE_expr);","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"}