这个问题通常是由于定义规则时缺少匹配括号或操作符的原因导致的。在使用 PLY Yacc 时,应该确保在语法规则中正确地包含所有所需的符号以及正确使用优先级。
以下例子显示了一个错误的规则,其中缺少一个右括号,导致变量的值无法更新:
def p_expression_binop(p):
'''
expression : expression PLUS expression MINUS
'''
p[0] = p[1] + p[3]
应该将其改为以下正确的规则,正确地考虑了运算符优先级:
def p_expression_binop(p):
'''
expression : expression PLUS expression
| expression MINUS expression
'''
if p[2] == '+':
p[0] = p[1] + p[3]
elif p[2] == '-':
p[0] = p[1] - p[3]
这样,变量将能成功更新其值。