当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《PLYYACCpythonic语法用于累积逗号分隔值列表》经验,为你挑选了1个好方法。

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

我目前正在建设listtype从一个逗号分隔的列表S(如: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逻辑有点像kludge,可以简化为单行.

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



1> rici..:

有两个制作.使用两个单独的功能.(没有额外费用:-))

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

这避免了列表副本.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有