语法和较大的语法定义

时间:2019-01-15 16:12:23

标签: python yacc ply

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

0 个答案:

没有答案