Сгиб и большие определения грамматики - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь найти лучший способ определить это более широкое определение грамматики для 'select_clause' select_clause = SELECT ( ALL | DISTINCT )? ( <star> | ( <select sublist> ( <comma> <select sublist> )* ) )

Вот что я придумал для другого определения грамматики, называемого 'id_part':

# id_part = ("@" | "#" | <letter>) (<letter> | "_" | <digit>)*
def p_id_part(p):
    """
    id_part : AT
            | POUND
            | LETTER
            | AT id_end
            | POUND id_end
            | LETTER id_end
    """
    if len(p) == 3:
        p[0] = p[2]
    else:
        p[0] = p[1]


def p_id_end(p):
    """
    id_end : LETTER id_end
           | USCORE id_end
           | DIGIT id_end
           | LETTER
           | USCORE
           | DIGIT
    """
    if len(p) == 3:
        p[0] = p[2]
    else:
        p[0] = p[1]

Вот что я думаю о 'select_clause':

# select_clause = SELECT ( ALL | DISTINCT )? ( <star> | ( <select sublist> ( <comma> <select sublist> )* ) )
def p_select_clause(p):
    """
    select_clause : SELECT ad_term STAR
                  | SELECT ad_term end_term
    end_term : select_sublist
             | select_sublist comma_term
    comma_term : COMMA select_sublist comma_term
               | empty
    ad_term : ALL
            | DISTINCT
            | empty
    """

Есть ли лучший способ сделать это правило грамматики для 'select_clause'? Можете ли вы определить такие вещи, как «*» или «?» внутри определения в Ply? Я не смог найти ничего об этом на его странице (https://www.dabeaz.com/ply/ply.html#ply_nn26b). Если это правильный способ сделать это, как бы я определил, что назначить для 'p'?

...