{"record":{"id":"968e023e0ba012e7","repo":"antlr/antlr4","slug":"missing-start-tag-in-pattern-s","errorCode":null,"errorMessage":"missing start tag in pattern: %s","messagePattern":"missing start tag in pattern: (.+?)","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"runtime/Python3/src/antlr4/tree/ParseTreePatternMatcher.py","lineNumber":332,"sourceCode":"            if p == pattern.find(self.escape + self.start, p):\n                p += len(self.escape) + len(self.start)\n            elif p == pattern.find(self.escape + self.stop, p):\n                p += len(self.escape) + len(self.stop)\n            elif p == pattern.find(self.start, p):\n                starts.append(p)\n                p += len(self.start)\n            elif p == pattern.find(self.stop, p):\n                stops.append(p)\n                p += len(self.stop)\n            else:\n                p += 1\n\n        nt = len(starts)\n\n        if nt > len(stops):\n            raise Exception(\"unterminated tag in pattern: \" + pattern)\n        if nt < len(stops):\n            raise Exception(\"missing start tag in pattern: \" + pattern)\n\n        for i in range(0, nt):\n            if starts[i] >= stops[i]:\n                raise Exception(\"tag delimiters out of order in pattern: \" + pattern)\n\n        # collect into chunks now\n        if nt==0:\n            chunks.append(TextChunk(pattern))\n\n        if nt>0 and starts[0]>0: # copy text up to first tag into chunks\n            text = pattern[0:starts[0]]\n            chunks.add(TextChunk(text))\n\n        for i in range(0, nt):\n            # copy inside of <tag>\n            tag = pattern[starts[i] + len(self.start) : stops[i]]\n            ruleOrToken = tag\n            label = None","sourceCodeStart":314,"sourceCodeEnd":350,"githubUrl":"https://github.com/antlr/antlr4/blob/7d5770395bb7b02eb56e7c62662cb1d7c08f42a3/runtime/Python3/src/antlr4/tree/ParseTreePatternMatcher.py#L314-L350","documentation":"Raised by ParseTreePatternMatcher.split() when the pattern contains more stop delimiters than start delimiters, i.e. a '>' appears with no opening '<'. The chunker requires balanced, paired delimiters.","triggerScenarios":"Compiling a pattern like 'ID > 42' or 'a > <ID>' where a stray '>' appears before or outside any tag.","commonSituations":"Matching source text that contains '>' (comparisons, closing brackets, generics) without escaping it.","solutions":["Escape literal '>' characters in the pattern with the escape sequence","Remove or pair the stray stop delimiter","Consider different delimiters via setDelimiters when the target language is full of angle brackets"],"exampleFix":"# before\npattern = parser.compilePattern('<ID> > 3', 0)\n\n# after\npattern = parser.compilePattern('<ID> \\\\> 3', 0)","handlingStrategy":"validation","validationCode":"if pattern.count(matcher.start) < pattern.count(matcher.stop):\n    raise ValueError('missing start tag in pattern')","typeGuard":null,"tryCatchPattern":"try:\n    p = matcher.compileTreePattern(pat, idx)\nexcept Exception as e:\n    if 'missing start tag' in str(e):\n        # remove or escape stray '>'\n        ...","preventionTips":["Escape literal '>' characters","Validate delimiter balance before compiling"],"tags":["antlr","python","parse-tree-matching","pattern-compile"],"backgroundTag":null,"analyzedSha":"7d5770395bb7b02eb56e7c62662cb1d7c08f42a3","analyzedAt":"2026-08-14T14:47:56.354Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}