用于累积逗号分隔值列表的PLY YACC python语法

2024-04-18 23:48:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我第一次使用YACC,并且已经习惯了使用BNF语法。在

我目前正在从一个逗号分隔的列表(例如intfloatstring)构建list

def p_type(p):
    '''type : primitive_type
            | array
            | generic_type
            | ID'''
    p[0] = p[1]


def p_type_list(p):
    '''type_list : type
                 | type COMMA type_list'''
    if not isinstance(p[0], list):
        p[0] = list()
    p[0].append(p[1])
    if len(p) == 4:
        p[0] += p[3]

规则是可行的,但是我感觉到我的p_type_list逻辑有点混乱,可以简化为一行代码。在

我在网上没有找到任何具体的例子。任何帮助将不胜感激!在


Tags: 列表stringifdeftype语法floatarray
2条回答

或者“简化”p_type_list到(你减少了1行代码,不确定是否值得):

def p_type_list(p):
    '''type_list : type
                 | type_list COMMA type'''
    if len(p) == 2:
       p[0] = [p[1]]
    else:
       p[0] = p[1] + [p[3]]

有两个产品。使用两个单独的函数。(无额外费用:-)

def p_type_list_1(p):
    '''type_list : type'''
    p[0] = [p[1]]

def p_type_list_2(p):
    '''type_list : type_list COMMA type'''
    p[0] = p[1] + [p[3]]

注意:我修正了你的语法使用左递归。对于自底向上的解析,左递归几乎总是您想要的,因为它避免了不必要的解析器堆栈使用,更重要的是它常常简化操作。在这种情况下,我可以将第二个函数写成:

^{pr2}$

这样可以避免列表复制。在

相关问题 更多 >