```python
import re


def parse_option(segment: str) -> list:
    key, eq, raw = segment.partition("=")
    if not eq or re.fullmatch(r"[A-Za-z][A-Za-z0-9_]*", key) is None:
        raise ValueError("malformed option segment: " + segment)
    if len(raw) >= 2 and raw.startswith('"') and raw.endswith('"'):
        raw = raw[1:-1]
    return [key, raw]


def scan_pairs(text: str) -> list:
    if not isinstance(text, str):
        raise ValueError("input must be a string")
    if text == "":
        return []
    
    pairs = {}
    in_quotes = False
    segment_start = 0
    
    for i, char in enumerate(text):
        if char == '"':
            in_quotes = not in_quotes
        elif char == ';' and not in_quotes:
            segment = text[segment_start:i].strip()
            if "=" not in segment or not re.fullmatch(r"[A-Za-z][A-Za-z0-9_]*", segment.split("=")[0]):
                raise ValueError("malformed option segment: " + segment)
            key, value = parse_option(segment)
            if key in pairs:
                raise ValueError(f"repeated key: {key}")
            pairs[key] = value
            segment_start = i + 1
    
    segment = text[segment_start:].strip()
    if "=" not in segment or not re.fullmatch(r"[A-Za-z][A-Za-z0-9_]*", segment.split("=")[0]):
        raise ValueError("malformed option segment: " + segment)
    key, value = parse_option(segment)
    if key in pairs:
        raise ValueError(f"repeated key: {key}")
    pairs[key] = value
    
    return list(pairs.items())
```