我第一次使用YACC并习惯使用BNF语法。
我目前正在以逗号分隔列表(例如list
,type
,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特定的例子。任何帮助将不胜感激!
答案 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