用于累积逗号分隔值列表的 PLY YACC pythonic 语法
PLY YACC pythonic syntax for accumulating list of comma-separated values
第一次使用YACC,正在习惯使用BNF文法
我目前正在构建一个 list
of 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
逻辑有点乱七八糟,可以简化为一行。
我还没有在网上找到任何 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]]
第一次使用YACC,正在习惯使用BNF文法
我目前正在构建一个 list
of 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
逻辑有点乱七八糟,可以简化为一行。
我还没有在网上找到任何 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]]