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

PLY YACC pythonic syntax for accumulating list of comma-separated values

第一次使用YACC,正在习惯使用BNF文法

我目前正在构建一个 list of types 从一个逗号分隔的列表(例如 int, float, string):

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 逻辑有点乱七八糟,可以简化为一行。

我还没有在网上找到任何 PLY 的特定示例。任何帮助将不胜感激!

有两部作品。使用两个独立的函数。 (没有额外费用:-))

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]]

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

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

这避免了列表复制。

或"simplify" 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]]