CODE-0002 · gpt-5.6-luna (high)
import re

def parse_semver(s):
    if not isinstance(s, str):
        return None

    match = re.fullmatch(
        r"(0|[1-9][0-9]*)\."
        r"(0|[1-9][0-9]*)\."
        r"(0|[1-9][0-9]*)"
        r"(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?"
        r"(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?",
        s,
    )
    if match is None:
        return None

    prerelease = match.group(4)
    if prerelease is not None:
        for identifier in prerelease.split("."):
            if identifier.isdigit() and len(identifier) > 1 and identifier[0] == "0":
                return None

    values = []
    for part in match.group(1, 2, 3):
        value = 0
        for digit in part:
            value = value * 10 + ord(digit) - ord("0")
        values.append(value)

    return {
        "major": values[0],
        "minor": values[1],
        "patch": values[2],
        "prerelease": prerelease,
        "build": match.group(5),
    }