我正在尝试找出为'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”的内容?