所以我在Ply上编写一个识别基本C语句的语法,例如变量声明或while语句。现在,我想要做的是能够连接所有令牌然后打印它或让它在树上传播,如下所示:
def p_whileStmt(p):
'''whileStmt : WHILE '(' condition ')' '{' stmt '}' '''
p[0] += p[1] + p[2] + p[3] + p[4] + p[5] + p[6] + p[7]
是否有更好的方法来连接所有令牌(我只需要字符值,我只需要构建一个字符串)而不是我使用的那个?
编辑:在某些情况下,我需要连接除少数之外的所有令牌,例如:
def p_whileStmt(p):
'''whileStmt : WHILE '(' condition ')' '{' stmt '}' '''
p[0] += p[1] + p[3] + p[5]
答案 0 :(得分:3)
您可以使用
来避免+=
p[0] = ''.join(p)
对p[0] += p[1]+p[3]+p[5]
你可以做
p[0] += ''.join(p[1::2])
答案 1 :(得分:2)
在python中,当你有一个字符串列表时,你通常想要使用str.join
,这既简单又高效。在这里,您需要以下内容:
p[0] += ''.join( p[1:] )
假设p [0]已经是一个字符串。
如果你需要连接特定的令牌,你的做法很好。将ply
中的每个标记放在p中,这有点愚蠢的设计,但重点是非常接近yacc的行为。