我第一次使用YACC并习惯使用BNF语法.
我目前正在建设list
的type
从一个逗号分隔的列表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特定的例子.任何帮助将不胜感激!
有两个制作.使用两个单独的功能.(没有额外费用:-))
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]]
这避免了列表副本.