Ast diagram

classDiagram

    class Option {
        expr: Expression
    }

    class Literal {
        value: str
    }

    class Expression {
        terms: list[Term]
        paren: bool = False
    }

    class Identifier {
        value: str
    }

    class Syntax {
        production: list[Production]
    }

    class Node {
    }

    class Repetition {
        expr: Expression
    }

    class Production {
        identifier: Identifier
        expression: Expression
    }

    class Term {
        factors: list[Factor]
    }

    class Factor {
    }

    Term ..> Factor
    Expression ..> Term
    Option ..> Expression
    Repetition ..> Expression
    Production ..> Expression
    Production ..> Identifier
    Syntax ..> Production

    Node <|-- Production
    Node <|-- Syntax
    Node <|-- Term
    Node <|-- Factor
    Factor <|-- Option
    Factor <|-- Literal
    Factor <|-- Expression
    Factor <|-- Identifier
    Factor <|-- Repetition