code: def stringToExpression(s, types, context):
      
      old_ctx = expressions._context.get_current_context()
      try:
          expressions._context.set_new_context(context)
          # first compile to a code object to determine the names
          if context.get('truediv', False):
              flags = __future__.division.compiler_flag
          else:
              flags = 0
          c = compile(s, '<expr>', 'eval', flags)
          # make VariableNode's for the names
          names = {}
          for name in c.co_names:
              if name == "None":
                  names[name] = None
              elif name == "True":
                  names[name] = True
              elif name == "False":
                  names[name] = False
              else:
                  t = types.get(name, default_type)
                  names[name] = expressions.VariableNode(name, type_to_kind[t])
          names.update(expressions.functions)
          # now build the expression
          ex = eval(c, names)
          if expressions.isConstant(ex):
              ex = expressions.ConstantNode(ex, expressions.getKind(ex))
          elif not isinstance(ex, expressions.ExpressionNode):
              raise TypeError("unsupported expression type: %s" % type(ex))
      finally:
          expressions._context.set_new_context(old_ctx)
      return ex
docs: Given a string, convert it to a tree of ExpressionNode's.