Я пытаюсь найти лучший способ определить это более широкое определение грамматики для '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'?