code: def p_boolean_expr(self, p):
          '''boolean_expr : expr AND expr
                          | expr AMPERSAND expr
                          | expr OR expr
                          | expr IMPLY expr
                          | expr EQUIV expr
                          | NOT expr %prec UMINUS
                          | bool_type'''
          if len(p) == 4:
              p[0] = (p[2], (p[1], p[3]))
          elif len(p) == 3:
              p[0] = (p[1], (p[2],))
          elif len(p) == 2:
              p[0] = ('boolean', p[1]f p_boolean_expr(self, p):
          '''boolean_expr : expr AND expr
                          | expr AMPERSAND expr
                          | expr OR expr
                          | expr IMPLY expr
                          | expr EQUIV expr
                          | NOT expr %prec UMINUS
                          | bool_type'''
          if len(p) == 4:
              p[0] = (p[2], (p[1], p[3]))
          elif len(p) == 3:
              p[0] = (p[1], (p[2],))
          elif len(p) == 2:
              p[0] = ('boolean', p[1])
docs: boolean_expr : expr AND expr
                          | expr AMPERSAND expr
                          | expr OR expr
                          | expr IMPLY expr
                          | expr EQUIV expr
                          | NOT expr %prec UMINUS
                          | bool_type