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

时间:2015-12-24 00:26:53

标签: python yacc ply

我第一次使用YACC并习惯使用BNF语法。

我目前正在以逗号分隔列表(例如listtypeint)构建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逻辑有点像kludge,可以简化为单行。

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

2 个答案:

答案 0 :(得分:6)

有两部作品。使用两个单独的功能。 (没有额外费用:-))

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

避免列表副本。

答案 1 :(得分:2)

或“简化”h2至(减少1行代码,不确定是否值得):

h1